import enum from sqlalchemy import (Boolean, Column, DateTime, ForeignKey, Integer, String, UniqueConstraint) from sqlalchemy.orm import relationship from sqlalchemy.sql import func from src.db.base import Base class UserRole(int, enum.Enum): ADMIN = 1 EXECUTOR_DFIP = 2 EXECUTOR_RF = 3 class Roles(Base): __tablename__ = "roles" id = Column(Integer, primary_key=True, index=True) role = Column(String, nullable=False) user_role = relationship("Users", back_populates="role", lazy="select") class Users(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True, nullable=False) username = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=True) full_name = Column(String, nullable=True) role_id = Column(Integer, ForeignKey("roles.id"), nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) is_active = Column(Boolean, default=True, nullable=False, server_default="true") role = relationship( "Roles", foreign_keys=[role_id], back_populates="user_role", lazy="selectin", ) user_ssp_link = relationship("UserSSPLink", back_populates="users", lazy="select") class SSP(Base): __tablename__ = "ssp" id = Column(Integer, primary_key=True, index=True) title = Column(String, nullable=False) is_active = Column(Boolean, default=True, nullable=False, server_default="true") is_ssp = Column(Boolean, default=True, nullable=False, server_default="true") user_ssp_link = relationship("UserSSPLink", back_populates="ssp", lazy="select") class UserSSPLink(Base): __tablename__ = "user_ssp_link" __table_args__ = ( UniqueConstraint("user_id", "ssp_id", name="uq_user_ssp_link_user_id_ssp_id"), ) id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) ssp_id = Column(Integer, ForeignKey("ssp.id"), nullable=False) users = relationship("Users", back_populates="user_ssp_link", lazy="select") ssp = relationship("SSP", back_populates="user_ssp_link", lazy="select")