from __future__ import annotations import enum from datetime import datetime from sqlalchemy import Boolean, DateTime, String from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base, TimestampMixin, UUIDMixin class UserRole(str, enum.Enum): ADMIN = "admin" PRUEFER = "pruefer" MITARBEITER = "mitarbeiter" LESER = "leser" class User(Base, UUIDMixin, TimestampMixin): __tablename__ = "users" email: Mapped[str] = mapped_column(String(255), unique=True, index=True) first_name: Mapped[str] = mapped_column(String(80)) last_name: Mapped[str] = mapped_column(String(80)) role: Mapped[str] = mapped_column(String(40), default=UserRole.MITARBEITER.value) password_hash: Mapped[str] = mapped_column(String(255)) is_active: Mapped[bool] = mapped_column(Boolean, default=True) must_change_password: Mapped[bool] = mapped_column(Boolean, default=True) last_login_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) password_changed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) @property def full_name(self) -> str: return f"{self.first_name} {self.last_name}".strip()