from typing import TYPE_CHECKING, Optional from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship, backref from models.base import BaseModel from models.mixins import SoftDeleteMixin, CreatedAtMixin, IdMixin if TYPE_CHECKING: from models import Status, Board, DealStatusHistory, DealGroup, DealTag from modules.clients.models import Client class Deal(BaseModel, IdMixin, SoftDeleteMixin, CreatedAtMixin): __tablename__ = "deals" name: Mapped[str] = mapped_column() lexorank: Mapped[str] = mapped_column() status_id: Mapped[int] = mapped_column( ForeignKey("statuses.id"), comment="Текущий статус", ) status: Mapped["Status"] = relationship() board_id: Mapped[Optional[int]] = mapped_column( ForeignKey("boards.id"), server_default="1" ) board: Mapped[Optional["Board"]] = relationship(back_populates="deals") status_history: Mapped[list["DealStatusHistory"]] = relationship( back_populates="deal", cascade="all, delete-orphan", lazy="noload", ) group_id: Mapped[Optional[int]] = mapped_column( ForeignKey("deal_groups.id"), default=None, server_default=None ) group: Mapped[Optional["DealGroup"]] = relationship( lazy="noload", back_populates="deals" ) tags: Mapped[list["DealTag"]] = relationship( secondary="deals_deal_tags", back_populates="deals", lazy="selectin", primaryjoin="Deal.id == deals_deal_tags.c.deal_id", secondaryjoin="and_(DealTag.id == deals_deal_tags.c.deal_tag_id, DealTag.is_deleted == False)", ) # module client client_id: Mapped[Optional[int]] = mapped_column( ForeignKey("clients.id", ondelete="CASCADE"), ) client: Mapped["Client"] = relationship( backref=backref("deals", cascade="all, delete-orphan"), lazy="immediate" )