Skip to content

Commit

Permalink
Validate unique sample names per case
Browse files Browse the repository at this point in the history
  • Loading branch information
seallard committed Jul 29, 2024
1 parent 9a4708a commit ace5361
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 2 deletions.
5 changes: 5 additions & 0 deletions cg/services/order_validation_service/models/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,8 @@ class OrderNameRequiredError(OrderError):
class OccupiedWellError(CaseSampleError):
field: str = "well_position"
message: str = "Well is already occupied"


class ReusedSampleNameError(CaseSampleError):
field: str = "name"
message: str = "Sample name already used"
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
from cg.services.order_validation_service.models.errors import OccupiedWellError
from cg.services.order_validation_service.models.errors import (
OccupiedWellError,
ReusedSampleNameError,
)
from cg.services.order_validation_service.workflows.tomte.models.order import TomteOrder
from cg.services.order_validation_service.workflows.tomte.validation.inter_field.utils import (
_get_errors,
_get_excess_samples,
_get_plate_samples,
get_duplicate_sample_name_errors,
)


def validate_wells_contain_at_most_one_sample(order: TomteOrder) -> list[OccupiedWellError]:
samples_with_cases = _get_plate_samples(order)
samples = _get_excess_samples(samples_with_cases)
return _get_errors(samples)


def validate_unique_sample_names_in_cases(order: TomteOrder) -> list[ReusedSampleNameError]:
errors: list[ReusedSampleNameError] = []
for case in order.cases:
case_errors = get_duplicate_sample_name_errors(case)
errors.extend(case_errors)
return errors
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
from collections import Counter
from cg.models.orders.sample_base import ContainerEnum
from cg.services.order_validation_service.models.errors import OccupiedWellError
from cg.services.order_validation_service.models.errors import (
OccupiedWellError,
ReusedSampleNameError,
)
from cg.services.order_validation_service.workflows.tomte.models.case import TomteCase
from cg.services.order_validation_service.workflows.tomte.models.order import TomteOrder
from cg.services.order_validation_service.workflows.tomte.models.sample import (
Expand Down Expand Up @@ -47,3 +51,14 @@ def _get_sample_well_map(plate_samples_with_cases: list[tuple[TomteSample, Tomte
sample_well_map[sample.well_position] = []
sample_well_map[sample.well_position].append((sample, case))
return sample_well_map


def get_duplicate_sample_names(case: TomteCase) -> list[str]:
sample_names = [sample.name for sample in case.samples]
count = Counter(sample_names)
return list({name for name, freq in count.items() if freq > 1})


def get_duplicate_sample_name_errors(case: TomteCase) -> list[ReusedSampleNameError]:
sample_names = get_duplicate_sample_names(case)
return [ReusedSampleNameError(sample_name=name, case_name=case.name) for name in sample_names]

0 comments on commit ace5361

Please sign in to comment.