diff --git a/constants.py b/constants.py index a5fb0c4..b697b08 100644 --- a/constants.py +++ b/constants.py @@ -11,5 +11,6 @@ allowed_telegram_ids = [ 5734685107, # Seller manager, 355242295, # Dsnonchik 651158209, # kristina - 502869937 # Sasha + 502869937, # Sasha + 7399730533 ] diff --git a/models/shipping_warehouse.py b/models/shipping_warehouse.py index 78e5d52..b90d965 100644 --- a/models/shipping_warehouse.py +++ b/models/shipping_warehouse.py @@ -1,4 +1,4 @@ -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped, mapped_column, MapperEvents from models import BaseModel @@ -7,3 +7,4 @@ class ShippingWarehouse(BaseModel): __tablename__ = 'shipping_warehouses' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) + is_deleted: Mapped[bool] = mapped_column(nullable=False, default=False, server_default='0') diff --git a/routers/shipping_warehouse.py b/routers/shipping_warehouse.py index 7e0ba4e..f197176 100644 --- a/routers/shipping_warehouse.py +++ b/routers/shipping_warehouse.py @@ -1,10 +1,12 @@ +from idlelib.rpc import response_queue from typing import Annotated from fastapi import APIRouter, Depends from sqlalchemy.ext.asyncio import AsyncSession +from backend.dependecies import SessionDependency from backend.session import get_session -from schemas.shipping_warehouse import GetAllShippingWarehousesResponse +from schemas.shipping_warehouse import * from services.auth import authorized_user from services.shipping_warehouse import ShippingWarehouseService @@ -26,3 +28,38 @@ async def get_all( return await ShippingWarehouseService(session).get_all() +@shipping_warehouse_router.post( + '/create', + response_model=CreateShippingWarehouseResponse, + operation_id='create_shipping_warehouse' +) +async def create( + session: SessionDependency, + request: CreateShippingWarehouseRequest +): + return await ShippingWarehouseService(session).create(request) + + +@shipping_warehouse_router.post( + '/update', + response_model=UpdateShippingWarehouseResponse, + operation_id='update_shipping_warehouse' +) +async def update( + session: SessionDependency, + request: UpdateShippingWarehouseRequest +): + return await ShippingWarehouseService(session).update(request) + + + +@shipping_warehouse_router.post( + '/delete', + response_model=DeleteShippingWarehouseResponse, + operation_id='delete_shipping_warehouse' +) +async def delete( + session: SessionDependency, + request: DeleteShippingWarehouseRequest +): + return await ShippingWarehouseService(session).delete(request) diff --git a/schemas/deal.py b/schemas/deal.py index 19653f5..eac731b 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -33,6 +33,8 @@ class DealSummary(BaseSchema): rank: int base_marketplace: Optional[BaseMarketplaceSchema] = None + shipment_warehouse_id: Optional[int] + class DealServiceSchema(BaseSchema): service: ServiceSchema diff --git a/schemas/shipping_warehouse.py b/schemas/shipping_warehouse.py index b527749..9ea9896 100644 --- a/schemas/shipping_warehouse.py +++ b/schemas/shipping_warehouse.py @@ -1,12 +1,47 @@ from typing import List -from schemas.base import BaseSchema +from schemas.base import BaseSchema, OkMessageSchema -class ShippingWarehouseSchema(BaseSchema): - id: int +# region Entities +class BaseShippingWarehouseSchema(BaseSchema): name: str +class ShippingWarehouseSchema(BaseShippingWarehouseSchema): + id: int + + +# endregion + +# region Requests +class CreateShippingWarehouseRequest(BaseSchema): + shipping_warehouse: BaseShippingWarehouseSchema + + +class UpdateShippingWarehouseRequest(BaseSchema): + shipping_warehouse: ShippingWarehouseSchema + + +class DeleteShippingWarehouseRequest(BaseSchema): + shipping_warehouse_id: int + + +# endregion + +# region Responses class GetAllShippingWarehousesResponse(BaseSchema): shipping_warehouses: List[ShippingWarehouseSchema] + + +class CreateShippingWarehouseResponse(OkMessageSchema): + pass + + +class UpdateShippingWarehouseResponse(OkMessageSchema): + pass + + +class DeleteShippingWarehouseResponse(OkMessageSchema): + pass +# endregion diff --git a/services/deal.py b/services/deal.py index 2d274cf..28fb18a 100644 --- a/services/deal.py +++ b/services/deal.py @@ -213,7 +213,8 @@ class DealService(BaseService): total_price=total_price, rank=rank, base_marketplace=base_marketplace, - created_at=deal.created_at + created_at=deal.created_at, + shipment_warehouse_id=deal.shipping_warehouse_id ) ) return DealSummaryResponse(summaries=summaries) diff --git a/services/shipping_warehouse.py b/services/shipping_warehouse.py index 4f391e7..c0e342f 100644 --- a/services/shipping_warehouse.py +++ b/services/shipping_warehouse.py @@ -1,9 +1,13 @@ +from idlelib.rpc import response_queue from typing import Union -from sqlalchemy import select +from sqlalchemy import select, update, delete import models -from schemas.shipping_warehouse import GetAllShippingWarehousesResponse, ShippingWarehouseSchema +from models import ShippingWarehouse +from schemas.shipping_warehouse import GetAllShippingWarehousesResponse, ShippingWarehouseSchema, \ + CreateShippingWarehouseResponse, CreateShippingWarehouseRequest, UpdateShippingWarehouseRequest, \ + UpdateShippingWarehouseResponse, DeleteShippingWarehouseRequest, DeleteShippingWarehouseResponse from services.base import BaseService @@ -13,6 +17,9 @@ class ShippingWarehouseService(BaseService): select( models.ShippingWarehouse ) + .where( + models.ShippingWarehouse.is_deleted == False + ) .order_by( models.ShippingWarehouse.id ) @@ -24,7 +31,15 @@ class ShippingWarehouseService(BaseService): return GetAllShippingWarehousesResponse(shipping_warehouses=result) async def get_by_name(self, name: str) -> Union[models.ShippingWarehouse, None]: - stmt = select(models.ShippingWarehouse).where(models.ShippingWarehouse.name == name) + stmt = ( + select( + models.ShippingWarehouse + ) + .where( + models.ShippingWarehouse.name == name, + models.ShippingWarehouse.is_deleted == False + ) + ) shipping_warehouse = await self.session.scalar(stmt) return shipping_warehouse @@ -35,3 +50,60 @@ class ShippingWarehouseService(BaseService): self.session.add(shipping_warehouse) await self.session.flush() return shipping_warehouse + + async def create(self, request: CreateShippingWarehouseRequest) -> CreateShippingWarehouseResponse: + try: + if await self.get_by_name(request.shipping_warehouse.name): + return CreateShippingWarehouseResponse(ok=False, + message="Склад отгрузки с таким названием уже существует") + await self.create_by_name(request.shipping_warehouse.name) + await self.session.commit() + return CreateShippingWarehouseResponse( + ok=True, + message="Склад отгрузки успешно создан" + ) + except Exception as e: + return CreateShippingWarehouseResponse(ok=False, + message=str(e)) + + async def update(self, request: UpdateShippingWarehouseRequest) -> UpdateShippingWarehouseResponse: + try: + stmt = ( + update( + ShippingWarehouse + ) + .values( + request.shipping_warehouse.model_dump( + by_alias=False + ) + ) + .where( + ShippingWarehouse.id == request.shipping_warehouse.id + ) + ) + await self.session.execute( + stmt + ) + await self.session.commit() + return UpdateShippingWarehouseResponse(ok=True, message='Склад отгрузки успешно обновлен') + except Exception as e: + return UpdateShippingWarehouseResponse(ok=False, message=str(e)) + + async def delete(self, request: DeleteShippingWarehouseRequest) -> DeleteShippingWarehouseResponse: + try: + stmt = ( + update( + ShippingWarehouse + ) + .values({ + 'is_deleted': True + }) + .where( + ShippingWarehouse.id == request.shipping_warehouse_id + ) + ) + await self.session.execute(stmt) + await self.session.commit() + return DeleteShippingWarehouseResponse(ok=True, message='Склад отгрузки успешно удален') + except Exception as e: + return DeleteShippingWarehouseResponse(ok=False, message=str(e))