from sqlalchemy import ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base class Berechtigung(Base): """Roadmap Phase 6: Katalog einzelner Rechte (z.B. "material.erstellen"). Fest im Code definiert (welche Endpunkte welches Recht prüfen), aber wer welche Berechtigung über welche Rolle bekommt, ist frei konfigurierbar.""" __tablename__ = "berechtigung" id: Mapped[int] = mapped_column(primary_key=True) schluessel: Mapped[str] = mapped_column(String, unique=True, nullable=False) beschreibung: Mapped[str] = mapped_column(String, nullable=False) class Rolle(Base): """Vom Admin frei anlegbare Rolle (z.B. "Materialwart", "Helfer") - additiv neben dem bestehenden festen 4-Rollen-System (RolleTyp), nicht dessen Ersatz. Ein Benutzer kann beides gleichzeitig haben.""" __tablename__ = "rolle" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String, unique=True, nullable=False) beschreibung: Mapped[str | None] = mapped_column(String) class RolleBerechtigung(Base): __tablename__ = "rolle_berechtigung" rolle_id: Mapped[int] = mapped_column(ForeignKey("rolle.id", ondelete="CASCADE"), primary_key=True) berechtigung_id: Mapped[int] = mapped_column( ForeignKey("berechtigung.id", ondelete="CASCADE"), primary_key=True ) class BenutzerRolleZuordnung(Base): """M:N Benutzer<->Rolle (neues System) - eigene Tabelle statt Wiederverwendung von benutzer_rolle, dessen rolle-Spalte ein fester ENUM ist und keine FK auf frei anlegbare rolle-Zeilen erlaubt.""" __tablename__ = "benutzer_rolle_zuordnung" benutzer_id: Mapped[int] = mapped_column(ForeignKey("benutzer.id", ondelete="CASCADE"), primary_key=True) rolle_id: Mapped[int] = mapped_column(ForeignKey("rolle.id", ondelete="CASCADE"), primary_key=True)