78 lines
3.1 KiB
Python
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")
|