Skip to content

Commit

Permalink
Rework order storing (#3884) (patch)
Browse files Browse the repository at this point in the history
### Fixed

- Orders are connected to their cases
  • Loading branch information
islean authored Oct 24, 2024
1 parent 668b345 commit 8ad79f8
Show file tree
Hide file tree
Showing 10 changed files with 115 additions and 138 deletions.
1 change: 0 additions & 1 deletion cg/server/endpoints/orders.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ def submit_order(order_type):
user_name=g.current_user.name,
user_mail=g.current_user.email,
)
order_service.create_order(order_in)

except ( # user misbehaviour
OrderError,
Expand Down
11 changes: 1 addition & 10 deletions cg/services/orders/order_service/order_service.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from cg.models.orders.order import OrderIn
from cg.server.dto.orders.orders_request import OrdersRequest
from cg.server.dto.orders.orders_response import Order as OrderResponse
from cg.server.dto.orders.orders_response import OrdersResponse
Expand All @@ -11,7 +10,7 @@
from cg.services.orders.order_summary_service.order_summary_service import (
OrderSummaryService,
)
from cg.store.models import Case, Order
from cg.store.models import Order
from cg.store.store import Store


Expand All @@ -33,14 +32,6 @@ def get_orders(self, orders_request: OrdersRequest) -> OrdersResponse:
summaries: list[OrderSummary] = self.summary_service.get_summaries(order_ids)
return create_orders_response(orders=orders, summaries=summaries, total=total_count)

def create_order(self, order_data: OrderIn) -> OrderResponse:
"""Creates an order and links it to the given cases."""
order: Order = self.store.add_order(order_data)
cases: list[Case] = self.store.get_cases_by_ticket_id(order_data.ticket)
for case in cases:
self.store.link_case_to_order(order_id=order.id, case_id=case.id)
return create_order_response(order)

def set_open(self, order_id: int, open: bool) -> OrderResponse:
order: Order = self.store.update_order_status(order_id=order_id, open=open)
return create_order_response(order)
Expand Down
21 changes: 17 additions & 4 deletions cg/services/orders/store_order_services/store_case_order.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
import logging
from datetime import datetime

from cg.constants import Workflow, Priority
from cg.constants import Priority, Workflow
from cg.constants.constants import CaseActions, DataDelivery
from cg.constants.pedigree import Pedigree
from cg.models.orders.order import OrderIn
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 Case, Customer, Sample, CaseSample, ApplicationVersion
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 @@ -153,7 +160,12 @@ def store_items_in_status(
customer_internal_id=customer_id
)
new_cases: list[Case] = []

status_db_order = Order(
customer=customer,
order_date=datetime.now(),
ticket_id=int(ticket_id),
workflow=Workflow(items[0]["data_analysis"]),
)
for case in items:
status_db_case: Case = self.status_db.get_case_by_internal_id(
internal_id=case["internal_id"]
Expand All @@ -169,8 +181,8 @@ def store_items_in_status(
self._append_ticket(ticket_id=ticket_id, case=status_db_case)
self._update_action(action=CaseActions.ANALYZE, case=status_db_case)
self._update_case_panel(panels=case["panels"], case=status_db_case)

case_samples: dict[str, Sample] = {}
status_db_order.cases.append(status_db_case)
for sample in case["samples"]:
existing_sample: Sample = self.status_db.get_sample_by_internal_id(
internal_id=sample["internal_id"]
Expand Down Expand Up @@ -212,6 +224,7 @@ def store_items_in_status(
sample=sample,
)
self.status_db.session.add_all(new_cases)
self.status_db.session.add(status_db_order)
self.status_db.session.commit()
return new_cases

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
import logging
from datetime import datetime

from cg.constants import Workflow, DataDelivery, GenePanelMasterList, Priority
from cg.constants import DataDelivery, GenePanelMasterList, Priority, Workflow
from cg.constants.constants import CustomerId, PrepCategory
from cg.exc import OrderError
from cg.models.orders.order import OrderIn
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 Case, CaseSample, Sample, Customer, ApplicationVersion
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 @@ -61,7 +68,7 @@ def order_to_status(order: OrderIn) -> dict:
}
return status_data

def create_maf_case(self, sample_obj: Sample) -> None:
def create_maf_case(self, sample_obj: Sample, order: Order) -> None:
"""Add a MAF case to the Status database."""
case: Case = self.status_db.add_case(
data_analysis=Workflow(Workflow.MIP_DNA),
Expand All @@ -77,6 +84,7 @@ def create_maf_case(self, sample_obj: Sample) -> None:
relationship: CaseSample = self.status_db.relate_sample(
case=case, sample=sample_obj, status=StatusEnum.unknown
)
order.cases.append(case)
self.status_db.session.add_all([case, relationship])

def store_items_in_status(
Expand All @@ -93,6 +101,12 @@ def store_items_in_status(
customer=customer, case_name=ticket_id
)
submitted_case: dict = items[0]
status_db_order = Order(
customer=customer,
order_date=datetime.now(),
ticket_id=int(ticket_id),
workflow=Workflow(submitted_case["data_analysis"]),
)
with self.status_db.session.no_autoflush:
for sample in items:
new_sample = self.status_db.add_sample(
Expand Down Expand Up @@ -130,13 +144,14 @@ def store_items_in_status(
not new_sample.is_tumour
and new_sample.prep_category == PrepCategory.WHOLE_GENOME_SEQUENCING
):
self.create_maf_case(sample_obj=new_sample)
self.create_maf_case(sample_obj=new_sample, order=status_db_order)
case.customer = customer
new_relationship = self.status_db.relate_sample(
case=case, sample=new_sample, status=StatusEnum.unknown
)
self.status_db.session.add_all([case, new_relationship])

status_db_order.cases.append(case)
self.status_db.session.add(status_db_order)
self.status_db.session.add_all(new_samples)
self.status_db.session.commit()
return new_samples
20 changes: 17 additions & 3 deletions cg/services/orders/store_order_services/store_metagenome_order.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
import logging
from datetime import datetime

from cg.constants import Workflow, DataDelivery, Sex
from cg.constants import DataDelivery, Sex, Workflow
from cg.exc import OrderError
from cg.models.orders.order import OrderIn
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 Sample, Customer, ApplicationVersion, Case, CaseSample
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 @@ -79,6 +86,12 @@ def store_items_in_status(
customer=customer, case_name=str(ticket_id)
)
case_dict: dict = items[0]
status_db_order = Order(
customer=customer,
order_date=datetime.now(),
ticket_id=int(ticket_id),
workflow=Workflow(case_dict["data_analysis"]),
)
with self.status_db.session.no_autoflush:
for sample in case_dict["samples"]:
new_sample = self.status_db.add_sample(
Expand Down Expand Up @@ -119,7 +132,8 @@ def store_items_in_status(
case=case, sample=new_sample, status=StatusEnum.unknown
)
self.status_db.session.add(new_relationship)

status_db_order.cases.append(case)
self.status_db.session.add(status_db_order)
self.status_db.session.add_all(new_samples)
self.status_db.session.commit()
return new_samples
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from cg.services.orders.order_lims_service.order_lims_service import OrderLimsService
from cg.services.orders.submitters.order_submitter import StoreOrderService
from cg.store.exc import EntryNotFoundError
from cg.store.models import Case, CaseSample, Customer, Sample
from cg.store.models import Case, CaseSample, Customer, Order, Sample
from cg.store.store import Store


Expand Down Expand Up @@ -61,6 +61,12 @@ def store_items_in_status(
) -> list[Sample]:
customer: Customer = self._get_customer(customer_id)
new_samples: list[Sample] = []
status_db_order = Order(
customer=customer,
order_date=datetime.now(),
ticket_id=int(ticket_id),
workflow=Workflow.RAW_DATA,
)
for sample in items:
case_name: str = f'{sample["name"]}-case'
case: Case = self._create_case_for_sample(
Expand All @@ -79,8 +85,10 @@ def store_items_in_status(
case_sample: CaseSample = self.status_db.relate_sample(
case=case, sample=db_sample, status=StatusEnum.unknown
)
status_db_order.cases.append(case)
self.status_db.add_multiple_items_to_store([case, db_sample, case_sample])
new_samples.append(db_sample)
self.status_db.session.add(status_db_order)
self.status_db.commit_to_store()
return new_samples

Expand Down
22 changes: 19 additions & 3 deletions cg/services/orders/store_order_services/store_microbial_order.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import logging
from datetime import datetime

from cg.constants import Workflow, DataDelivery, Sex
from cg.constants import DataDelivery, Sex, Workflow
from cg.models.orders.order import OrderIn
from cg.models.orders.samples import MicrobialSample
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 Sample, Customer, Case, ApplicationVersion, Organism, CaseSample
from cg.store.models import (
ApplicationVersion,
Case,
CaseSample,
Customer,
Order,
Organism,
Sample,
)
from cg.store.store import Store

LOG = logging.getLogger(__name__)
Expand Down Expand Up @@ -39,7 +47,7 @@ def store_order(self, order: OrderIn) -> dict:
samples = self.store_items_in_status(
customer_id=status_data["customer"],
order=status_data["order"],
ordered=project_data["date"] if project_data else dt.datetime.now(),
ordered=project_data["date"] if project_data else datetime.now(),
ticket_id=order.ticket,
items=status_data["samples"],
comment=status_data["comment"],
Expand Down Expand Up @@ -93,6 +101,12 @@ def store_items_in_status(
customer_internal_id=customer_id
)
new_samples = []
status_db_order = Order(
customer=customer,
order_date=datetime.now(),
ticket_id=int(ticket_id),
workflow=data_analysis,
)

with self.status.session.no_autoflush:
for sample_data in items:
Expand Down Expand Up @@ -157,6 +171,8 @@ def store_items_in_status(
new_samples.append(new_sample)

case.priority = priority
status_db_order.cases.append(case)
self.status.session.add(status_db_order)
self.status.session.add_all(new_samples)
self.status.session.commit()
return sample_objs
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import logging
from datetime import datetime

from cg.constants import DataDelivery, Priority, Workflow
from cg.constants import DataDelivery, Workflow
from cg.models.orders.order import OrderIn
from cg.models.orders.sample_base import SexEnum, 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, Sample
from cg.store.models import ApplicationVersion, CaseSample, Customer, Order, Sample
from cg.store.store import Store

LOG = logging.getLogger(__name__)
Expand Down Expand Up @@ -65,6 +65,12 @@ def _store_samples_in_statusdb(
customer: Customer = self.status_db.get_customer_by_internal_id(
customer_internal_id=customer_id
)
status_db_order = Order(
customer=customer,
order_date=datetime.now(),
ticket_id=int(ticket_id),
workflow=Workflow.RAW_DATA,
)
new_samples = []
with self.status_db.session.no_autoflush:
for sample in samples:
Expand Down Expand Up @@ -99,8 +105,10 @@ def _store_samples_in_statusdb(
new_relationship: CaseSample = self.status_db.relate_sample(
case=case, sample=new_sample, status=StatusEnum.unknown
)
status_db_order.cases.append(case)
self.status_db.session.add_all([case, new_relationship])

self.status_db.session.add(status_db_order)
self.status_db.session.add_all(new_samples)
self.status_db.session.commit()
return new_samples
20 changes: 18 additions & 2 deletions cg/services/orders/store_order_services/store_pool_order.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
import logging
from datetime import datetime

from cg.constants import Workflow, DataDelivery
from cg.constants import DataDelivery, Workflow
from cg.exc import OrderError
from cg.models.orders.order import OrderIn
from cg.models.orders.sample_base import SexEnum
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, Customer, Pool, Sample, CaseSample, Case
from cg.store.models import (
ApplicationVersion,
Case,
CaseSample,
Customer,
Order,
Pool,
Sample,
)
from cg.store.store import Store

LOG = logging.getLogger(__name__)
Expand Down Expand Up @@ -116,6 +124,12 @@ def store_items_in_status(
customer: Customer = self.status_db.get_customer_by_internal_id(
customer_internal_id=customer_id
)
status_db_order = Order(
customer=customer,
order_date=datetime.now(),
ticket_id=int(ticket_id),
workflow=Workflow(items[0]["data_analysis"]),
)
new_pools: list[Pool] = []
new_samples: list[Sample] = []
for pool in items:
Expand Down Expand Up @@ -171,7 +185,9 @@ def store_items_in_status(
case=case, sample=new_sample, status="unknown"
)
self.status_db.session.add(link)
status_db_order.cases.append(case)
new_pools.append(new_pool)
self.status_db.session.add(status_db_order)
self.status_db.session.add_all(new_pools)
self.status_db.session.commit()
return new_pools
Expand Down
Loading

0 comments on commit 8ad79f8

Please sign in to comment.