66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
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",
|
|
)
|