예제 #1
0
def microbial_store(base_store: Store, microbial_submitted_order):
    """Setup a store instance for testing analysis API."""
    customer = base_store.customer(microbial_submitted_order["customer"])

    for sample_data in microbial_submitted_order["items"]:
        application_version = base_store.application(
            sample_data["application"]).versions[0]
        organism = base_store.Organism(internal_id=sample_data["organism"],
                                       name=sample_data["organism"])
        base_store.add(organism)
        sample = base_store.add_sample(
            comment=sample_data["comment"],
            name=sample_data["name"],
            priority=sample_data["priority"],
            reads=sample_data["reads"],
            reference_genome=sample_data["reference_genome"],
            sex="unknown",
            ticket=microbial_submitted_order["ticket_number"],
        )
        sample.application_version = application_version
        sample.customer = customer
        sample.organism = organism
        base_store.add(sample)

    base_store.commit()
    yield base_store
예제 #2
0
def import_applications(
    store: Store, excel_path: str, sign: str, dry_run: bool, sheet_name: Optional[str] = None
):
    """
    Imports all applications from the specified excel file
    Args:
        :param sheet_name:          Optional sheet name
        :param store:               status database store
        :param excel_path:          Path to excel file with headers: 'App tag', 'Valid from',
                                    'Standard', 'Priority', 'Express', 'Research'
        :param sign:                Signature of user running the script
        :param dry_run:             Test run, no changes to the database
    """
    applications: Iterable[ApplicationSchema] = parse_applications(
        excel_path=excel_path, sheet_name=sheet_name
    )

    for application in applications:
        application_obj: models.Application = store.application(application.tag)
        if application_obj and applications_are_same(
            application_obj=application_obj, application=application
        ):
            LOG.info("skipping redundant application %s", application.tag)
            continue

        LOG.info("adding new application to transaction %s", application.tag)
        new_application = add_application_object(application=application, sign=sign, store=store)
        store.add(new_application)

    if not dry_run:
        LOG.info("all applications successfully added to transaction, committing transaction")
        store.commit()
    else:
        LOG.error("Dry-run, rolling back transaction.")
        store.rollback()
예제 #3
0
def flowcell_store(base_store: Store, data: dict) -> Store:
    """Setup store with sample data for testing flowcell transfer."""
    for sample_data in data["samples"]:
        customer_obj: models.Customer = base_store.customers().first()
        application_version: models.ApplicationVersion = base_store.application(
            "WGSPCFC030").versions[0]
        sample: models.Sample = base_store.add_sample(
            name="NA", sex="male", internal_id=sample_data["name"])
        sample.customer = customer_obj
        sample.application_version = application_version
        sample.received_at = dt.datetime.now()
        base_store.add(sample)
    base_store.commit()
    yield base_store
예제 #4
0
def fixture_analysis_store(base_store: Store, analysis_family: dict) -> Store:
    """Setup a store instance for testing analysis API."""
    customer = base_store.customer("cust000")
    family = base_store.Family(
        data_analysis=analysis_family["data_analysis"],
        name=analysis_family["name"],
        panels=analysis_family["panels"],
        internal_id=analysis_family["internal_id"],
        priority=Priority.standard.name,
    )
    family.customer = customer
    base_store.add(family)
    application_version = base_store.application("WGSPCFC030").versions[0]
    for sample_data in analysis_family["samples"]:
        sample = base_store.add_sample(
            name=sample_data["name"],
            sex=sample_data["sex"],
            internal_id=sample_data["internal_id"],
            ticket=sample_data["ticket_number"],
            reads=sample_data["reads"],
            capture_kit=sample_data["capture_kit"],
        )
        sample.family = family
        sample.application_version = application_version
        sample.customer = customer
        base_store.add(sample)
    base_store.commit()
    for sample_data in analysis_family["samples"]:
        sample_obj = base_store.sample(sample_data["internal_id"])
        link = base_store.relate_sample(
            family=family,
            sample=sample_obj,
            status=sample_data["status"],
            father=base_store.sample(sample_data["father"])
            if sample_data.get("father") else None,
            mother=base_store.sample(sample_data["mother"])
            if sample_data.get("mother") else None,
        )
        base_store.add(link)
    base_store.commit()
    yield base_store
예제 #5
0
def import_application_versions(
    store: Store, excel_path: str, sign: str, dry_run: bool, skip_missing: bool
):
    """
    Imports all application versions from the specified excel file
    Args:
        :param store:               Status database store
        :param excel_path:          Path to excel file with headers: 'App tag', 'Valid from',
                                    'Standard', 'Priority', 'Express', 'Research'
        :param sign:                Signature of user running the script
        :param dry_run:             Test run, no changes to the database
        :param skip_missing:        Continue despite missing applications
    """
    application_versions: Iterable[ParsedApplicationVersion] = parse_application_versions(
        excel_path=excel_path
    )

    for application_version in application_versions:

        application_obj: models.Application = store.application(application_version.app_tag)

        if not application_obj:
            LOG.error(
                "Failed to find application! Please manually add application: %s",
                application_version.app_tag,
            )

            if skip_missing:
                continue

            LOG.error("Rolling back transaction.")
            store.rollback()
            sys.exit()

        app_tag: str = application_obj.tag
        latest_version: models.ApplicationVersion = store.latest_version(
            application_version.app_tag
        )

        if latest_version and versions_are_same(
            version_obj=latest_version, application_version=application_version
        ):
            LOG.info("skipping redundant application version for app tag %s", app_tag)
            continue

        LOG.info("adding new application version to transaction for app tag %s", app_tag)
        new_version = add_application_version(
            application_obj=application_obj,
            latest_version=latest_version,
            version=application_version,
            sign=sign,
            store=store,
        )
        store.add(new_version)

    if not dry_run:
        LOG.info(
            "all application versions successfully added to transaction, committing " "transaction"
        )
        store.commit()
    else:
        LOG.error("Dry-run, rolling back transaction.")
        store.rollback()