From 21cfaaf1398d9313205fabc14afc2d22afb4c94e Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 10 Sep 2024 18:33:19 +0300 Subject: [PATCH] feat: complete deal --- models/client.py | 20 +++++++++++++++++++- routers/deal.py | 13 +++++++++++++ schemas/deal.py | 6 ++++++ services/deal.py | 16 ++++++++++++++++ utils/list_utils.py | 6 ++++++ 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/models/client.py b/models/client.py index 34d3812..55e7a3f 100644 --- a/models/client.py +++ b/models/client.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, BigInteger +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey from sqlalchemy.orm import relationship from models import BaseModel @@ -23,6 +23,7 @@ class Client(BaseModel): barcode_template_id = Column(Integer, ForeignKey('barcode_templates.id'), nullable=True) barcode_template = relationship('BarcodeTemplate', lazy='selectin') + # users = relationship('ClientUser', back_populates='client', cascade='all, delete') class ClientDetails(BaseModel): @@ -42,3 +43,20 @@ class ClientDetails(BaseModel): modified_by_user_id = Column(Integer, ForeignKey('users.id'), nullable=False) modified_by_user = relationship('User') + + +# class ClientContact(BaseModel): +# __tablename__ = 'client_contact' +# id: Mapped[int] = mapped_column(primary_key=True) +# +# client_id: Mapped[int] = mapped_column(ForeignKey('clients.id')) +# client: Mapped["Client"] = relationship('Client', back_populates='users') +# +# first_name: Mapped[str] = mapped_column() +# last_name: Mapped[str] = mapped_column() +# +# telegram: Mapped[str] = mapped_column() +# phone_number: Mapped[str] = mapped_column() +# email: Mapped[str] = mapped_column() +# inn: Mapped[str] = mapped_column() +# diff --git a/routers/deal.py b/routers/deal.py index c6daf6c..fa44f7e 100644 --- a/routers/deal.py +++ b/routers/deal.py @@ -42,6 +42,19 @@ async def delete( return await DealService(session).delete(request) +@deal_router.post( + '/complete', + response_model=DealCompleteResponse, + operation_id='completeDeal', + dependencies=[Depends(authorized_user)] +) +async def complete( + request: DealCompleteRequest, + session: SessionDependency, + user: CurrentUserDependency +): + return await DealService(session).complete(user,request) + @deal_router.post( '/quickCreate', response_model=DealQuickCreateResponse, diff --git a/schemas/deal.py b/schemas/deal.py index 2d7eabd..15c7f40 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -212,6 +212,8 @@ class DealAddKitRequest(BaseSchema): class DealCreateGuestUrlRequest(BaseSchema): deal_id: int +class DealCompleteRequest(BaseSchema): + deal_id: int # endregion Requests @@ -308,4 +310,8 @@ class DealAddKitResponse(OkMessageSchema): class DealCreateGuestUrlResponse(OkMessageSchema): url: str + +class DealCompleteResponse(OkMessageSchema): + pass + # endregion Responses diff --git a/services/deal.py b/services/deal.py index dcc122f..2bd6dda 100644 --- a/services/deal.py +++ b/services/deal.py @@ -972,4 +972,20 @@ class DealService(BaseService): return DealProductAddKitResponse(ok=True, message='Набор услуг успешно добавлен к товару') except Exception as e: return DealProductAddKitResponse(ok=False, message=str(e)) + # endregion + async def complete(self, user: User, request: DealCompleteRequest) -> DealCompleteResponse: + try: + # check for admin + if not user.is_admin: + return DealCompleteResponse(ok=False, message='Завершить сделку может только администратор') + + deal = await self._get_deal_by_id(request.deal_id) + if not deal: + return DealCompleteResponse(ok=False, message="Сделка не найдена") + deal.is_completed = True + await self.session.commit() + return DealCompleteResponse(ok=True, message="Сделка успешно завершена") + except Exception as e: + await self.session.rollback() + return DealCompleteResponse(ok=False, message=str(e)) diff --git a/utils/list_utils.py b/utils/list_utils.py index 2332ee2..c859f56 100644 --- a/utils/list_utils.py +++ b/utils/list_utils.py @@ -1,3 +1,9 @@ def chunk_list(lst, n) -> list: for i in range(0, len(lst), n): yield lst[i:i + n] + + +def compile_query_to_plain_sql(query) -> str: + return query.compile(compile_kwargs={ + 'literal_binds': True + })