from datetime import datetime from sqlalchemy import Boolean, Column, DateTime, ForeignKey, String, Table from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db import Base user_roles = Table( "user_roles", Base.metadata, Column("user_id", ForeignKey("users.id"), primary_key=True), Column("role_id", ForeignKey("roles.id"), primary_key=True), ) role_permissions = Table( "role_permissions", Base.metadata, Column("role_id", ForeignKey("roles.id"), primary_key=True), Column("permission_id", ForeignKey("permissions.id"), primary_key=True), ) class User(Base): __tablename__ = "users" id: Mapped[int] = mapped_column(primary_key=True) phone: Mapped[str] = mapped_column(String(32), unique=True, index=True) name: Mapped[str] = mapped_column(String(80)) department: Mapped[str | None] = mapped_column(String(120)) unit_id: Mapped[int | None] = mapped_column(ForeignKey("units.id"), index=True) status: Mapped[str] = mapped_column(String(20), default="active", index=True) is_superuser: Mapped[bool] = mapped_column(Boolean, default=False) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) last_login_at: Mapped[datetime | None] = mapped_column(DateTime) roles: Mapped[list["Role"]] = relationship(secondary=user_roles, back_populates="users") unit: Mapped["Unit | None"] = relationship(back_populates="users") class Unit(Base): __tablename__ = "units" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(120), unique=True, index=True) description: Mapped[str | None] = mapped_column(String(255)) parent_id: Mapped[int | None] = mapped_column(ForeignKey("units.id"), index=True) category: Mapped[str] = mapped_column(String(20), default="company", index=True) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) users: Mapped[list[User]] = relationship(back_populates="unit") parent: Mapped["Unit | None"] = relationship(remote_side="Unit.id", back_populates="children") children: Mapped[list["Unit"]] = relationship(back_populates="parent") class Role(Base): __tablename__ = "roles" id: Mapped[int] = mapped_column(primary_key=True) code: Mapped[str] = mapped_column(String(60), unique=True, index=True) name: Mapped[str] = mapped_column(String(80)) description: Mapped[str | None] = mapped_column(String(255)) users: Mapped[list[User]] = relationship(secondary=user_roles, back_populates="roles") permissions: Mapped[list["Permission"]] = relationship(secondary=role_permissions, back_populates="roles") class Permission(Base): __tablename__ = "permissions" id: Mapped[int] = mapped_column(primary_key=True) code: Mapped[str] = mapped_column(String(120), unique=True, index=True) name: Mapped[str] = mapped_column(String(120)) module: Mapped[str] = mapped_column(String(60), index=True) roles: Mapped[list[Role]] = relationship(secondary=role_permissions, back_populates="permissions")