finai/backend/app/models/user.py

78 lines
3.1 KiB
Python

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")