from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Table, UniqueConstraint from sqlalchemy.orm import relationship from sqlalchemy.sql import func from database import Base role_permissions = Table( "role_permissions", Base.metadata, Column("role_id", Integer, ForeignKey("roles.id"), primary_key=True), Column("permission_id", Integer, ForeignKey("permissions.id"), primary_key=True), ) user_roles = Table( "user_roles", Base.metadata, Column("user_id", Integer, ForeignKey("users.id"), primary_key=True), Column("role_id", Integer, ForeignKey("roles.id"), primary_key=True), ) class Permission(Base): __tablename__ = "permissions" id = Column(Integer, primary_key=True, index=True) resource = Column(String, nullable=False, index=True) # e.g. "asset", "shot", "task" action = Column(String, nullable=False) # e.g. "create", "edit", "delete" description = Column(String, nullable=True) __table_args__ = ( UniqueConstraint("resource", "action", name="uq_permission_resource_action"), ) # Relationships roles = relationship("Role", secondary=role_permissions, back_populates="permissions") def __repr__(self): return f"" class Role(Base): __tablename__ = "roles" id = Column(Integer, primary_key=True, index=True) name = Column(String, unique=True, nullable=False, index=True) description = Column(String, nullable=True) is_system = Column(Boolean, default=False, nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) # Relationships permissions = relationship("Permission", secondary=role_permissions, back_populates="roles") users = relationship("User", secondary=user_roles, back_populates="roles") def __repr__(self): return f""