From c4642a359502d5998843ffc6308a56d334e59d28 Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Thu, 19 Jun 2025 15:26:16 +0800 Subject: [PATCH] refactor: user --- apps/users/serializers/user.py | 36 ++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index d8ff1fa64..5490a1fda 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -198,28 +198,46 @@ class UserManageSerializer(serializers.Serializer): if not (role_model and user_role_relation_model): return {} + # 获取所有相关角色关系,并预加载角色信息 # 获取所有相关角色关系,并预加载角色信息 user_role_relations = ( user_role_relation_model.objects .filter(user_id__in=user_ids) - .distinct('user_id', 'role_id') # 确保每个用户每个角色只返回一次 - .select_related('role') # 预加载外键数据 + .select_related('role') + .distinct('user_id', 'role_id', 'workspace_id') # 确保组合唯一性 ) # 构建用户ID到角色名称列表的映射 user_role_mapping = defaultdict(list) - for relation in user_role_relations: - user_role_mapping[str(relation.user_id)].append(relation.role.role_name) + # 构建用户ID到角色ID与工作空间ID映射 + user_role_setting_mapping = defaultdict(lambda: defaultdict(list)) - return user_role_mapping + for relation in user_role_relations: + user_id = str(relation.user_id) + role_id = relation.role_id + workspace_id = relation.workspace_id + + user_role_mapping[user_id].append(relation.role.role_name) + user_role_setting_mapping[user_id][role_id].append(workspace_id) + + # 转换为所需的结构 + result_user_role_setting_mapping = { + user_id: [{"role_id": role_id, "workspace_ids": workspace_ids} + for role_id, workspace_ids in roles.items()] + for user_id, roles in user_role_setting_mapping.items() + } + + return user_role_mapping, result_user_role_setting_mapping if role_model and user_role_relation_model: user_ids = [user['id'] for user in result['records']] - user_role_mapping = _get_user_roles(user_ids) + user_role_mapping, user_role_setting_mapping = _get_user_roles(user_ids) # 将角色信息添加回用户数据中 for user in result['records']: - user['role'] = user_role_mapping.get(str(user['id']), []) + user_id = str(user['id']) + user['role'] = user_role_mapping.get(user_id, []) + user['role_setting'] = user_role_setting_mapping.get(user_id, []) return result @valid_license(model=User, count=2, @@ -454,7 +472,7 @@ class UserManageSerializer(serializers.Serializer): 'roles': [relation.role.role_name] } else: - user_dict[user_id]['roles'].append(relation.role.name) + user_dict[user_id]['roles'].append(relation.role.role_name) # 将字典值转换为列表形式 return list(user_dict.values()) @@ -489,6 +507,8 @@ def update_user_role(instance, user): workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping") if workspace_user_role_mapping_model: role_setting = instance.get('role_setting') + if not role_setting: + return workspace_user_role_mapping_model.objects.filter(user_id=user.id).delete() relations = set() for item in role_setting: