diff --git a/src/backend/bisheng/api/services/assistant.py b/src/backend/bisheng/api/services/assistant.py index f8164258a..cceb31534 100644 --- a/src/backend/bisheng/api/services/assistant.py +++ b/src/backend/bisheng/api/services/assistant.py @@ -491,6 +491,10 @@ def delete_gpts_tools(cls, user: UserPayload, tool_type_id: int) -> UnifiedRespo return resp_200() if exist_tool_type.is_preset: return ToolTypeIsPresetError.return_resp() + # 判断是否有更新权限 + if not user.access_check(exist_tool_type.user_id, exist_tool_type.id, AccessType.GPTS_TOOL_WRITE): + return UnAuthorizedError.return_resp() + GptsToolsDao.delete_tool_type(tool_type_id) cls.delete_gpts_tool_hook(user, exist_tool_type) return resp_200() diff --git a/src/backend/bisheng/api/services/evaluation.py b/src/backend/bisheng/api/services/evaluation.py index f71f00a3b..56a2fe393 100644 --- a/src/backend/bisheng/api/services/evaluation.py +++ b/src/backend/bisheng/api/services/evaluation.py @@ -348,7 +348,7 @@ def add_evaluation_task(evaluation_id: int): logger.info(f'evaluation task success id={evaluation_id}') except Exception as e: - logger.error(f'evaluation task failed id={evaluation_id} {e}') + logger.exception(f'evaluation task failed id={evaluation_id} {str(e)}') evaluation.status = EvaluationTaskStatus.failed.value EvaluationDao.update_evaluation(evaluation=evaluation) redis_client.delete(redis_key) diff --git a/src/backend/bisheng/api/services/role_group_service.py b/src/backend/bisheng/api/services/role_group_service.py index 3f0977454..a5aaa91e8 100644 --- a/src/backend/bisheng/api/services/role_group_service.py +++ b/src/backend/bisheng/api/services/role_group_service.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import List, Any +from typing import List, Any, Dict from uuid import UUID from fastapi.encoders import jsonable_encoder @@ -17,7 +17,7 @@ from bisheng.database.models.group import Group, GroupCreate, GroupDao, GroupRead, DefaultGroup from bisheng.database.models.group_resource import GroupResourceDao, ResourceTypeEnum from bisheng.database.models.knowledge import KnowledgeDao -from bisheng.database.models.role import AdminRole +from bisheng.database.models.role import AdminRole, RoleDao from bisheng.database.models.user import User, UserDao from bisheng.database.models.user_role import UserRoleDao from bisheng.database.models.user_group import UserGroupCreate, UserGroupDao, UserGroupRead @@ -90,6 +90,8 @@ def update_group_hook(self, request: Request, login_user: UserPayload, group: Gr def delete_group(self, request: Request, login_user: UserPayload, group_id: int): """删除用户组""" + if group_id == DefaultGroup: + raise HTTPException(status_code=500, detail='默认组不能删除') group_info = GroupDao.get_user_group(group_id) if not group_info: return resp_200() @@ -121,7 +123,8 @@ def delete_group_hook(self, request: Request, login_user: UserPayload, group_inf if need_move_resource: GroupResourceDao.update_group_resource(need_move_resource) GroupResourceDao.delete_group_resource_by_group_id(group_info.id) - + # 删除用户组下的角色列表 + RoleDao.delete_role_by_group_id(group_info.id) def get_group_user_list(self, group_id: int, page_size: int, page_num: int) -> List[User]: """获取全量的group列表""" @@ -178,16 +181,16 @@ def replace_user_groups(self, request: Request, login_user: UserPayload, user_id # 记录审计日志 group_infos = GroupDao.get_group_by_ids(old_group + group_ids) - group_dict = {} + group_dict: Dict[int, str] = {} for one in group_infos: group_dict[one.id] = one.group_name note = "编辑前用户组:" for one in old_group: - note += group_dict.get(one, one) + "、" + note += f'{group_dict.get(one, one)}、' note = note.rstrip('、') note += "编辑后用户组:" for one in group_ids: - note += group_dict.get(one, one) + "、" + note += f'{group_dict.get(one, one)}、' note = note.rstrip('、') AuditLogService.update_user(login_user, get_request_ip(request), user_id, group_dict.keys(), note) return None 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 66f121688..7db3bbbc5 100644 --- a/src/backend/bisheng/database/models/role.py +++ b/src/backend/bisheng/database/models/role.py @@ -3,7 +3,7 @@ from bisheng.database.base import session_getter from bisheng.database.models.base import SQLModelSerializable -from sqlalchemy import Column, DateTime, text, func +from sqlalchemy import Column, DateTime, text, func, delete, and_, UniqueConstraint from sqlmodel import Field, select # 默认普通用户角色的ID @@ -13,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( @@ -26,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) @@ -94,3 +95,19 @@ def get_role_by_ids(cls, role_ids: List[int]) -> List[Role]: def get_role_by_id(cls, role_id: int) -> Role: with session_getter() as session: return session.query(Role).filter(Role.id == role_id).first() + + @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_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() diff --git a/src/frontend/src/components/bs-comp/sheets/TaggingSheet.tsx b/src/frontend/src/components/bs-comp/sheets/TaggingSheet.tsx index 16967654f..f28c22192 100644 --- a/src/frontend/src/components/bs-comp/sheets/TaggingSheet.tsx +++ b/src/frontend/src/components/bs-comp/sheets/TaggingSheet.tsx @@ -17,7 +17,7 @@ export default function TaggingSheet({children}) { const handleDragEnd = (result) => { if(!result.destination) return - const newButtons = init + const newButtons = buttons const [moveItem] = newButtons.splice(result.source.index, 1) newButtons.splice(result.destination.index, 0, moveItem) setButtons(newButtons) @@ -46,7 +46,7 @@ export default function TaggingSheet({children}) { )} ))} - {provided.placeholder} + {/* {provided.placeholder} */} )}