from iti.applications.extensions import db from iti.applications.common.enums import StatusEnum from iti.applications.common.utils import BaseSchema from apiflask.fields import String, DateTime, Enum, Integer, Nested, List from iti.applications.common.crud import BaseModelMixin from sqlalchemy.ext.hybrid import hybrid_property class Role(BaseModelMixin): """ 角色表 """ __tablename__ = "sys_role" name = db.Column(db.String(64), nullable=False, comment="名称") code = db.Column(db.String(64), nullable=False, unique=True, comment="编码") desc = db.Column(db.Text, nullable=True, comment="描述") sort = db.Column(db.Integer, nullable=False, default=0, comment="排序") status = db.Column( db.Enum(StatusEnum, values_callable=lambda x: [e.value for e in x]), nullable=False, default=StatusEnum.ENABLED.value, comment="状态", ) # 关系 users = db.relationship( "User", secondary="sys_user_role", primaryjoin="Role.id == sys_user_role.c.role_id", secondaryjoin="User.id == sys_user_role.c.user_id", back_populates="roles", ) menus = db.relationship( "SysMenu", secondary="sys_role_menu", primaryjoin="Role.id == sys_role_menu.c.role_id", secondaryjoin="SysMenu.id == sys_role_menu.c.menu_id", # back_populates="roles", ) _permissions = [] @hybrid_property def permissions(self): if len(self._permissions) == 0: # 读取 menus 的 id 列表 self._permissions = [menu.id for menu in self.menus] return self._permissions class RoleSchema(BaseSchema): id = String() name = String() code = String() desc = String() sort = Integer() status = Enum(StatusEnum, by_value=True) created_at = DateTime(format="%Y-%m-%d %H:%M:%S") updated_at = DateTime(format="%Y-%m-%d %H:%M:%S") # 关系 users = Nested("UserSchema", many=True, dump_only=True, exclude=["roles"]) menus = Nested("SysMenuSchema", many=True, dump_only=True) permissions = List(String())