From d8ec115fc883b72083f663d40ba2a1115c342188 Mon Sep 17 00:00:00 2001 From: islean Date: Thu, 23 Jan 2025 11:16:17 +0100 Subject: [PATCH 1/2] Patch skip rc --- cg/services/orders/validation/models/order.py | 6 ++++-- cg/services/orders/validation/models/utils.py | 2 ++ .../validation_service/test_model_validator.py | 12 ++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 cg/services/orders/validation/models/utils.py diff --git a/cg/services/orders/validation/models/order.py b/cg/services/orders/validation/models/order.py index 8f950f0c4c..ccc3d74341 100644 --- a/cg/services/orders/validation/models/order.py +++ b/cg/services/orders/validation/models/order.py @@ -1,7 +1,9 @@ -from pydantic import BaseModel, Field, PrivateAttr, model_validator +from pydantic import BaseModel, BeforeValidator, Field, PrivateAttr, model_validator +from typing_extensions import Annotated from cg.constants import DataDelivery from cg.models.orders.constants import OrderType +from cg.services.orders.validation.models.utils import set_null_to_false class Order(BaseModel): @@ -10,7 +12,7 @@ class Order(BaseModel): delivery_type: DataDelivery order_type: OrderType = Field(alias="project_type") name: str = Field(min_length=1) - skip_reception_control: bool = False + skip_reception_control: Annotated[bool, BeforeValidator(set_null_to_false)] = False _generated_ticket_id: int | None = PrivateAttr(default=None) _user_id: int = PrivateAttr(default=None) diff --git a/cg/services/orders/validation/models/utils.py b/cg/services/orders/validation/models/utils.py new file mode 100644 index 0000000000..1d8f27404c --- /dev/null +++ b/cg/services/orders/validation/models/utils.py @@ -0,0 +1,2 @@ +def set_null_to_false(value: bool | None) -> bool: + return value if value else False diff --git a/tests/services/orders/validation_service/test_model_validator.py b/tests/services/orders/validation_service/test_model_validator.py index c2ecb84068..bfff98c27d 100644 --- a/tests/services/orders/validation_service/test_model_validator.py +++ b/tests/services/orders/validation_service/test_model_validator.py @@ -130,3 +130,15 @@ def test_null_conversion(valid_order: TomteOrder, model_validator: ModelValidato # THEN the empty concentration should be converted to None assert order.cases[0].samples[0].concentration_ng_ul is None + + +def test_skip_rc_default_conversion(valid_order: TomteOrder, model_validator: ModelValidator): + # GIVEN a Tomte order with a sample with empty concentration + valid_order.skip_reception_control = None + raw_order: dict = valid_order.model_dump(by_alias=True) + + # WHEN validating the order + order, _ = model_validator.validate(order=raw_order, model=TomteOrder) + + # THEN the empty concentration should be converted to None + assert order.skip_reception_control is False From 11606ffe7ea4cbe042353179173fd2763976df38 Mon Sep 17 00:00:00 2001 From: islean Date: Thu, 23 Jan 2025 11:19:53 +0100 Subject: [PATCH 2/2] Fix test --- .../orders/validation_service/test_model_validator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/services/orders/validation_service/test_model_validator.py b/tests/services/orders/validation_service/test_model_validator.py index bfff98c27d..a68eeb760f 100644 --- a/tests/services/orders/validation_service/test_model_validator.py +++ b/tests/services/orders/validation_service/test_model_validator.py @@ -133,12 +133,12 @@ def test_null_conversion(valid_order: TomteOrder, model_validator: ModelValidato def test_skip_rc_default_conversion(valid_order: TomteOrder, model_validator: ModelValidator): - # GIVEN a Tomte order with a sample with empty concentration + # GIVEN a Tomte order with skip_reception_control set to None valid_order.skip_reception_control = None raw_order: dict = valid_order.model_dump(by_alias=True) # WHEN validating the order order, _ = model_validator.validate(order=raw_order, model=TomteOrder) - # THEN the empty concentration should be converted to None + # THEN the skip_reception_control value should be converted to None assert order.skip_reception_control is False