from datetime import datetime from sqlalchemy import Boolean, DateTime, ForeignKey, String, Table, Column, func from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.database import Base role_permissions = Table( "role_permissions", Base.metadata, Column("role_id", ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True), Column("permission_id", ForeignKey("permissions.id", ondelete="CASCADE"), primary_key=True), ) class Role(Base): __tablename__ = "roles" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(80), unique=True, index=True) display_name: Mapped[str] = mapped_column(String(120)) description: Mapped[str] = mapped_column(String(500), default="", server_default="") is_system: Mapped[bool] = mapped_column(Boolean, default=False, server_default="false") created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), ) permissions: Mapped[list["Permission"]] = relationship( secondary=role_permissions, back_populates="roles", lazy="selectin", ) class Permission(Base): __tablename__ = "permissions" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(120), unique=True, index=True) display_name: Mapped[str] = mapped_column(String(160)) description: Mapped[str] = mapped_column(String(500), default="", server_default="") module: Mapped[str] = mapped_column(String(80), index=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), ) roles: Mapped[list[Role]] = relationship( secondary=role_permissions, back_populates="permissions", lazy="selectin", )