This commit is contained in:
Your Name
2026-08-07 15:35:02 +08:00
parent 3fc94c4a89
commit 6119fdd767
25 changed files with 2126 additions and 355 deletions
+23 -1
View File
@@ -5,6 +5,28 @@ from .database import Base
from utils.log_limits import bound_error_log_content, bound_message_log_content
class Role(Base):
"""Assignable role with a fixed permission-code list.
``users.role`` stores ``Role.code``. Built-in roles are seeded on startup;
custom roles are owned by admins via the users.manage permission.
"""
__tablename__ = "roles"
id = Column(Integer, primary_key=True, index=True)
code = Column(String(50), unique=True, index=True, nullable=False)
label = Column(String(100), nullable=False)
description = Column(String(255), nullable=True)
is_system = Column(Boolean, default=False)
# Global data scope + unlimited account quota. Only the built-in admin
# role may be true; custom roles are always own-scoped.
is_admin = Column(Boolean, default=False)
permissions = Column(Text, nullable=False, default="[]") # JSON string list
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class User(Base):
__tablename__ = "users"
@@ -13,7 +35,7 @@ class User(Base):
email = Column(String(255), unique=True, index=True, nullable=True)
password_hash = Column(String(255), nullable=False)
display_name = Column(String(100), nullable=True)
role = Column(String(20), default="operator", index=True) # admin, operator, viewer
role = Column(String(50), default="operator", index=True) # roles.code
is_active = Column(Boolean, default=True)
email_verified = Column(Boolean, default=False)
email_verified_at = Column(DateTime, nullable=True)