Ejemplo n.º 1
0
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
Ejemplo n.º 2
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
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
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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,
    )
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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"))
Ejemplo n.º 10
0
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"))