From 6fb9dcf6f0e1f6bef1332800003b5be1b56c94e0 Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Sat, 1 Mar 2025 17:04:55 +0400 Subject: [PATCH] feat: a few shipping products in box --- models/shipping.py | 39 ++++++++++++++++++++++----------------- routers/shipping.py | 10 +++++----- schemas/shipping.py | 31 ++++++++++++++----------------- services/card.py | 3 ++- services/shipping.py | 22 +++++----------------- 5 files changed, 48 insertions(+), 57 deletions(-) diff --git a/models/shipping.py b/models/shipping.py index 241cd39..8c4bd14 100644 --- a/models/shipping.py +++ b/models/shipping.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship from models import BaseModel if TYPE_CHECKING: - from models import Card, Product, Client + from models import Card, Product class Pallet(BaseModel): @@ -30,6 +30,24 @@ class Pallet(BaseModel): ) +class Box(BaseModel): + __tablename__ = 'boxes' + id: Mapped[int] = mapped_column(primary_key=True) + + shipping_products: Mapped[list['ShippingProduct']] = relationship( + back_populates='box', + uselist=True, + lazy='joined', + cascade='all, delete-orphan', + ) + + pallet_id: Mapped[Optional[int]] = mapped_column(ForeignKey('pallets.id')) + pallet: Mapped[Pallet] = relationship(back_populates='boxes') + + card_id: Mapped[Optional[int]] = mapped_column(ForeignKey('cards.id')) + card: Mapped['Card'] = relationship(back_populates='boxes') + + class ShippingProduct(BaseModel): __tablename__ = 'shipping_products' id: Mapped[int] = mapped_column(primary_key=True) @@ -38,21 +56,8 @@ class ShippingProduct(BaseModel): product_id: Mapped[int] = mapped_column(ForeignKey('products.id')) product: Mapped['Product'] = relationship(lazy='joined') - pallet_id: Mapped[int] = mapped_column(ForeignKey('pallets.id')) - pallet: Mapped['Pallet'] = relationship(lazy='joined') - - -class Box(BaseModel): - __tablename__ = 'boxes' - id: Mapped[int] = mapped_column(primary_key=True) - - quantity: Mapped[int] = mapped_column(default=0) - - product_id: Mapped[Optional[int]] = mapped_column(ForeignKey('products.id'), nullable=True) - product: Mapped['Product'] = relationship(lazy='joined') - pallet_id: Mapped[Optional[int]] = mapped_column(ForeignKey('pallets.id')) - pallet: Mapped[Pallet] = relationship(back_populates='boxes') + pallet: Mapped[Optional['Pallet']] = relationship(lazy='joined') - card_id: Mapped[Optional[int]] = mapped_column(ForeignKey('cards.id')) - card: Mapped['Card'] = relationship(back_populates='boxes') + box_id: Mapped[Optional[int]] = mapped_column(ForeignKey('boxes.id')) + box: Mapped[Optional['Box']] = relationship(lazy='joined') diff --git a/routers/shipping.py b/routers/shipping.py index 697e609..bff12e1 100644 --- a/routers/shipping.py +++ b/routers/shipping.py @@ -68,15 +68,15 @@ async def delete_shipping_product( @shipping_router.post( '/box', - response_model=UpdateBoxResponse, - operation_id='update_box', + response_model=CreateBoxResponse, + operation_id='create_box', dependencies=[Depends(authorized_user)], ) -async def update_box( +async def create_box( session: SessionDependency, - request: UpdateBoxRequest, + request: CreateBoxRequest, ): - return await ShippingService(session).update_box(request) + return await ShippingService(session).create_box(request) @shipping_router.delete( diff --git a/schemas/shipping.py b/schemas/shipping.py index a0e8f50..7081ace 100644 --- a/schemas/shipping.py +++ b/schemas/shipping.py @@ -11,19 +11,19 @@ class ProductAndQuantitySchema(BaseSchema): quantity: Optional[int] -class BoxSchema(BaseSchema): - id: int - quantity: int - product: Optional[ProductSchema] - pallet_id: Optional[int] - card_id: Optional[int] - - class ShippingProductSchema(BaseSchema): id: int quantity: int product: ProductSchema - pallet_id: int + pallet_id: Optional[int] + box_id: Optional[int] + + +class BoxSchema(BaseSchema): + id: int + pallet_id: Optional[int] + card_id: Optional[int] + shipping_products: list[ShippingProductSchema] class PalletSchema(BaseSchema): @@ -33,7 +33,8 @@ class PalletSchema(BaseSchema): class CreateShippingProductSchema(ProductAndQuantitySchema): - pallet_id: int + pallet_id: Optional[int] = None + box_id: Optional[int] = None class UpdateShippingProductSchema(ProductAndQuantitySchema): @@ -48,10 +49,6 @@ class CreateBoxInCardSchema(BaseSchema): card_id: Optional[int] -class UpdateBoxSchema(ProductAndQuantitySchema): - box_id: Optional[int] - - # endregion # region Requests @@ -60,8 +57,8 @@ class UpdateShippingProductRequest(BaseSchema): data: CreateShippingProductSchema | UpdateShippingProductSchema -class UpdateBoxRequest(BaseSchema): - data: CreateBoxInCardSchema | CreateBoxInPalletSchema | UpdateBoxSchema +class CreateBoxRequest(BaseSchema): + data: CreateBoxInCardSchema | CreateBoxInPalletSchema # endregion @@ -80,7 +77,7 @@ class UpdateShippingProductResponse(OkMessageSchema): pass -class UpdateBoxResponse(OkMessageSchema): +class CreateBoxResponse(OkMessageSchema): pass diff --git a/services/card.py b/services/card.py index 92cb646..289469b 100644 --- a/services/card.py +++ b/services/card.py @@ -322,7 +322,8 @@ class CardsService(BaseService): .selectinload(ShippingProduct.product) .noload(Product.barcodes), selectinload(Card.boxes) - .selectinload(Box.product) + .selectinload(Box.shipping_products) + .selectinload(ShippingProduct.product) .noload(Product.barcodes), selectinload(Card.employees) .joinedload(CardEmployees.user), diff --git a/services/shipping.py b/services/shipping.py index c02fd71..192b6e3 100644 --- a/services/shipping.py +++ b/services/shipping.py @@ -26,16 +26,6 @@ class ShippingService(BaseService): await self.session.commit() return DeletePalletResponse(ok=True, message="Паллет успешно удален") - async def _update_box(self, data: UpdateBoxSchema) -> tuple[bool, str]: - box = await self.session.get(Box, data.box_id) - if not box: - return False, f"Короб с ID:{data.box_id} не найден" - - box.quantity = data.quantity - box.product_id = data.product_id - await self.session.commit() - return True, "Короб обновлен" - async def _create_box(self, data: CreateBoxInCardSchema | CreateBoxInPalletSchema): box = Box(**data.model_dump()) self.session.add(box) @@ -59,16 +49,14 @@ class ShippingService(BaseService): return True, f"Короб добавлен в паллет" - async def update_box(self, request: UpdateBoxRequest) -> UpdateBoxResponse: + async def create_box(self, request: CreateBoxRequest) -> CreateBoxResponse: data_keys = request.data.model_dump().keys() - if "box_id" in data_keys: - ok, message = await self._update_box(request.data) - elif "pallet_id" in data_keys: + if "pallet_id" in data_keys: ok, message = await self._create_box_in_pallet(CreateBoxInPalletSchema.model_validate(request.data)) else: ok, message = await self._create_box_in_card(CreateBoxInCardSchema.model_validate(request.data)) - return UpdateBoxResponse(ok=ok, message=message) + return CreateBoxResponse(ok=ok, message=message) async def delete_box(self, deal_id: int) -> DeleteBoxResponse: box = await self.session.get(Box, deal_id) @@ -94,13 +82,13 @@ class ShippingService(BaseService): shipping_product.product_id = data.product_id shipping_product.quantity = data.quantity await self.session.commit() - return True, "Запись о товаре на паллете успешно изменена" + return True, "Запись о товаре успешно изменена" async def _create_shipping_product(self, data: CreateShippingProductSchema) -> tuple[bool, str]: shipping_product = ShippingProduct(**data.model_dump()) self.session.add(shipping_product) await self.session.commit() - return True, "Запись о товаре на паллете успешно добавлена" + return True, "Запись о товаре успешно добавлена" async def update_shipping_product(self, request: UpdateShippingProductRequest) -> UpdateShippingProductResponse: data_keys = request.data.model_dump().keys()