From 404a58735d50f5fbc506536240d603c60917367c Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Tue, 2 Sep 2025 14:42:11 +0400 Subject: [PATCH] feat: deal's status and board update --- models/deal.py | 2 +- repositories/deal.py | 16 +++++++++++++--- schemas/deal.py | 7 +++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/models/deal.py b/models/deal.py index cdf701c..4adcb63 100644 --- a/models/deal.py +++ b/models/deal.py @@ -21,7 +21,7 @@ class Deal(BaseModel, IdMixin, SoftDeleteMixin, CreatedAtMixin): nullable=False, comment="Текущий статус", ) - status: Mapped["Status"] = relationship(lazy="noload") + status: Mapped["Status"] = relationship() board_id: Mapped[int] = mapped_column( ForeignKey("boards.id"), nullable=True, server_default="1" diff --git a/repositories/deal.py b/repositories/deal.py index 5ea36ac..88412c8 100644 --- a/repositories/deal.py +++ b/repositories/deal.py @@ -1,6 +1,7 @@ from typing import Optional from sqlalchemy import select +from sqlalchemy.orm import joinedload from models import Deal, CardStatusHistory, Board from repositories.base import BaseRepository @@ -22,7 +23,11 @@ class DealRepository(BaseRepository): id: Optional[int], name: Optional[str], ) -> tuple[list[Deal], int]: - stmt = select(Deal).where(Deal.is_deleted.is_(False)) + stmt = ( + select(Deal) + .options(joinedload(Deal.status), joinedload(Deal.board)) + .where(Deal.is_deleted.is_(False)) + ) if id: stmt = stmt.where(Deal.id == id) @@ -49,7 +54,11 @@ class DealRepository(BaseRepository): return list(result.scalars().all()), total_items async def get_by_id(self, deal_id: int) -> Optional[Deal]: - stmt = select(Deal).where(Deal.id == deal_id, Deal.is_deleted.is_(False)) + stmt = ( + select(Deal) + .options(joinedload(Deal.status), joinedload(Deal.board)) + .where(Deal.id == deal_id, Deal.is_deleted.is_(False)) + ) result = await self.session.execute(stmt) return result.scalar_one_or_none() @@ -58,11 +67,12 @@ class DealRepository(BaseRepository): self.session.add(deal) await self.session.commit() await self.session.refresh(deal) - return deal + return await self.get_by_id(deal.id) async def update(self, deal: Deal, data: UpdateDealSchema) -> Deal: deal.lexorank = data.lexorank if data.lexorank else deal.lexorank deal.name = data.name if data.name else deal.name + deal.board_id = data.board_id if data.board_id else deal.board_id if data.status_id and deal.status_id != data.status_id: deal.status_history.append( diff --git a/schemas/deal.py b/schemas/deal.py index c79d253..8bc7877 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -2,6 +2,8 @@ from datetime import datetime from typing import Optional from schemas.base import BaseSchema, BaseResponse, PaginationInfoSchema +from schemas.board import BoardSchema +from schemas.status import StatusSchema # region Entities @@ -11,8 +13,8 @@ class DealSchema(BaseSchema): id: int name: str lexorank: str - status_id: int - board_id: int + status: StatusSchema + board: BoardSchema created_at: datetime @@ -26,6 +28,7 @@ class CreateDealSchema(BaseSchema): class UpdateDealSchema(BaseSchema): name: Optional[str] = None lexorank: Optional[str] = None + board_id: Optional[int] = None status_id: Optional[int] = None