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

Clinical-Genomics / cg / 8734548414

18 Apr 2024 08:10AM UTC coverage: 83.899%. First build
8734548414

Pull #3148

github

web-flow
Merge ea1962572 into 23a7e4995
Pull Request #3148: add(create validation case)

1 of 179 new or added lines in 5 files covered. (0.56%)

19358 of 23073 relevant lines covered (83.9%)

0.84 hits per line

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

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

NEW
3
import logging
×
NEW
4
from pathlib import Path
×
5

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

NEW
13
LOG = logging.getLogger(__name__)
×
14

15

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

NEW
32
    @staticmethod
×
NEW
33
    def _validation_sample_name(sample: Sample) -> str:
×
34
        """Return a new validation sample identifier. The identifier removes "ACC" and prepends "VAL"."""
NEW
35
        return sample.internal_id.replace("ACC", "VAL")
×
36

NEW
37
    @property
×
NEW
38
    def validation_case_name(
×
39
        self,
40
    ) -> str:
41
        """Return a case name with _validation appended."""
NEW
42
        return f"{self.case_name}_validation"
×
43

NEW
44
    def get_samples_to_copy(self) -> list[Sample]:
×
45
        """
46
        Return samples associated to a case.
47
        """
NEW
48
        case: Case = self.status_db.get_case_by_internal_id(self.case_id)
×
NEW
49
        return [sample.internal_id for sample in case._get_samples]
×
50

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

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

NEW
87
    def get_validation_samples(self):
×
NEW
88
        return [self._generate_validation_samples(sample) for sample in self.original_samples]
×
89

NEW
90
    def _generate_validation_case(
×
91
        self,
92
    ) -> Case:
93
        """
94
        Generate a case for the validation samples.
95
        The new case uses existing case data.
96
        Customer will be set to cust000.
97
        """
NEW
98
        if self.status_db.case_with_name_exists(case_name=self.validation_case_name):
×
NEW
99
            raise ValueError(f"Case with name {self.case_name} already exists.")
×
NEW
100
        validation_case: Case = self.status_db.add_case(
×
101
            data_analysis=(
102
                self.input_data.data_analysis
103
                if self.input_data.data_analysis
104
                else self.original_case.data_analysis
105
            ),
106
            data_delivery=(
107
                self.input_data.delivery
108
                if self.input_data.delivery
109
                else self.original_case.delivery
110
            ),
111
            name=self.validation_case_name,
112
            panels=self.original_case.panels,
113
            priority=self.original_case.priority,
114
            ticket=self.original_case.latest_ticket,
115
        )
NEW
116
        validation_case.orders.append(self.original_case.latest_order)
×
NEW
117
        validation_case.customer = "cust000"
×
NEW
118
        validation_case.is_compressible = False
×
NEW
119
        return validation_case
×
120

NEW
121
    @staticmethod
×
NEW
122
    def _get_application_version(sample: Sample) -> ApplicationVersion:
×
123
        """Return the application version for a sample."""
NEW
124
        return sample.application_version
×
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