Files
Fulfillment-Backend/models/auth.py

175 lines
5.7 KiB
Python

from typing import TYPE_CHECKING
from sqlalchemy import BigInteger, Table, ForeignKey, Column
from sqlalchemy.orm import Mapped, mapped_column, relationship
from enums.user import UserRole
from models.base import BaseModel
from models.work_shifts import WorkShift
if TYPE_CHECKING:
from models.payroll import PayRate, PaymentRecord
from models import Deal
role_permissions = Table(
'role_permissions',
BaseModel.metadata,
Column('role_key', ForeignKey('roles.key'), primary_key=True),
Column('permission_key', ForeignKey('permissions.key'), primary_key=True)
)
user_position = Table(
'user_position',
BaseModel.metadata,
Column('position_key', ForeignKey('positions.key'), primary_key=True),
Column('user_id', ForeignKey('users.id'), primary_key=True, unique=True)
)
user_pay_rate = Table(
'user_pay_rate',
BaseModel.metadata,
Column('pay_rate_id', ForeignKey('pay_rates.id'), primary_key=True),
Column('user_id', ForeignKey('users.id'), primary_key=True, unique=True)
)
user_department_section = Table(
'user_department_section',
BaseModel.metadata,
Column('department_section_id', ForeignKey('department_sections.id'), primary_key=True),
Column('user_id', ForeignKey('users.id'), primary_key=True)
)
class Permission(BaseModel):
__tablename__ = 'permissions'
key: Mapped[str] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column()
roles: Mapped[list["Role"]] = relationship('Role',
secondary=role_permissions,
back_populates='permissions')
class Role(BaseModel):
__tablename__ = 'roles'
key: Mapped[str] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column()
permissions: Mapped[list["Permission"]] = relationship('Permission',
secondary=role_permissions,
back_populates='roles',
lazy='selectin')
# users: Mapped[list["User"]] = relationship("User", back_populates="users")
class User(BaseModel):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
first_name: Mapped[str] = mapped_column(nullable=False, server_default='')
second_name: Mapped[str] = mapped_column(nullable=False, server_default='')
patronymic: Mapped[str] = mapped_column(nullable=False, server_default='')
comment: Mapped[str] = mapped_column(nullable=False, server_default='')
telegram_id: Mapped[int] = mapped_column(BigInteger,
nullable=False,
index=True)
phone_number: Mapped[str] = mapped_column(nullable=True)
passport_data: Mapped[str] = mapped_column(nullable=True, comment='Серия и номер паспорта')
is_admin: Mapped[bool] = mapped_column(nullable=False, default=False)
is_blocked: Mapped[bool] = mapped_column(nullable=False, server_default='0')
is_deleted: Mapped[bool] = mapped_column(nullable=False, server_default='0')
role_key: Mapped[int] = mapped_column(ForeignKey('roles.key'), server_default=UserRole.user)
role: Mapped["Role"] = relationship(
'Role',
lazy='joined'
)
position: Mapped["Position"] = relationship(
'Position',
secondary=user_position,
uselist=False,
back_populates='users',
lazy="joined"
)
pay_rate: Mapped["PayRate"] = relationship(
"PayRate",
secondary=user_pay_rate,
uselist=False,
lazy="joined"
)
payment_records: Mapped[list["PaymentRecord"]] = relationship(
"PaymentRecord",
back_populates="user",
uselist=True,
foreign_keys="PaymentRecord.user_id"
)
work_shifts: Mapped[list["WorkShift"]] = relationship(
"WorkShift",
back_populates="user",
uselist=True,
foreign_keys="WorkShift.user_id"
)
managed_deals: Mapped[list["Deal"]] = relationship(
back_populates="manager",
uselist=True,
)
passport_images = relationship(
'PassportImage',
back_populates='user',
lazy='selectin',
cascade="all, delete-orphan"
)
class Position(BaseModel):
__tablename__ = 'positions'
key: Mapped[str] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column()
users: Mapped["User"] = relationship(
'User',
secondary=user_position,
uselist=False,
back_populates='position'
)
class PassportImage(BaseModel):
__tablename__ = 'passport_images'
id: Mapped[int] = mapped_column(primary_key=True)
user_id = mapped_column(ForeignKey('users.id'), nullable=False)
user: Mapped["User"] = relationship(back_populates='passport_images')
image_url: Mapped[str] = mapped_column(nullable=False)
class Department(BaseModel):
__tablename__ = 'departments'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(unique=True)
sections: Mapped[list['DepartmentSection']] = relationship(
back_populates='department',
lazy='selectin',
cascade='all, delete',
)
class DepartmentSection(BaseModel):
__tablename__ = 'department_sections'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(index=True)
department_id: Mapped[int] = mapped_column(ForeignKey('departments.id'))
department: Mapped["Department"] = relationship(
back_populates='sections',
lazy='selectin',
)
users: Mapped[list[User]] = relationship(
'User',
secondary=user_department_section,
uselist=True,
)