From c2594f9d55000c01f66a1aedc2a92941dd9a3275 Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Sun, 28 Sep 2025 12:45:19 +0400 Subject: [PATCH] fix: service update fixed --- .../fulfillment_base/repositories/service.py | 36 ++++++++++++++++--- modules/fulfillment_base/schemas/service.py | 10 ++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/modules/fulfillment_base/repositories/service.py b/modules/fulfillment_base/repositories/service.py index 6f38af3..fe4e542 100644 --- a/modules/fulfillment_base/repositories/service.py +++ b/modules/fulfillment_base/repositories/service.py @@ -1,8 +1,11 @@ +from sqlalchemy import delete + from modules.fulfillment_base.models import Service from modules.fulfillment_base.models.service import ServicePriceRange from modules.fulfillment_base.schemas.service import ( CreateServiceSchema, UpdateServiceSchema, + ServicePriceRangeSchema, ) from repositories.mixins import * @@ -17,20 +20,29 @@ class ServiceRepository( entity_class = Service entity_not_found_msg = "Услуга не найдена" - async def create(self, data: CreateServiceSchema) -> int: - price_ranges = [] - for range in data.price_ranges: - price_ranges.append( + def _process_get_all_stmt(self, stmt: Select) -> Select: + return stmt.order_by(Service.lexorank) + + @staticmethod + def _price_ranges_schemas_to_models( + price_ranges: list[ServicePriceRangeSchema], + ) -> list[ServicePriceRange]: + models = [] + for range in price_ranges: + models.append( ServicePriceRange( from_quantity=range.from_quantity, to_quantity=range.to_quantity, price=range.price, ) ) + return models + + async def create(self, data: CreateServiceSchema) -> int: + price_ranges = self._price_ranges_schemas_to_models(data.price_ranges) data_dict = data.model_dump() data_dict["price_ranges"] = price_ranges - data_dict["category_id"] = data.category.id del data_dict["category"] service = Service(**data_dict) @@ -39,7 +51,21 @@ class ServiceRepository( await self.session.refresh(service) return service.id + async def _delete_price_ranges_by_service_id(self, service_id: int) -> None: + stmt = delete(ServicePriceRange).where( + ServicePriceRange.service_id == service_id + ) + await self.session.execute(stmt) + await self.session.commit() + async def update(self, service: Service, data: UpdateServiceSchema) -> Service: + await self._delete_price_ranges_by_service_id(service.id) + price_ranges = self._price_ranges_schemas_to_models(data.price_ranges) + for price_range in price_ranges: + service.price_ranges.append(price_range) + del data.price_ranges + del data.category + return await self._apply_update_data_to_model(service, data, True) async def get_by_ids(self, ids: list[int]) -> list[Service]: diff --git a/modules/fulfillment_base/schemas/service.py b/modules/fulfillment_base/schemas/service.py index 7c67094..ea2e882 100644 --- a/modules/fulfillment_base/schemas/service.py +++ b/modules/fulfillment_base/schemas/service.py @@ -1,5 +1,7 @@ from typing import Optional +from pydantic import field_validator + from modules.fulfillment_base.schemas.service_category import ServiceCategorySchema from schemas.base import BaseSchema, BaseResponse @@ -17,12 +19,20 @@ class ServicePriceRangeSchema(BaseSchema): class CreateServiceSchema(BaseSchema): name: str category: ServiceCategorySchema + category_id: Optional[int] = None price: float service_type: int price_ranges: list[ServicePriceRangeSchema] cost: Optional[float] lexorank: str + @field_validator("category_id", mode="before") + @classmethod + def set_category_id(cls, v, info): + if v is None and "category" in info.data: + return info.data["category"].id + return v + class ServiceSchema(CreateServiceSchema): id: int