Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Improve order flow) Rework the process_lims method #3959

Merged
merged 7 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions cg/server/endpoints/samples.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

from flask import Blueprint, abort, g, jsonify, request

from cg.server.dto.samples.collaborator_samples_request import (
CollaboratorSamplesRequest,
)
from cg.server.dto.samples.collaborator_samples_request import CollaboratorSamplesRequest
from cg.server.dto.samples.samples_response import SamplesResponse
from cg.server.endpoints.utils import before_request
from cg.server.ext import db, sample_service
Expand Down
4 changes: 2 additions & 2 deletions cg/services/order_validation_service/constants.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from enum import Enum, StrEnum, auto
from enum import StrEnum, auto


class TissueBlockEnum(StrEnum):
Expand All @@ -18,7 +18,7 @@ class ElutionBuffer(StrEnum):
MINIMUM_VOLUME, MAXIMUM_VOLUME = 20, 130


class ExtractionMethod(Enum):
class ExtractionMethod(StrEnum):
EZ1 = "EZ1"
islean marked this conversation as resolved.
Show resolved Hide resolved
MAELSTROM = "Maelstrom"
MAGNAPURE_96 = "MagNaPure 96 (contact Clinical Genomics before submission)"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from enum import Enum
from enum import StrEnum

from cg.constants import DataDelivery


class BalsamicDeliveryType(Enum):
class BalsamicDeliveryType(StrEnum):
ANALYSIS = DataDelivery.ANALYSIS_FILES
ANALYSIS_SCOUT = DataDelivery.ANALYSIS_SCOUT
FASTQ_ANALYSIS = DataDelivery.FASTQ_ANALYSIS
FASTQ_SCOUT = DataDelivery.FASTQ_SCOUT
FASTQ_ANALYSIS_SCOUT = DataDelivery.FASTQ_ANALYSIS_SCOUT
SCOUT = DataDelivery.SCOUT
NO_DELIVERY = DataDelivery.NO_DELIVERY
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
from pydantic import Field

from cg.constants.constants import GenomeVersion
from cg.models.orders.sample_base import NAME_PATTERN, ControlEnum, SexEnum, StatusEnum
from cg.services.order_validation_service.constants import (
ElutionBuffer,
TissueBlockEnum,
)
from cg.services.order_validation_service.constants import ElutionBuffer, TissueBlockEnum
from cg.services.order_validation_service.models.sample import Sample


Expand All @@ -17,15 +13,14 @@ class BalsamicSample(Sample):
control: ControlEnum | None = None
elution_buffer: ElutionBuffer | None = None
formalin_fixation_time: int | None = None
is_tumour: bool
phenotype_groups: list[str] | None = None
phenotype_terms: list[str] | None = None
post_formalin_fixation_time: int | None = None
reference_genome: GenomeVersion
require_qc_ok: bool
sex: SexEnum
source: str
status: StatusEnum | None = None
subject_id: str = Field(pattern=NAME_PATTERN, max_length=128)
tissue_block_size: TissueBlockEnum | None = None
tumour: bool
tumour_purity: int | None = None
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from enum import Enum
from enum import StrEnum

from cg.constants import DataDelivery


class FastqDeliveryType(Enum):
class FastqDeliveryType(StrEnum):
FASTQ = DataDelivery.FASTQ
NO_DELIVERY = DataDelivery.NO_DELIVERY
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from enum import Enum
from enum import StrEnum

from cg.constants import DataDelivery


class MicrosaltDeliveryType(Enum):
class MicrosaltDeliveryType(StrEnum):
FASTQ_QC = DataDelivery.FASTQ_QC
FASTQ_QC_ANALYSIS = DataDelivery.FASTQ_QC_ANALYSIS
NO_DELIVERY = DataDelivery.NO_DELIVERY
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
from cg.services.order_validation_service.models.discriminators import has_internal_id
from cg.services.order_validation_service.models.existing_case import ExistingCase
from cg.services.order_validation_service.models.order_with_cases import OrderWithCases
from cg.services.order_validation_service.workflows.mip_dna.models.case import (
MipDnaCase,
)
from cg.services.order_validation_service.workflows.mip_dna.models.case import MipDnaCase

NewCase = Annotated[MipDnaCase, Tag("new")]
OldCase = Annotated[ExistingCase, Tag("existing")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


class MutantDeliveryType(Enum):
ANALYSIS_FILES = DataDelivery.FASTQ_ANALYSIS
ANALYSIS_FILES = DataDelivery.FASTQ
islean marked this conversation as resolved.
Show resolved Hide resolved
islean marked this conversation as resolved.
Show resolved Hide resolved
NO_DELIVERY = DataDelivery.NO_DELIVERY


Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from cg.services.order_validation_service.models.order_with_samples import OrderWithNonHumanSamples
from cg.services.order_validation_service.models.order_with_samples import OrderWithSamples
from cg.services.order_validation_service.workflows.rml.constants import RmlDeliveryType
from cg.services.order_validation_service.workflows.rml.models.sample import RmlSample


class RmlOrder(OrderWithNonHumanSamples):
class RmlOrder(OrderWithSamples):
delivery_type: RmlDeliveryType
samples: list[RmlSample]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ class RmlSample(Sample):
pool: str
pool_concentration: float
priority: PriorityEnum
rml_plate_name: str | None = None
sample_concentration: float | None = None
volume: int
well_position_rml: str | None = None
28 changes: 20 additions & 8 deletions cg/services/orders/order_lims_service/order_lims_service.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import logging

from cg.apps.lims import LimsAPI
from cg.constants import DataDelivery, Workflow
from cg.models.lims.sample import LimsSample
from cg.models.orders.order import OrderIn
from cg.models.orders.samples import OrderInSample
from cg.services.order_validation_service.models.sample import Sample

LOG = logging.getLogger(__name__)

Expand All @@ -14,23 +14,35 @@ def __init__(self, lims_api: LimsAPI):
self.lims_api = lims_api

@staticmethod
def _build_lims_sample(customer: str, samples: list[OrderInSample]) -> list[LimsSample]:
"""Convert order input to lims interface input."""
def _build_lims_sample(
customer: str, samples: list[Sample], workflow: Workflow, delivery_type: DataDelivery
) -> list[LimsSample]:
"""Convert order input to LIMS interface input."""
samples_lims = []
for sample in samples:
dict_sample = sample.__dict__
dict_sample = sample.model_dump()
LOG.debug(f"{sample.name}: prepare LIMS input")
dict_sample["customer"] = customer
dict_sample["data_analysis"] = workflow
dict_sample["data_delivery"] = delivery_type
islean marked this conversation as resolved.
Show resolved Hide resolved
lims_sample: LimsSample = LimsSample.parse_obj(dict_sample)
samples_lims.append(lims_sample)
return samples_lims

def process_lims(self, lims_order: OrderIn, new_samples: list[OrderInSample]):
def process_lims(
self,
samples: list[Sample],
customer: str,
ticket: int | None,
order_name: str,
workflow: Workflow,
delivery_type: DataDelivery,
):
"""Process samples to add them to LIMS."""
samples_lims: list[LimsSample] = self._build_lims_sample(
lims_order.customer, samples=new_samples
customer=customer, samples=samples, workflow=workflow, delivery_type=delivery_type
)
project_name: str = lims_order.ticket or lims_order.name
project_name: str = str(ticket) or order_name
# Create new lims project
project_data = self.lims_api.submit_project(
project_name, [lims_sample.dict() for lims_sample in samples_lims]
Expand Down
13 changes: 2 additions & 11 deletions cg/services/orders/store_order_services/store_case_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,7 @@
from cg.models.orders.samples import Of1508Sample
from cg.services.orders.order_lims_service.order_lims_service import OrderLimsService
from cg.services.orders.submitters.order_submitter import StoreOrderService
from cg.store.models import (
ApplicationVersion,
Case,
CaseSample,
Customer,
Order,
Sample,
)
from cg.store.models import ApplicationVersion, Case, CaseSample, Customer, Order, Sample
from cg.store.store import Store

LOG = logging.getLogger(__name__)
Expand Down Expand Up @@ -52,9 +45,7 @@ def _process_case_samples(self, order: OrderIn) -> dict:
# submit new samples to lims
new_samples = [sample for sample in order.samples if sample.internal_id is None]
if new_samples:
project_data, lims_map = self.lims.process_lims(
lims_order=order, new_samples=new_samples
)
project_data, lims_map = self.lims.process_lims(order=order, new_samples=new_samples)
islean marked this conversation as resolved.
Show resolved Hide resolved

status_data = self.order_to_status(order=order)
samples = [sample for family in status_data["families"] for sample in family["samples"]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,7 @@
from cg.models.orders.sample_base import StatusEnum
from cg.services.orders.order_lims_service.order_lims_service import OrderLimsService
from cg.services.orders.submitters.order_submitter import StoreOrderService
from cg.store.models import (
ApplicationVersion,
Case,
CaseSample,
Customer,
Order,
Sample,
)
from cg.store.models import ApplicationVersion, Case, CaseSample, Customer, Order, Sample
from cg.store.store import Store

LOG = logging.getLogger(__name__)
Expand All @@ -31,7 +24,7 @@ def __init__(self, status_db: Store, lims_service: OrderLimsService):
def store_order(self, order: OrderIn) -> dict:
"""Submit a batch of samples for FASTQ delivery."""

project_data, lims_map = self.lims.process_lims(lims_order=order, new_samples=order.samples)
project_data, lims_map = self.lims.process_lims(order=order, new_samples=order.samples)
status_data = self.order_to_status(order)
self._fill_in_sample_ids(samples=status_data["samples"], lims_map=lims_map)
new_samples = self.store_items_in_status(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,7 @@
from cg.models.orders.sample_base import StatusEnum
from cg.services.orders.order_lims_service.order_lims_service import OrderLimsService
from cg.services.orders.submitters.order_submitter import StoreOrderService
from cg.store.models import (
ApplicationVersion,
Case,
CaseSample,
Customer,
Order,
Sample,
)
from cg.store.models import ApplicationVersion, Case, CaseSample, Customer, Order, Sample
from cg.store.store import Store

LOG = logging.getLogger(__name__)
Expand All @@ -29,7 +22,7 @@ def __init__(self, status_db: Store, lims_service: OrderLimsService):

def store_order(self, order: OrderIn) -> dict:
"""Submit a batch of metagenome samples."""
project_data, lims_map = self.lims.process_lims(lims_order=order, new_samples=order.samples)
project_data, lims_map = self.lims.process_lims(order=order, new_samples=order.samples)
status_data = self.order_to_status(order)
self._fill_in_sample_ids(samples=status_data["families"][0]["samples"], lims_map=lims_map)
new_samples = self.store_items_in_status(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def __init__(self, status_db: Store, lims_service: OrderLimsService):
self.lims = lims_service

def store_order(self, order: OrderIn) -> dict:
project_data, lims_map = self.lims.process_lims(lims_order=order, new_samples=order.samples)
project_data, lims_map = self.lims.process_lims(order=order, new_samples=order.samples)
status_data: dict = self.order_to_status(order)
self._fill_in_sample_ids(samples=status_data["samples"], lims_map=lims_map)
new_samples: list[Sample] = self.store_items_in_status(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, status_db: Store, lims_service: OrderLimsService):
def store_order(self, order: OrderIn) -> dict:
self._fill_in_sample_verified_organism(order.samples)
# submit samples to LIMS
project_data, lims_map = self.lims.process_lims(lims_order=order, new_samples=order.samples)
project_data, lims_map = self.lims.process_lims(order=order, new_samples=order.samples)
# prepare order for status database
status_data = self.order_to_status(order)
self._fill_in_sample_ids(samples=status_data["samples"], lims_map=lims_map)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def __init__(self, status_db: Store, lims_service: OrderLimsService):
def store_order(self, order: OrderIn) -> dict:
"""Submit a batch of samples for PacBio Long Read delivery."""

project_data, lims_map = self.lims.process_lims(lims_order=order, new_samples=order.samples)
project_data, lims_map = self.lims.process_lims(order=order, new_samples=order.samples)
status_data: dict = self.order_to_status(order)
self._fill_in_sample_ids(samples=status_data["samples"], lims_map=lims_map)
new_samples = self._store_samples_in_statusdb(
Expand Down
12 changes: 2 additions & 10 deletions cg/services/orders/store_order_services/store_pool_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,7 @@
from cg.models.orders.samples import RmlSample
from cg.services.orders.order_lims_service.order_lims_service import OrderLimsService
from cg.services.orders.submitters.order_submitter import StoreOrderService
from cg.store.models import (
ApplicationVersion,
Case,
CaseSample,
Customer,
Order,
Pool,
Sample,
)
from cg.store.models import ApplicationVersion, Case, CaseSample, Customer, Order, Pool, Sample
from cg.store.store import Store

LOG = logging.getLogger(__name__)
Expand All @@ -36,7 +28,7 @@ def __init__(self, status_db: Store, lims_service: OrderLimsService):

def store_order(self, order: OrderIn) -> dict:
status_data = self.order_to_status(order)
project_data, lims_map = self.lims.process_lims(lims_order=order, new_samples=order.samples)
project_data, lims_map = self.lims.process_lims(order=order, new_samples=order.samples)
samples = [sample for pool in status_data["pools"] for sample in pool["samples"]]
self._fill_in_sample_ids(samples=samples, lims_map=lims_map, id_key="internal_id")
new_records = self.store_items_in_status(
Expand Down
Loading
Loading