Skip to content

Commit c4642a3

Browse files
committed
refactor: user
1 parent 598b72f commit c4642a3

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

apps/users/serializers/user.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,28 +198,46 @@ def _get_user_roles(user_ids):
198198
if not (role_model and user_role_relation_model):
199199
return {}
200200

201+
# 获取所有相关角色关系,并预加载角色信息
201202
# 获取所有相关角色关系,并预加载角色信息
202203
user_role_relations = (
203204
user_role_relation_model.objects
204205
.filter(user_id__in=user_ids)
205-
.distinct('user_id', 'role_id') # 确保每个用户每个角色只返回一次
206-
.select_related('role') # 预加载外键数据
206+
.select_related('role')
207+
.distinct('user_id', 'role_id', 'workspace_id') # 确保组合唯一性
207208
)
208209

209210
# 构建用户ID到角色名称列表的映射
210211
user_role_mapping = defaultdict(list)
212+
# 构建用户ID到角色ID与工作空间ID映射
213+
user_role_setting_mapping = defaultdict(lambda: defaultdict(list))
214+
211215
for relation in user_role_relations:
212-
user_role_mapping[str(relation.user_id)].append(relation.role.role_name)
216+
user_id = str(relation.user_id)
217+
role_id = relation.role_id
218+
workspace_id = relation.workspace_id
219+
220+
user_role_mapping[user_id].append(relation.role.role_name)
221+
user_role_setting_mapping[user_id][role_id].append(workspace_id)
222+
223+
# 转换为所需的结构
224+
result_user_role_setting_mapping = {
225+
user_id: [{"role_id": role_id, "workspace_ids": workspace_ids}
226+
for role_id, workspace_ids in roles.items()]
227+
for user_id, roles in user_role_setting_mapping.items()
228+
}
213229

214-
return user_role_mapping
230+
return user_role_mapping, result_user_role_setting_mapping
215231

216232
if role_model and user_role_relation_model:
217233
user_ids = [user['id'] for user in result['records']]
218-
user_role_mapping = _get_user_roles(user_ids)
234+
user_role_mapping, user_role_setting_mapping = _get_user_roles(user_ids)
219235

220236
# 将角色信息添加回用户数据中
221237
for user in result['records']:
222-
user['role'] = user_role_mapping.get(str(user['id']), [])
238+
user_id = str(user['id'])
239+
user['role'] = user_role_mapping.get(user_id, [])
240+
user['role_setting'] = user_role_setting_mapping.get(user_id, [])
223241
return result
224242

225243
@valid_license(model=User, count=2,
@@ -454,7 +472,7 @@ def get_user_members(self, workspace_id):
454472
'roles': [relation.role.role_name]
455473
}
456474
else:
457-
user_dict[user_id]['roles'].append(relation.role.name)
475+
user_dict[user_id]['roles'].append(relation.role.role_name)
458476

459477
# 将字典值转换为列表形式
460478
return list(user_dict.values())
@@ -489,6 +507,8 @@ def update_user_role(instance, user):
489507
workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
490508
if workspace_user_role_mapping_model:
491509
role_setting = instance.get('role_setting')
510+
if not role_setting:
511+
return
492512
workspace_user_role_mapping_model.objects.filter(user_id=user.id).delete()
493513
relations = set()
494514
for item in role_setting:

0 commit comments

Comments
 (0)