from typing import List, Optional, TYPE_CHECKING if TYPE_CHECKING: from .inventory import Inventory from .rooms import Room from .work_log import WorkLog from sqlalchemy import Boolean, ForeignKey, Identity, Integer, Unicode, text from sqlalchemy.orm import Mapped, mapped_column, relationship from . import db class User(db.Model): __tablename__ = 'Users' id: Mapped[int] = mapped_column("ID", Integer, Identity(start=1, increment=1), primary_key=True) staff: Mapped[Optional[bool]] = mapped_column("Staff", Boolean, server_default=text('((0))')) active: Mapped[Optional[bool]] = mapped_column("Active", Boolean, server_default=text('((0))')) last_name: Mapped[Optional[str]] = mapped_column("Last", Unicode(255), nullable=True) first_name: Mapped[Optional[str]] = mapped_column("First", Unicode(255), nullable=True) location_id: Mapped[Optional[str]] = mapped_column(ForeignKey("Rooms.ID")) supervisor_id: Mapped[Optional[int]] = mapped_column("Supervisor", Integer, ForeignKey("Users.ID")) supervisor: Mapped[Optional['User']] = relationship('User', remote_side='User.id', back_populates='subordinates') subordinates: Mapped[List['User']] = relationship('User', back_populates='supervisor') work_logs: Mapped[List['WorkLog']] = relationship('WorkLog', back_populates='contact') location: Mapped[Optional['Room']] = relationship('Room', back_populates='users') inventory: Mapped[List['Inventory']] = relationship('Inventory', back_populates='owner') @property def full_name(self) -> str: return f"{self.first_name or ''} {self.last_name or ''}".strip() def __repr__(self): return f"" def serialize(self): return { 'id': self.id, 'first_name': self.first_name, 'last_name': self.last_name, 'location_id': self.location_id, 'supervisor_id': self.supervisor_id, 'staff': self.staff, 'active': self.active }