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

Clinical-Genomics / cg / 8780670433

22 Apr 2024 08:09AM UTC coverage: 84.096%. First build
8780670433

Pull #3148

github

web-flow
Merge 4e5f945f0 into f3a674eb2
Pull Request #3148: add(create validation case)

59 of 180 new or added lines in 5 files covered. (32.78%)

19548 of 23245 relevant lines covered (84.1%)

0.84 hits per line

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

96.3
/cg/meta/create_validation_cases/validation_case_data.py
1
"""Model for down sampling meta data."""
2

3
import logging
1✔
4
from pathlib import Path
1✔
5

6
from cg.apps.housekeeper.hk import HousekeeperAPI
1✔
7
from cg.constants import DataDelivery, Priority
1✔
8
from cg.constants.constants import CaseActions, CustomerId
1✔
9
from cg.meta.create_validation_cases.validation_data_input import ValidationDataInput
1✔
10
from cg.store.models import ApplicationVersion, Case, Sample
1✔
11
from cg.store.store import Store
1✔
12
from cg.utils.calculations import multiply_by_million
1✔
13

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

16

17
class ValidationCaseData:
1✔
18
    def __init__(self, status_db: Store, validation_data_input: ValidationDataInput):
1✔
19
        """Initialize the validation sample data and perform integrity checks."""
20
        self.status_db: Store = status_db
1✔
21
        self.input_data: ValidationDataInput = validation_data_input
1✔
22
        self.case_id: str = validation_data_input.case_id
1✔
23
        self.case_name: str = validation_data_input.case_name
1✔
24
        self.original_case: Case = self.get_case_to_copy()
1✔
25
        self.original_samples: list[Sample] = self.get_samples_to_copy()
1✔
26
        self.validation_samples: list[Sample] = self.get_validation_samples()
1✔
27
        self.validation_case: Case = self._generate_validation_case()
1✔
28
        LOG.info(f"Validation Data checks completed for {self.case_id}")
1✔
29

30
    @staticmethod
1✔
31
    def _validation_sample_id(sample: Sample) -> str:
1✔
32
        """Return a new validation sample identifier. The identifier removes "ACC" and prepends "VAL"."""
33
        return "VAL" + sample.internal_id[3:]
1✔
34

35
    @property
1✔
36
    def validation_case_name(
1✔
37
        self,
38
    ) -> str:
39
        """Return a case name with _validation appended."""
40
        return f"{self.case_name}_validation"
1✔
41

42
    def get_samples_to_copy(self) -> list[Sample]:
1✔
43
        """
44
        Return samples associated to a case.
45
        """
46
        case: Case = self.status_db.get_case_by_internal_id(self.case_id)
1✔
47
        return [sample for sample in case.samples]
1✔
48

49
    def get_case_to_copy(self) -> Case:
1✔
50
        """
51
        Check if a case exists in StatusDB.
52
            Raises: ValueError
53
        """
54
        case: Case = self.status_db.get_case_by_internal_id(self.case_id)
1✔
55
        if not case:
1✔
NEW
56
            raise ValueError(f"Case {self.case_id} not found in StatusDB.")
×
57
        return case
1✔
58

59
    def _generate_validation_samples(
1✔
60
        self,
61
        original_sample: Sample,
62
    ) -> Sample:
63
        """
64
        Generate a validation sample record for StatusDB.
65
        The new sample contains the original sample internal id and meta data
66
        """
67
        application_version: ApplicationVersion = self._get_application_version(original_sample)
1✔
68
        sample_id: str = self._validation_sample_id(original_sample)
1✔
69
        validation_sample: Sample = self.status_db.add_sample(
1✔
70
            name=sample_id,
71
            internal_id=sample_id,
72
            sex=original_sample.sex,
73
            order=original_sample.order,
74
            from_sample=original_sample.internal_id,
75
            tumour=original_sample.is_tumour,
76
            priority=Priority.standard,
77
            customer=CustomerId.CG_INTERNAL_CUSTOMER,
78
            application_version=application_version,
79
            received=original_sample.received_at,
80
            prepared_at=original_sample.prepared_at,
81
            last_sequenced_at=original_sample.last_sequenced_at,
82
        )
83
        return validation_sample
1✔
84

85
    def get_validation_samples(self):
1✔
86
        return [self._generate_validation_samples(sample) for sample in self.original_samples]
1✔
87

88
    def _generate_validation_case(
1✔
89
        self,
90
    ) -> Case:
91
        """
92
        Generate a case for the validation samples.
93
        The new case uses existing case data.
94
        Customer will be set to cust000.
95
        """
96
        if self.status_db.case_with_name_exists(case_name=self.validation_case_name):
1✔
NEW
97
            raise ValueError(f"Case with name {self.case_name} already exists.")
×
98
        validation_case: Case = self.status_db.add_case(
1✔
99
            data_analysis=(self.input_data.data_analysis or self.original_case.data_analysis),
100
            data_delivery=(self.input_data.delivery or self.original_case.data_delivery),
101
            name=self.validation_case_name,
102
            panels=self.original_case.panels,
103
            priority=Priority.standard,
104
            ticket=self.original_case.latest_ticket,
105
        )
106
        validation_case.orders.append(self.original_case.latest_order)
1✔
107
        validation_case.customer = CustomerId.CG_INTERNAL_CUSTOMER
1✔
108
        validation_case.is_compressible = False
1✔
109
        validation_case.action = CaseActions.HOLD
1✔
110
        return validation_case
1✔
111

112
    @staticmethod
1✔
113
    def _get_application_version(sample: Sample) -> ApplicationVersion:
1✔
114
        """Return the application version for a sample."""
115
        return sample.application_version
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

© 2026 Coveralls, Inc