feat: setting manager for a deal
This commit is contained in:
		@@ -8,6 +8,7 @@ from models.base import BaseModel
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if TYPE_CHECKING:
 | 
					if TYPE_CHECKING:
 | 
				
			||||||
    from models.payroll import PayRate, PaymentRecord
 | 
					    from models.payroll import PayRate, PaymentRecord
 | 
				
			||||||
 | 
					    from models import Deal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
role_permissions = Table(
 | 
					role_permissions = Table(
 | 
				
			||||||
    'role_permissions',
 | 
					    'role_permissions',
 | 
				
			||||||
@@ -92,6 +93,11 @@ class User(BaseModel):
 | 
				
			|||||||
        foreign_keys="PaymentRecord.user_id"
 | 
					        foreign_keys="PaymentRecord.user_id"
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    managed_deals: Mapped[list["Deal"]] = relationship(
 | 
				
			||||||
 | 
					        back_populates="manager",
 | 
				
			||||||
 | 
					        uselist=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Position(BaseModel):
 | 
					class Position(BaseModel):
 | 
				
			||||||
    __tablename__ = 'positions'
 | 
					    __tablename__ = 'positions'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,8 +10,11 @@ from .marketplace import BaseMarketplace
 | 
				
			|||||||
from .shipping_warehouse import ShippingWarehouse
 | 
					from .shipping_warehouse import ShippingWarehouse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if TYPE_CHECKING:
 | 
					if TYPE_CHECKING:
 | 
				
			||||||
    from . import (DealBillRequest, ServicePriceCategory,
 | 
					    from . import (
 | 
				
			||||||
                   DealGroup
 | 
					        DealBillRequest,
 | 
				
			||||||
 | 
					        ServicePriceCategory,
 | 
				
			||||||
 | 
					        DealGroup,
 | 
				
			||||||
 | 
					        User,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -98,6 +101,9 @@ class Deal(BaseModel):
 | 
				
			|||||||
        back_populates='deals'
 | 
					        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):
 | 
					class DealStatusHistory(BaseModel):
 | 
				
			||||||
    __tablename__ = 'deals_status_history'
 | 
					    __tablename__ = 'deals_status_history'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,3 +45,14 @@ async def create(
 | 
				
			|||||||
        request: CreateUserRequest
 | 
					        request: CreateUserRequest
 | 
				
			||||||
):
 | 
					):
 | 
				
			||||||
    return await UserService(session).create(request)
 | 
					    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()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -99,6 +99,7 @@ class DealSchema(BaseSchema):
 | 
				
			|||||||
    shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None
 | 
					    shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None
 | 
				
			||||||
    bill_request: Optional[DealBillRequestSchema] = None
 | 
					    bill_request: Optional[DealBillRequestSchema] = None
 | 
				
			||||||
    category: Optional[ServicePriceCategorySchema] = None
 | 
					    category: Optional[ServicePriceCategorySchema] = None
 | 
				
			||||||
 | 
					    manager: Optional[UserSchema] = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delivery_date: Optional[datetime.datetime] = None
 | 
					    delivery_date: Optional[datetime.datetime] = None
 | 
				
			||||||
    receiving_slot_date: Optional[datetime.datetime] = None
 | 
					    receiving_slot_date: Optional[datetime.datetime] = None
 | 
				
			||||||
@@ -112,6 +113,7 @@ class DealGeneralInfoSchema(BaseSchema):
 | 
				
			|||||||
    shipping_warehouse: Optional[str] = None
 | 
					    shipping_warehouse: Optional[str] = None
 | 
				
			||||||
    delivery_date: Optional[datetime.datetime] = None
 | 
					    delivery_date: Optional[datetime.datetime] = None
 | 
				
			||||||
    receiving_slot_date: Optional[datetime.datetime] = None
 | 
					    receiving_slot_date: Optional[datetime.datetime] = None
 | 
				
			||||||
 | 
					    manager: Optional[UserSchema] = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion Entities
 | 
					# endregion Entities
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,4 +63,9 @@ class UpdateUserResponse(OkMessageSchema):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class CreateUserResponse(OkMessageSchema):
 | 
					class CreateUserResponse(OkMessageSchema):
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GetManagersResponse(BaseSchema):
 | 
				
			||||||
 | 
					    managers: List[UserSchema]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ from services.client import ClientService
 | 
				
			|||||||
from services.deal_group import DealGroupService
 | 
					from services.deal_group import DealGroupService
 | 
				
			||||||
from services.service import ServiceService
 | 
					from services.service import ServiceService
 | 
				
			||||||
from services.shipping_warehouse import ShippingWarehouseService
 | 
					from services.shipping_warehouse import ShippingWarehouseService
 | 
				
			||||||
 | 
					from services.user import UserService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DealService(BaseService):
 | 
					class DealService(BaseService):
 | 
				
			||||||
@@ -357,6 +358,14 @@ class DealService(BaseService):
 | 
				
			|||||||
                shipping_warehouse = await shipping_warehouse_service.create_by_name(request.data.shipping_warehouse)
 | 
					                shipping_warehouse = await shipping_warehouse_service.create_by_name(request.data.shipping_warehouse)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            deal.shipping_warehouse = 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()
 | 
					            await self.session.commit()
 | 
				
			||||||
            return DealUpdateGeneralInfoResponse(ok=True, message='Данные о сделке успешно обновлены')
 | 
					            return DealUpdateGeneralInfoResponse(ok=True, message='Данные о сделке успешно обновлены')
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 models import User, user_position, user_pay_rate
 | 
				
			||||||
from services.base import BaseService
 | 
					from services.base import BaseService
 | 
				
			||||||
@@ -16,6 +16,16 @@ class UserService(BaseService):
 | 
				
			|||||||
        users_schemas = [UserSchema.model_validate(user) for user in users]
 | 
					        users_schemas = [UserSchema.model_validate(user) for user in users]
 | 
				
			||||||
        return GetAllUsersResponse(users=users_schemas)
 | 
					        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]:
 | 
					    async def get_by_id(self, user_id: int) -> Optional[User]:
 | 
				
			||||||
        return await self.session.scalar(select(User).where(User.id == user_id))
 | 
					        return await self.session.scalar(select(User).where(User.id == user_id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user