def delete_account(account_id, token_info): validate_admin_access(token_info) with Transaction() as t: acct_repo = AccountRepo(t) src_repo = SourceRepo(t) samp_repo = SampleRepo(t) sar_repo = SurveyAnswersRepo(t) acct = acct_repo.get_account(account_id) if acct is None: return jsonify(message="Account not found", code=404), 404 else: # the account is already scrubbed so let's stop early if acct.account_type == 'deleted': return None, 204 sample_count = 0 sources = src_repo.get_sources_in_account(account_id) for source in sources: samples = samp_repo.get_samples_by_source(account_id, source.id) has_samples = len(samples) > 0 sample_count += len(samples) for sample in samples: # we scrub rather than disassociate in the event that the # sample is in our freezers but not with an up-to-date scan samp_repo.scrub(account_id, source.id, sample.id) surveys = sar_repo.list_answered_surveys(account_id, source.id) if has_samples: # if we have samples, we need to scrub survey / source # free text for survey_id in surveys: sar_repo.scrub(account_id, source.id, survey_id) src_repo.scrub(account_id, source.id) else: # if we do not have associated samples, then the source # is safe to delete for survey_id in surveys: sar_repo.delete_answered_survey(account_id, survey_id) src_repo.delete_source(account_id, source.id) # an account is safe to delete if there are no associated samples if sample_count > 0: acct_repo.scrub(account_id) else: acct_repo.delete_account(account_id) t.commit() return None, 204
def test_scrub(self): with Transaction() as t: ar = AccountRepo(t) ar.scrub(ACCOUNT_ID) obs = ar.get_account(ACCOUNT_ID) self.assertEqual(obs.id, self.untouched.id) self.assertNotEqual(obs.email, self.untouched.email) self.assertEqual(obs.account_type, 'deleted') self.assertEqual(obs.auth_issuer, None) self.assertEqual(obs.auth_sub, None) self.assertEqual(obs.first_name, 'scrubbed') self.assertEqual(obs.last_name, 'scrubbed') self.assertEqual(obs.address.street, 'scrubbed') self.assertEqual(obs.address.city, 'scrubbed') self.assertEqual(obs.address.state, 'NA') self.assertEqual(obs.address.post_code, 'scrubbed') # keeping country is reasonable as it's so broad self.assertEqual(obs.address.country_code, self.untouched.address.country_code) self.assertEqual(obs.created_with_kit_id, self.untouched.created_with_kit_id) self.assertEqual(obs.creation_time, self.untouched.creation_time) self.assertNotEqual(obs.update_time, self.untouched.update_time) self.assertEqual(obs.language, self.untouched.language) email = obs.email date, remainder = email.split('@', 1) date = date.split('T')[0].strip('"') obs_date = datetime.datetime.strptime(date, "%Y-%m-%d") today = datetime.datetime.now() today = datetime.datetime(year=today.year, month=today.month, day=today.day) self.assertEqual(obs_date, today) self.assertEqual(remainder, 'microsetta.ucsd.edu')
def test_scrub_no_account(self): with Transaction() as t: ar = AccountRepo(t) with self.assertRaises(RepoException): ar.scrub(BAD_ACCOUNT_ID)