def per_sample(project, barcodes, strip_sampleid): summaries = [] with Transaction() as t: admin_repo = AdminRepo(t) sample_repo = SampleRepo(t) template_repo = SurveyTemplateRepo(t) vs_repo = VioscreenSessionRepo(t) if project is not None: project_barcodes = admin_repo.get_project_barcodes(project) else: project = 'Unspecified' if barcodes is None: barcodes = project_barcodes for barcode in barcodes: diag = admin_repo.retrieve_diagnostics_by_barcode(barcode) if diag is None: raise NotFound(f"Barcode not found: {barcode}") sample = diag['sample'] account = diag['account'] source = diag['source'] account_email = None if account is None else account.email source_email = None source_type = None if source is None else source.source_type vio_id = None if source is not None and source_type == Source.SOURCE_TYPE_HUMAN: source_email = source.source_data.email vio_id = template_repo.get_vioscreen_id_if_exists(account.id, source.id, sample.id) # at least one sample has been observed that "is_microsetta", # described in the barcodes.project_barcode table, but which is # unexpectedly not present in ag.ag_kit_barcodes if sample is None: sample_status = None sample_site = None ffq_complete = None ffq_taken = None else: sample_status = sample_repo.get_sample_status( sample.barcode, sample._latest_scan_timestamp ) sample_site = sample.site ffq_complete, ffq_taken, _ = vs_repo.get_ffq_status_by_sample( sample.id ) summary = { "sampleid": None if strip_sampleid else barcode, "project": project, "source-type": source_type, "site-sampled": sample_site, "source-email": source_email, "account-email": account_email, "vioscreen_username": vio_id, "ffq-taken": ffq_taken, "ffq-complete": ffq_complete, "sample-status": sample_status, "sample-received": sample_status is not None } for status in ["sample-is-valid", "no-associated-source", "no-registered-account", "no-collection-info", "sample-has-inconsistencies", "received-unknown-validity"]: summary[status] = sample_status == status summaries.append(summary) return summaries
def query_email_stats(body, token_info): validate_admin_access(token_info) email_list = body.get("emails", []) project = body.get("project") results = [] with Transaction() as t: account_repo = AccountRepo(t) kit_repo = KitRepo(t) source_repo = SourceRepo(t) sample_repo = SampleRepo(t) for email in email_list: result = {'email': email, 'project': project} results.append(result) # can use internal lookup by email, because we have admin access account = account_repo._find_account_by_email(email) # noqa if account is None: result['summary'] = "No Account" continue else: result['account_id'] = account.id result['creation_time'] = account.creation_time result['kit_name'] = account.created_with_kit_id if account.created_with_kit_id is not None: unused = kit_repo.get_kit_unused_samples( account.created_with_kit_id ) if unused is None: result['unclaimed-samples-in-kit'] = 0 else: result['unclaimed-samples-in-kit'] = len(unused.samples) sample_statuses = defaultdict(int) sources = source_repo.get_sources_in_account(account.id) samples_in_project = 0 for source in sources: samples = sample_repo.get_samples_by_source(account.id, source.id) for sample in samples: if project is not None and \ project != "" and \ project not in sample.sample_projects: continue samples_in_project += 1 sample_status = sample_repo.get_sample_status( sample.barcode, sample._latest_scan_timestamp # noqa ) if sample_status is None: sample_status = "never-scanned" sample_statuses[sample_status] += 1 result.update(sample_statuses) if result.get('unclaimed-samples-in-kit', 0) > 0: result['summary'] = 'Possible Unreturned Samples' elif samples_in_project == 0: result['summary'] = "No Samples In Specified Project" elif result.get('sample-is-valid') == samples_in_project: result['summary'] = 'All Samples Valid' else: result['summary'] = 'May Require User Interaction' return jsonify(results), 200