• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Clinical-Genomics / cg / 12294173566

12 Dec 2024 10:09AM UTC coverage: 84.034%. First build
12294173566

Pull #3936

github

web-flow
Merge cec02a431 into ab9ded5a4
Pull Request #3936: (Improve order flow) Minimal implementation FASTQSubmission

34 of 52 new or added lines in 11 files covered. (65.38%)

25390 of 30214 relevant lines covered (84.03%)

0.84 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.45
/cg/services/orders/store_order_services/store_fastq_order_service.py
1
import logging
1✔
2
from datetime import datetime
1✔
3

4
from cg.constants import DataDelivery, GenePanelMasterList, Priority, Workflow
1✔
5
from cg.constants.constants import CustomerId
1✔
6
from cg.constants.sequencing import SeqLibraryPrepCategory
1✔
7
from cg.models.orders.sample_base import StatusEnum
1✔
8
from cg.services.order_validation_service.workflows.fastq.models.order import FastqOrder
1✔
9
from cg.services.orders.order_lims_service.order_lims_service import OrderLimsService
1✔
10
from cg.services.orders.submitters.order_submitter import StoreOrderService
1✔
11
from cg.store.models import ApplicationVersion, Case, CaseSample, Customer, Order, Sample
1✔
12
from cg.store.store import Store
1✔
13

14
LOG = logging.getLogger(__name__)
1✔
15

16

17
class StoreFastqOrderService(StoreOrderService):
1✔
18
    """Storing service for FASTQ orders."""
19

20
    def __init__(self, status_db: Store, lims_service: OrderLimsService):
1✔
21
        self.status_db = status_db
1✔
22
        self.lims = lims_service
1✔
23

24
    def store_order(self, order: FastqOrder) -> dict:
1✔
25
        """Submit a batch of samples for FASTQ delivery."""
26

NEW
27
        project_data, lims_map = self.lims.process_lims(
×
28
            samples=order.samples,
29
            ticket=order.ticket_number,
30
            order_name=order.name,
31
            workflow=Workflow.RAW_DATA,
32
            customer=order.customer,
33
            delivery_type=DataDelivery(order.delivery_type),
34
        )
NEW
35
        self._fill_in_sample_ids(samples=order.samples, lims_map=lims_map)
×
NEW
36
        new_samples = self.store_items_in_status(order=order)
×
NEW
37
        return {"samples": new_samples, "project_data": project_data}
×
38

39
    def create_maf_case(self, sample_obj: Sample, order: Order) -> None:
1✔
40
        """Add a MAF case to the Status database."""
41
        case: Case = self.status_db.add_case(
1✔
42
            data_analysis=Workflow.MIP_DNA,
43
            data_delivery=DataDelivery.NO_DELIVERY,
44
            name="_".join([sample_obj.name, "MAF"]),
45
            panels=[GenePanelMasterList.OMIM_AUTO],
46
            priority=Priority.research,
47
            ticket=sample_obj.original_ticket,
48
        )
49
        case.customer = self.status_db.get_customer_by_internal_id(
1✔
50
            customer_internal_id=CustomerId.CG_INTERNAL_CUSTOMER
51
        )
52
        relationship: CaseSample = self.status_db.relate_sample(
1✔
53
            case=case, sample=sample_obj, status=StatusEnum.unknown
54
        )
55
        order.cases.append(case)
1✔
56
        self.status_db.session.add_all([case, relationship])
1✔
57

58
    def store_items_in_status(self, order: FastqOrder) -> list[Sample]:
1✔
59
        """Store fastq samples in the status database including family connection and delivery"""
60
        ticket_id: str | None = order.ticket_number
1✔
61
        customer: Customer = self.status_db.get_customer_by_internal_id(
1✔
62
            customer_internal_id=order.customer
63
        )
64
        new_samples = []
1✔
65
        case: Case = self.status_db.get_case_by_name_and_customer(
1✔
66
            customer=customer, case_name=ticket_id
67
        )
68
        status_db_order = Order(
1✔
69
            customer=customer,
70
            order_date=datetime.now(),
71
            ticket_id=int(ticket_id),
72
        )
73
        with self.status_db.session.no_autoflush:
1✔
74
            for sample in order.samples:
1✔
75
                new_sample = self.status_db.add_sample(
1✔
76
                    name=sample.name,
77
                    sex=sample.sex or "unknown",
78
                    comment=sample.comment,
79
                    internal_id=sample._generated_lims_id,
80
                    order=order.name,
81
                    ordered=datetime.now(),
82
                    original_ticket=ticket_id,
83
                    priority=sample.priority,
84
                    tumour=sample.tumour,
85
                    capture_kit=sample.capture_kit,
86
                    subject_id=sample.subject_id,
87
                )
88
                new_sample.customer = customer
1✔
89
                application_tag: str = sample.application
1✔
90
                application_version: ApplicationVersion = (
1✔
91
                    self.status_db.get_current_application_version_by_tag(application_tag)
92
                )
93
                new_sample.application_version = application_version
1✔
94
                new_samples.append(new_sample)
1✔
95
                if not case:
1✔
96
                    case = self.status_db.add_case(
1✔
97
                        data_analysis=Workflow.RAW_DATA,
98
                        data_delivery=DataDelivery.FASTQ,
99
                        name=ticket_id,
100
                        priority=sample.priority,
101
                        ticket=ticket_id,
102
                    )
103
                if (
1✔
104
                    not new_sample.is_tumour
105
                    and new_sample.prep_category == SeqLibraryPrepCategory.WHOLE_GENOME_SEQUENCING
106
                ):
107
                    self.create_maf_case(sample_obj=new_sample, order=status_db_order)
1✔
108
                case.customer = customer
1✔
109
                new_relationship = self.status_db.relate_sample(
1✔
110
                    case=case, sample=new_sample, status=StatusEnum.unknown
111
                )
112
                self.status_db.session.add_all([case, new_relationship])
1✔
113
        status_db_order.cases.append(case)
1✔
114
        self.status_db.session.add(status_db_order)
1✔
115
        self.status_db.session.add_all(new_samples)
1✔
116
        self.status_db.session.commit()
1✔
117
        return new_samples
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc