fix: service update fixed

This commit is contained in:
2025-09-28 12:45:19 +04:00
parent fbadddeada
commit c2594f9d55
2 changed files with 41 additions and 5 deletions

View File

@ -1,8 +1,11 @@
from sqlalchemy import delete
from modules.fulfillment_base.models import Service from modules.fulfillment_base.models import Service
from modules.fulfillment_base.models.service import ServicePriceRange from modules.fulfillment_base.models.service import ServicePriceRange
from modules.fulfillment_base.schemas.service import ( from modules.fulfillment_base.schemas.service import (
CreateServiceSchema, CreateServiceSchema,
UpdateServiceSchema, UpdateServiceSchema,
ServicePriceRangeSchema,
) )
from repositories.mixins import * from repositories.mixins import *
@ -17,20 +20,29 @@ class ServiceRepository(
entity_class = Service entity_class = Service
entity_not_found_msg = "Услуга не найдена" entity_not_found_msg = "Услуга не найдена"
async def create(self, data: CreateServiceSchema) -> int: def _process_get_all_stmt(self, stmt: Select) -> Select:
price_ranges = [] return stmt.order_by(Service.lexorank)
for range in data.price_ranges:
price_ranges.append( @staticmethod
def _price_ranges_schemas_to_models(
price_ranges: list[ServicePriceRangeSchema],
) -> list[ServicePriceRange]:
models = []
for range in price_ranges:
models.append(
ServicePriceRange( ServicePriceRange(
from_quantity=range.from_quantity, from_quantity=range.from_quantity,
to_quantity=range.to_quantity, to_quantity=range.to_quantity,
price=range.price, 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 = data.model_dump()
data_dict["price_ranges"] = price_ranges data_dict["price_ranges"] = price_ranges
data_dict["category_id"] = data.category.id
del data_dict["category"] del data_dict["category"]
service = Service(**data_dict) service = Service(**data_dict)
@ -39,7 +51,21 @@ class ServiceRepository(
await self.session.refresh(service) await self.session.refresh(service)
return service.id 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: 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) return await self._apply_update_data_to_model(service, data, True)
async def get_by_ids(self, ids: list[int]) -> list[Service]: async def get_by_ids(self, ids: list[int]) -> list[Service]:

View File

@ -1,5 +1,7 @@
from typing import Optional from typing import Optional
from pydantic import field_validator
from modules.fulfillment_base.schemas.service_category import ServiceCategorySchema from modules.fulfillment_base.schemas.service_category import ServiceCategorySchema
from schemas.base import BaseSchema, BaseResponse from schemas.base import BaseSchema, BaseResponse
@ -17,12 +19,20 @@ class ServicePriceRangeSchema(BaseSchema):
class CreateServiceSchema(BaseSchema): class CreateServiceSchema(BaseSchema):
name: str name: str
category: ServiceCategorySchema category: ServiceCategorySchema
category_id: Optional[int] = None
price: float price: float
service_type: int service_type: int
price_ranges: list[ServicePriceRangeSchema] price_ranges: list[ServicePriceRangeSchema]
cost: Optional[float] cost: Optional[float]
lexorank: str 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): class ServiceSchema(CreateServiceSchema):
id: int id: int