def test_render_delivery_report(report_api): # GIVEN proper qc data from an analysis exist report_data = report_api._get_delivery_data(case_id="yellowhog") # WHEN rendering a report from that data rendered_report = ReportAPI._render_delivery_report(report_data) # THEN a html report with certain data should have been rendered assert len(rendered_report) > 0
def test_create_delivery_report_file(report_api: ReportAPI): # GIVEN initialized ReportAPI # WHEN rendering a report from that data created_report_file = report_api.create_delivery_report_file( case_id="yellowhog", file_path=Path(".")) # THEN a html report with certain data should have been created on disk assert os.path.isfile(created_report_file.name) os.unlink(created_report_file.name)
def test_render_delivery_report(report_store, report_api): # GIVEN proper qc data from an analysis exist case_id = "yellowhog" case = report_store.family(case_id) report_data = report_api._get_delivery_data( case_id=case_id, analysis_date=case.analyses[0].started_at) # WHEN rendering a report from that data rendered_report = ReportAPI._render_delivery_report(report_data) # THEN a html report with certain data should have been rendered assert len(rendered_report) > 0
def test_render_non_accredited_delivery_report(report_api): # GIVEN proper qc data from an analysis exist with non accredited application report_api.store._application_accreditation = False case_id = "yellowhog" analysis_date = report_api.store.family(case_id).analyses[0].started_at delivery_data = report_api._get_delivery_data(case_id=case_id, analysis_date=analysis_date) report_data = report_api._make_data_presentable(delivery_data) assert report_data["accredited"] is False # WHEN rendering a report from that data rendered_report = ReportAPI._render_delivery_report(report_data) # THEN a html report without swedac logo should have been rendered assert "SWEDAC logo" not in rendered_report
def test_create_delivery_report_file(report_store, report_api: ReportAPI, tmp_path): # GIVEN initialized ReportAPI case_id = "yellowhog" anlysis_started_at = report_store.family(case_id).analyses[0].started_at # WHEN rendering a report from that data created_report_file = report_api.create_delivery_report_file( case_id="yellowhog", analysis_date=anlysis_started_at, file_path=tmp_path) # THEN a html report with certain data should have been created on disk assert os.path.isfile(created_report_file.name) os.unlink(created_report_file.name)
def report_api(report_store, lims_samples): db = MockDB(report_store) lims = MockLimsAPI(samples=lims_samples) chanjo = MockChanjo() analysis = MockMipAnalysis() scout = MockScout() logger = MockLogger() path_tool = MockPath() return ReportAPI( lims_api=lims, store=db, chanjo_api=chanjo, analysis_api=analysis, scout_api=scout, logger=logger, path_tool=path_tool, )
def report_api(report_store, lims_samples): db = MockDB(report_store) lims = MockLims(lims_samples) chanjo = MockChanjo() analysis = MockAnalysis() scout = MockScout() logger = MockLogger() yaml_loader = MockYamlLoader() path_tool = MockPath() _report_api = ReportAPI( lims_api=lims, store=db, chanjo_api=chanjo, analysis_api=analysis, scout_api=scout, logger=logger, yaml_loader=yaml_loader, path_tool=path_tool, ) return _report_api
def upload_context(cg_context: CGConfig) -> CGConfig: analysis_api = MipDNAAnalysisAPI(config=cg_context) cg_context.meta_apis["analysis_api"] = analysis_api cg_context.meta_apis["report_api"] = ReportAPI( store=cg_context.status_db, lims_api=cg_context.lims_api, chanjo_api=cg_context.chanjo_api, analysis_api=analysis_api, scout_api=cg_context.scout_api, ) cg_context.meta_apis["scout_upload_api"] = UploadScoutAPI( hk_api=cg_context.housekeeper_api, scout_api=cg_context.scout_api, madeline_api=cg_context.madeline_api, analysis_api=analysis_api, lims_api=cg_context.lims_api, status_db=cg_context.status_db, ) return cg_context
def upload(context: click.Context, family_id: Optional[str], force_restart: bool): """Upload results from analyses.""" config_object: CGConfig = context.obj if not config_object.meta_apis.get("analysis_api"): config_object.meta_apis["analysis_api"] = MipDNAAnalysisAPI( context.obj) analysis_api: AnalysisAPI = config_object.meta_apis["analysis_api"] status_db: Store = config_object.status_db click.echo(click.style("----------------- UPLOAD ----------------------")) if family_id: try: analysis_api.verify_case_id_in_statusdb(case_id=family_id) except CgError: raise click.Abort case_obj: models.Family = status_db.family(family_id) if not case_obj.analyses: message = f"no analysis exists for family: {family_id}" click.echo(click.style(message, fg="red")) raise click.Abort analysis_obj: models.Analysis = case_obj.analyses[0] if analysis_obj.uploaded_at is not None: message = f"analysis already uploaded: {analysis_obj.uploaded_at.date()}" click.echo(click.style(message, fg="red")) raise click.Abort if not force_restart and analysis_obj.upload_started_at is not None: if dt.datetime.now( ) - analysis_obj.upload_started_at > dt.timedelta(hours=24): raise AnalysisUploadError( f"The upload started at {analysis_obj.upload_started_at} " f"something went wrong, restart it with the --restart flag" ) message = f"analysis upload already started: {analysis_obj.upload_started_at.date()}" click.echo(click.style(message, fg="yellow")) return context.obj.meta_apis["report_api"] = ReportAPI( store=status_db, lims_api=config_object.lims_api, chanjo_api=config_object.chanjo_api, analysis_api=analysis_api, scout_api=config_object.scout_api, ) context.obj.meta_apis["scout_upload_api"] = UploadScoutAPI( hk_api=config_object.housekeeper_api, scout_api=config_object.scout_api, madeline_api=config_object.madeline_api, analysis_api=analysis_api, lims_api=config_object.lims_api, status_db=status_db, ) if context.invoked_subcommand is not None: return if not family_id: suggest_cases_to_upload(status_db=status_db) raise click.Abort case_obj: models.Family = status_db.family(family_id) analysis_obj: models.Analysis = case_obj.analyses[0] if analysis_obj.uploaded_at is not None: message = f"analysis already uploaded: {analysis_obj.uploaded_at.date()}" click.echo(click.style(message, fg="yellow")) else: analysis_obj.upload_started_at = dt.datetime.now() status_db.commit() context.invoke(coverage, re_upload=True, family_id=family_id) context.invoke(validate, family_id=family_id) context.invoke(genotypes, re_upload=False, family_id=family_id) context.invoke(observations, case_id=family_id) context.invoke(scout, case_id=family_id) analysis_obj.uploaded_at = dt.datetime.now() status_db.commit() click.echo(click.style(f"{family_id}: analysis uploaded!", fg="green"))
def upload(context, family_id, force_restart): """Upload results from analyses.""" click.echo(click.style("----------------- UPLOAD ----------------------")) context.obj["status"] = Store(context.obj["database"]) if family_id: family_obj = context.obj["status"].family(family_id) if not family_obj: message = f"family not found: {family_id}" click.echo(click.style(message, fg="red")) context.abort() if not family_obj.analyses: message = f"no analysis exists for family: {family_id}" click.echo(click.style(message, fg="red")) context.abort() analysis_obj = family_obj.analyses[0] if analysis_obj.uploaded_at is not None: message = f"analysis already uploaded: {analysis_obj.uploaded_at.date()}" click.echo(click.style(message, fg="red")) context.abort() if not force_restart and analysis_obj.upload_started_at is not None: if dt.datetime.now( ) - analysis_obj.upload_started_at > dt.timedelta(hours=24): raise AnalysisUploadError( f"The upload started at {analysis_obj.upload_started_at} " f"something went wrong, restart it with the --restart flag" ) message = f"analysis upload already started: {analysis_obj.upload_started_at.date()}" click.echo(click.style(message, fg="yellow")) return context.obj["housekeeper_api"] = hk.HousekeeperAPI(context.obj) context.obj["madeline_api"] = madeline.api.MadelineAPI(context.obj) context.obj["genotype_api"] = gt.GenotypeAPI(context.obj) context.obj["lims_api"] = lims.LimsAPI(context.obj) context.obj["tb_api"] = tb.TrailblazerAPI(context.obj) context.obj["chanjo_api"] = coverage_app.ChanjoAPI(context.obj) context.obj["deliver_api"] = DeliverAPI( context.obj, hk_api=context.obj["housekeeper_api"], lims_api=context.obj["lims_api"], case_tags=CASE_TAGS, sample_tags=SAMPLE_TAGS, ) context.obj["scout_api"] = scoutapi.ScoutAPI(context.obj) context.obj["analysis_api"] = AnalysisAPI( context.obj, hk_api=context.obj["housekeeper_api"], scout_api=context.obj["scout_api"], tb_api=context.obj["tb_api"], lims_api=context.obj["lims_api"], deliver_api=context.obj["deliver_api"], ) context.obj["report_api"] = ReportAPI( store=context.obj["status"], lims_api=context.obj["lims_api"], chanjo_api=context.obj["chanjo_api"], analysis_api=context.obj["analysis_api"], scout_api=context.obj["scout_api"], ) context.obj["scout_upload_api"] = UploadScoutAPI( hk_api=context.obj["housekeeper_api"], scout_api=context.obj["scout_api"], madeline_api=context.obj["madeline_api"], analysis_api=context.obj["analysis_api"], lims_api=context.obj["lims_api"], ) if context.invoked_subcommand is not None: return if not family_id: _suggest_cases_to_upload(context) context.abort() family_obj = context.obj["status"].family(family_id) analysis_obj = family_obj.analyses[0] if analysis_obj.uploaded_at is not None: message = f"analysis already uploaded: {analysis_obj.uploaded_at.date()}" click.echo(click.style(message, fg="yellow")) else: analysis_obj.upload_started_at = dt.datetime.now() context.obj["status"].commit() context.invoke(coverage, re_upload=True, family_id=family_id) context.invoke(validate, family_id=family_id) context.invoke(genotypes, re_upload=False, family_id=family_id) context.invoke(observations, case_id=family_id) context.invoke(scout, case_id=family_id) analysis_obj.uploaded_at = dt.datetime.now() context.obj["status"].commit() click.echo(click.style(f"{family_id}: analysis uploaded!", fg="green"))