diff --git a/models/auth.py b/models/auth.py index 1456c81..02cb41d 100644 --- a/models/auth.py +++ b/models/auth.py @@ -8,6 +8,7 @@ from models.base import BaseModel if TYPE_CHECKING: from models.payroll import PayRate, PaymentRecord + from models import Deal role_permissions = Table( 'role_permissions', @@ -92,6 +93,11 @@ class User(BaseModel): foreign_keys="PaymentRecord.user_id" ) + managed_deals: Mapped[list["Deal"]] = relationship( + back_populates="manager", + uselist=True, + ) + class Position(BaseModel): __tablename__ = 'positions' diff --git a/models/deal.py b/models/deal.py index 4d7c19c..82b8689 100644 --- a/models/deal.py +++ b/models/deal.py @@ -10,9 +10,12 @@ from .marketplace import BaseMarketplace from .shipping_warehouse import ShippingWarehouse if TYPE_CHECKING: - from . import (DealBillRequest, ServicePriceCategory, - DealGroup - ) + from . import ( + DealBillRequest, + ServicePriceCategory, + DealGroup, + User, + ) # @unique @@ -98,6 +101,9 @@ class Deal(BaseModel): back_populates='deals' ) + manager_id: Mapped[int] = mapped_column(ForeignKey('users.id'), nullable=True) + manager: Mapped[Optional["User"]] = relationship(back_populates='managed_deals', lazy='joined') + class DealStatusHistory(BaseModel): __tablename__ = 'deals_status_history' diff --git a/routers/user.py b/routers/user.py index 452a65f..8593a5c 100644 --- a/routers/user.py +++ b/routers/user.py @@ -45,3 +45,14 @@ async def create( request: CreateUserRequest ): return await UserService(session).create(request) + + +@user_router.get( + '/get-managers', + response_model=GetManagersResponse, + operation_id='get_managers', +) +async def get_managers( + session: SessionDependency, +): + return await UserService(session).get_managers() diff --git a/schemas/deal.py b/schemas/deal.py index 1ddc03f..2419683 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -99,6 +99,7 @@ class DealSchema(BaseSchema): shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None bill_request: Optional[DealBillRequestSchema] = None category: Optional[ServicePriceCategorySchema] = None + manager: Optional[UserSchema] = None delivery_date: Optional[datetime.datetime] = None receiving_slot_date: Optional[datetime.datetime] = None @@ -112,6 +113,7 @@ class DealGeneralInfoSchema(BaseSchema): shipping_warehouse: Optional[str] = None delivery_date: Optional[datetime.datetime] = None receiving_slot_date: Optional[datetime.datetime] = None + manager: Optional[UserSchema] = None # endregion Entities diff --git a/schemas/user.py b/schemas/user.py index 6a54ee2..cf97d47 100644 --- a/schemas/user.py +++ b/schemas/user.py @@ -63,4 +63,9 @@ class UpdateUserResponse(OkMessageSchema): class CreateUserResponse(OkMessageSchema): pass + + +class GetManagersResponse(BaseSchema): + managers: List[UserSchema] + # endregion diff --git a/services/deal.py b/services/deal.py index 1e32ab4..8c317be 100644 --- a/services/deal.py +++ b/services/deal.py @@ -18,6 +18,7 @@ from services.client import ClientService from services.deal_group import DealGroupService from services.service import ServiceService from services.shipping_warehouse import ShippingWarehouseService +from services.user import UserService class DealService(BaseService): @@ -357,6 +358,14 @@ class DealService(BaseService): shipping_warehouse = await shipping_warehouse_service.create_by_name(request.data.shipping_warehouse) deal.shipping_warehouse = shipping_warehouse + + # Updating manager + if request.data.manager: + user_service = UserService(self.session) + user = await user_service.get_by_id(request.data.manager.id) + deal.manager = user + else: + deal.manager = None await self.session.commit() return DealUpdateGeneralInfoResponse(ok=True, message='Данные о сделке успешно обновлены') except Exception as e: diff --git a/services/user.py b/services/user.py index fba6a13..2deb23e 100644 --- a/services/user.py +++ b/services/user.py @@ -1,4 +1,4 @@ -from sqlalchemy import select, update, delete, insert +from sqlalchemy import select, update, delete, insert, and_ from models import User, user_position, user_pay_rate from services.base import BaseService @@ -16,6 +16,16 @@ class UserService(BaseService): users_schemas = [UserSchema.model_validate(user) for user in users] return GetAllUsersResponse(users=users_schemas) + async def get_managers(self) -> GetManagersResponse: + stmt = ( + select(User) + .order_by(User.id.desc()) + .where(and_(User.is_deleted == False, User.role_key == "employee")) + ) + users = (await self.session.scalars(stmt)).all() + users_schemas = [UserSchema.model_validate(user) for user in users] + return GetManagersResponse(managers=users_schemas) + async def get_by_id(self, user_id: int) -> Optional[User]: return await self.session.scalar(select(User).where(User.id == user_id))