From ef06c0d68a7a19f654c2308b75d5f47908f8e1c3 Mon Sep 17 00:00:00 2001 From: GuoQing Zhang Date: Fri, 28 Jun 2024 17:48:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BB=84=E5=90=8E=E6=B8=85=E7=90=86=E8=A7=92=E8=89=B2=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E5=8A=A9=E6=89=8B=E5=B7=A5=E5=85=B7=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=B6=E5=88=A4=E6=96=AD=E6=9D=83=E9=99=90=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/bisheng/api/v1/user.py | 1 + src/backend/bisheng/database/models/role.py | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/backend/bisheng/api/v1/user.py b/src/backend/bisheng/api/v1/user.py index 937478552..819fadc8b 100644 --- a/src/backend/bisheng/api/v1/user.py +++ b/src/backend/bisheng/api/v1/user.py @@ -395,6 +395,7 @@ async def create_role(*, create_role_hook(request, login_user, db_role) return resp_200(db_role) except Exception: + logger.exception('add role error') raise HTTPException(status_code=500, detail='添加失败,检查是否重复添加') diff --git a/src/backend/bisheng/database/models/role.py b/src/backend/bisheng/database/models/role.py index b193d642f..7db3bbbc5 100644 --- a/src/backend/bisheng/database/models/role.py +++ b/src/backend/bisheng/database/models/role.py @@ -3,11 +3,9 @@ from bisheng.database.base import session_getter from bisheng.database.models.base import SQLModelSerializable -from sqlalchemy import Column, DateTime, text, func, delete, and_ +from sqlalchemy import Column, DateTime, text, func, delete, and_, UniqueConstraint from sqlmodel import Field, select -from bisheng.database.models.role_access import RoleAccess - # 默认普通用户角色的ID DefaultRole = 2 # 超级管理员角色ID @@ -15,7 +13,7 @@ class RoleBase(SQLModelSerializable): - role_name: str = Field(index=False, description='前端展示名称', unique=True) + role_name: str = Field(index=False, description='前端展示名称') group_id: Optional[int] = Field(index=True) remark: Optional[str] = Field(index=False) create_time: Optional[datetime] = Field(sa_column=Column( @@ -28,6 +26,7 @@ class RoleBase(SQLModelSerializable): class Role(RoleBase, table=True): + __table_args__ = (UniqueConstraint('group_id', 'role_name', name='group_role_name_uniq'),) id: Optional[int] = Field(default=None, primary_key=True) @@ -100,13 +99,15 @@ def get_role_by_id(cls, role_id: int) -> Role: @classmethod def delete_role_by_group_id(cls, group_id: int): """ - 删除分组下所有的角色 + 删除分组下所有的角色,清理用户对应的角色 """ + from bisheng.database.models.user_role import UserRole with session_getter() as session: - all_access = select(RoleAccess, Role).join( - Role, and_(RoleAccess.role_id == Role.id, - Role.group_id == group_id)).group_by(RoleAccess.id) - all_access = session.exec(all_access) - session.exec(delete(RoleAccess).where(RoleAccess.id.in_([one.id for one in all_access]))) + # 清理对应的用户 + all_user = select(UserRole, Role).join( + Role, and_(UserRole.role_id == Role.id, + Role.group_id == group_id)).group_by(UserRole.id) + all_user = session.exec(all_user).all() + session.exec(delete(UserRole).where(UserRole.id.in_([one.id for one in all_user]))) session.exec(delete(Role).where(Role.group_id == group_id)) session.commit()