from datetime import datetime from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from models import BaseModel if TYPE_CHECKING: from models import Board, Card, User class CardStatus(BaseModel): __tablename__ = 'card_statuses' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) ordinal_number: Mapped[int] = mapped_column(nullable=False) is_finishing: Mapped[bool] = mapped_column(default=False, nullable=False) is_deleted: Mapped[bool] = mapped_column(default=False, nullable=False) board_id: Mapped[int] = mapped_column(ForeignKey('boards.id'), nullable=False) board: Mapped['Board'] = relationship('Board', back_populates='statuses') class CardStatusHistory(BaseModel): __tablename__ = 'cards_status_history' id: Mapped[int] = mapped_column(primary_key=True) card_id: Mapped[int] = mapped_column(ForeignKey('cards.id'), nullable=False, comment='ID карточки') card: Mapped['Card'] = relationship('Card', back_populates='status_history') user_id: Mapped[int] = mapped_column(ForeignKey('users.id'), nullable=False) user: Mapped['User'] = relationship('User') changed_at: Mapped[datetime] = mapped_column(nullable=False, comment='Дата и время когда произошла смена статуса') from_status_id: Mapped[int] = mapped_column( ForeignKey('card_statuses.id'), nullable=False, comment='Предыдущий статус', ) from_status: Mapped[CardStatus] = relationship( 'CardStatus', foreign_keys=[from_status_id], lazy='joined', ) to_status_id: Mapped[int] = mapped_column( ForeignKey('card_statuses.id'), nullable=False, comment='Новый статус', ) to_status: Mapped[CardStatus] = relationship( 'CardStatus', foreign_keys=[to_status_id], lazy='joined', ) next_status_deadline: Mapped[datetime] = mapped_column( comment='Дедлайн до которого сделку нужно перевести на следующий этап', ) comment: Mapped[str] = mapped_column(nullable=False, comment='Комментарий', server_default='')