47 lines
2.2 KiB
Python
47 lines
2.2 KiB
Python
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"<User(id={self.id}, first_name={repr(self.first_name)}, last_name={repr(self.last_name)}, " \
|
|
f"location={repr(self.location)}, staff={self.staff}, active={self.active})>"
|
|
|
|
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
|
|
}
|