from datetime import datetime from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.sql import expression from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel if TYPE_CHECKING: from models import User class WorkShift(BaseModel): __tablename__ = "work_shifts" id: Mapped[int] = mapped_column(primary_key=True) started_at: Mapped[datetime] = mapped_column( nullable=False, ) finished_at: Mapped[datetime] = mapped_column( nullable=True, ) is_paused: Mapped[bool] = mapped_column( default=False, server_default=expression.false(), ) user_id: Mapped[int] = mapped_column( ForeignKey("users.id"), ) user: Mapped["User"] = relationship( "User", back_populates="work_shifts", lazy="selectin", ) pauses: Mapped[list["WorkShiftPause"]] = relationship( "WorkShiftPause", back_populates="work_shift", uselist=True, foreign_keys="[WorkShiftPause.work_shift_id]", cascade="all, delete", ) class WorkShiftPause(BaseModel): __tablename__ = "work_shifts_pauses" id: Mapped[int] = mapped_column(primary_key=True) started_at: Mapped[datetime] = mapped_column( nullable=False, ) finished_at: Mapped[datetime] = mapped_column( nullable=True, ) work_shift_id: Mapped[int] = mapped_column( ForeignKey("work_shifts.id"), ) work_shift: Mapped[WorkShift] = relationship( "WorkShift", back_populates="pauses", lazy="selectin", )