from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel from models.mixins import SoftDeleteMixin, IdMixin, CreatedAtMixin if TYPE_CHECKING: from models import Board, Deal class Status(BaseModel, IdMixin, SoftDeleteMixin): __tablename__ = "statuses" name: Mapped[str] = mapped_column(nullable=False) lexorank: Mapped[str] = mapped_column(nullable=False) board_id: Mapped[int] = mapped_column(ForeignKey("boards.id"), nullable=False) board: Mapped["Board"] = relationship(back_populates="statuses") class DealStatusHistory(BaseModel, IdMixin, CreatedAtMixin): __tablename__ = "status_history" deal_id: Mapped[int] = mapped_column(ForeignKey("deals.id"), nullable=False) deal: Mapped["Deal"] = relationship(back_populates="status_history") from_status_id: Mapped[int] = mapped_column( ForeignKey("statuses.id"), nullable=False, comment="Старый статус", ) from_status: Mapped[Status] = relationship( foreign_keys=[from_status_id], lazy="joined", ) to_status_id: Mapped[int] = mapped_column( ForeignKey("statuses.id"), nullable=False, comment="Новый статус", ) to_status: Mapped[Status] = relationship( foreign_keys=[to_status_id], lazy="joined", )