gmao/app_new/core/models/rbac.py
root ab543cad3a
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Ajouter la gestion RBAC des utilisateurs et permissions
2026-08-21 15:22:47 +00:00

66 lines
3.8 KiB
Python

"""RBAC configurable : rôles, permissions et exceptions utilisateur."""
from datetime import datetime, timezone
from ...extensions import db
def utcnow():
return datetime.now(timezone.utc)
class Role(db.Model):
__tablename__ = "roles"
id = db.Column(db.Integer, primary_key=True)
slug = db.Column(db.String(80), nullable=False, unique=True)
name = db.Column(db.String(120), nullable=False)
description = db.Column(db.Text)
is_system = db.Column(db.Boolean, nullable=False, default=False)
is_active = db.Column(db.Boolean, nullable=False, default=True)
created_at = db.Column(db.DateTime, nullable=False, default=utcnow)
updated_at = db.Column(db.DateTime, nullable=False, default=utcnow, onupdate=utcnow)
user_links = db.relationship("UserRole", back_populates="role", cascade="all, delete-orphan")
permission_links = db.relationship("RolePermission", back_populates="role", cascade="all, delete-orphan")
class Permission(db.Model):
__tablename__ = "permissions"
id = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(120), nullable=False, unique=True)
name = db.Column(db.String(160), nullable=False)
module = db.Column(db.String(80), nullable=False, index=True)
action = db.Column(db.String(40), nullable=False)
description = db.Column(db.Text)
is_active = db.Column(db.Boolean, nullable=False, default=True)
role_links = db.relationship("RolePermission", back_populates="permission", cascade="all, delete-orphan")
user_links = db.relationship("UserPermission", back_populates="permission", cascade="all, delete-orphan")
class UserRole(db.Model):
__tablename__ = "user_roles"
__table_args__ = (db.UniqueConstraint("user_id", "role_id", name="uq_user_role"),)
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
role_id = db.Column(db.Integer, db.ForeignKey("roles.id", ondelete="CASCADE"), nullable=False, index=True)
assigned_at = db.Column(db.DateTime, nullable=False, default=utcnow)
assigned_by_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="SET NULL"))
user = db.relationship("User", foreign_keys=[user_id], back_populates="role_links")
role = db.relationship("Role", back_populates="user_links")
assigned_by = db.relationship("User", foreign_keys=[assigned_by_id])
class RolePermission(db.Model):
__tablename__ = "role_permissions"
__table_args__ = (db.UniqueConstraint("role_id", "permission_id", name="uq_role_permission"),)
id = db.Column(db.Integer, primary_key=True)
role_id = db.Column(db.Integer, db.ForeignKey("roles.id", ondelete="CASCADE"), nullable=False, index=True)
permission_id = db.Column(db.Integer, db.ForeignKey("permissions.id", ondelete="CASCADE"), nullable=False, index=True)
effect = db.Column(db.String(10), nullable=False, default="allow")
role = db.relationship("Role", back_populates="permission_links")
permission = db.relationship("Permission", back_populates="role_links")
class UserPermission(db.Model):
__tablename__ = "user_permissions"
__table_args__ = (db.UniqueConstraint("user_id", "permission_id", name="uq_user_permission"),)
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
permission_id = db.Column(db.Integer, db.ForeignKey("permissions.id", ondelete="CASCADE"), nullable=False, index=True)
effect = db.Column(db.String(10), nullable=False, default="allow")
expires_at = db.Column(db.DateTime)
note = db.Column(db.String(255))
user = db.relationship("User", back_populates="permission_links")
permission = db.relationship("Permission", back_populates="user_links")