diff --git a/apps/users/serializers/user_group.py b/apps/users/serializers/user_group.py index 6c67404f343..4eda8e5c14c 100644 --- a/apps/users/serializers/user_group.py +++ b/apps/users/serializers/user_group.py @@ -1,6 +1,7 @@ # coding=utf-8 import uuid_utils.compat as uuid +from collections import defaultdict from django.db import transaction from django.db.models import Count from django.utils.translation import gettext_lazy as _ @@ -22,34 +23,31 @@ def add_or_edit_user_group_relation(user, user_group_ids): return groups = UserGroup.objects.filter(id__in=user_group_ids) if groups.count() != len(user_group_ids): - raise AppApiException(500, _('Some user groups do not exist')) + raise AppApiException(500, _("Some user groups do not exist")) - UserGroupRelation.objects.bulk_create([ - UserGroupRelation(user=user, group=group) - for group in groups - ]) + UserGroupRelation.objects.bulk_create([UserGroupRelation(user=user, group=group) for group in groups]) class SystemUserGroupModelSerializer(serializers.ModelSerializer): count = serializers.SerializerMethodField() def get_count(self, obj): - return getattr(obj, 'count', 0) + return getattr(obj, "count", 0) class Meta: model = SystemUserGroup - fields = ['id', 'name', 'workspace_id', 'count'] + fields = ["id", "name", "workspace_id", "count"] class SystemUserGroupCreateSerializer(serializers.Serializer): - id = serializers.CharField(required=False, label='ID') - name = serializers.CharField(required=True, label='User Group Name') - workspace_id = serializers.CharField(required=True, label='Workspace ID') + id = serializers.CharField(required=False, label="ID") + name = serializers.CharField(required=True, label="User Group Name") + workspace_id = serializers.CharField(required=True, label="Workspace ID") def validate(self, data): - group_id = data.get('id') - name = data.get('name') - workspace_id = data.get('workspace_id') + group_id = data.get("id") + name = data.get("name") + workspace_id = data.get("workspace_id") if group_id: if not SystemUserGroup.objects.filter(id=group_id, workspace_id=workspace_id).exists(): raise AppApiException(500, _("User group does not exist")) @@ -65,9 +63,9 @@ def create_or_update_group(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) data = self.validated_data - group_id = data.get('id') - name = data['name'] - workspace_id = data['workspace_id'] + group_id = data.get("id") + name = data["name"] + workspace_id = data["workspace_id"] if group_id: SystemUserGroup.objects.filter(id=group_id, workspace_id=workspace_id).update(name=name) @@ -81,8 +79,8 @@ def create_or_update_group(self, with_valid=True): return SystemUserGroupModelSerializer(group).data class UserGroupDeleteSerializer(serializers.Serializer): - id = serializers.CharField(required=True, label='ID') - workspace_id = serializers.CharField(required=True, label='Workspace ID') + id = serializers.CharField(required=True, label="ID") + workspace_id = serializers.CharField(required=True, label="Workspace ID") group = None @@ -106,14 +104,13 @@ def delete(self, *, with_valid=True): return True class Query(serializers.Serializer): - workspace_id = serializers.CharField(required=True, label='Workspace ID') + workspace_id = serializers.CharField(required=True, label="Workspace ID") def get_query_set(self): return ( - SystemUserGroup.objects - .filter(workspace_id=self.data.get('workspace_id')) - .annotate(count=Count('user_relations')) - .order_by('name') + SystemUserGroup.objects.filter(workspace_id=self.data.get("workspace_id")) + .annotate(count=Count("user_relations")) + .order_by("name") ) def list(self, with_valid=True): @@ -123,13 +120,9 @@ def list(self, with_valid=True): class UserGroupAddMemberSerializer(serializers.Serializer): - id = serializers.CharField(required=True, label='ID') - workspace_id = serializers.CharField(required=True, label='Workspace ID') - user_ids = serializers.ListField( - child=serializers.CharField(required=True), - required=True, - label=_('User IDs') - ) + id = serializers.CharField(required=True, label="ID") + workspace_id = serializers.CharField(required=True, label="Workspace ID") + user_ids = serializers.ListField(child=serializers.CharField(required=True), required=True, label=_("User IDs")) def validate_normal_users(self, workspace_id: str, user_ids: list[str]): if not user_ids: @@ -144,8 +137,8 @@ def validate_normal_users(self, workspace_id: str, user_ids: list[str]): mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping") valid_user_ids = set( - str(uid) for uid in - mapping_model.objects.filter( + str(uid) + for uid in mapping_model.objects.filter( workspace_id=workspace_id, user_id__in=user_id_set, role__type=RoleConstants.USER.name, @@ -157,9 +150,9 @@ def validate_normal_users(self, workspace_id: str, user_ids: list[str]): raise AppApiException(500, _("Unauthorized users are present")) def validate(self, data): - id = data.get('id') - workspace_id = data.get('workspace_id') - user_ids = data.get('user_ids') + id = data.get("id") + workspace_id = data.get("workspace_id") + user_ids = data.get("user_ids") group = SystemUserGroup.objects.filter(id=id, workspace_id=workspace_id).first() if not group: raise AppApiException(500, _("User group does not exist")) @@ -172,40 +165,37 @@ def validate(self, data): def add_member(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) - user_ids = self.data.get('user_ids') - workspace_id = self.data.get('workspace_id') + user_ids = self.data.get("user_ids") + workspace_id = self.data.get("workspace_id") current_user_group_ids = set( - str(user_id) for user_id in - SystemUserGroupRelation.objects.filter(group__id=self.data.get('id'), - group__workspace_id=workspace_id).values_list('user_id', flat=True) + str(user_id) + for user_id in SystemUserGroupRelation.objects.filter( + group__id=self.data.get("id"), group__workspace_id=workspace_id + ).values_list("user_id", flat=True) ) to_add = set(user_ids).difference(current_user_group_ids) if to_add: - SystemUserGroupRelation.objects.bulk_create([ - SystemUserGroupRelation( - id=uuid.uuid7(), - user_id=user_id, - group_id=self.data.get('id') - ) - for user_id in to_add - ]) + SystemUserGroupRelation.objects.bulk_create( + [ + SystemUserGroupRelation(id=uuid.uuid7(), user_id=user_id, group_id=self.data.get("id")) + for user_id in to_add + ] + ) return True class UserGroupRemoveMemberSerializer(serializers.Serializer): - id = serializers.CharField(required=True, label='ID') - workspace_id = serializers.CharField(required=True, label='Workspace ID') + id = serializers.CharField(required=True, label="ID") + workspace_id = serializers.CharField(required=True, label="Workspace ID") group_relation_ids = serializers.ListField( - child=serializers.CharField(required=True), - required=True, - label=_('User group relation IDs') + child=serializers.CharField(required=True), required=True, label=_("User group relation IDs") ) def validate(self, data): - group_id = data.get('id') - workspace_id = data.get('workspace_id') - relation_ids = data.get('group_relation_ids') + group_id = data.get("id") + workspace_id = data.get("workspace_id") + relation_ids = data.get("group_relation_ids") if not SystemUserGroup.objects.filter(id=group_id, workspace_id=workspace_id).exists(): raise AppApiException(500, _("User group does not exist")) if not relation_ids: @@ -216,27 +206,27 @@ def remove_member(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) data = self.validated_data - relation_ids = data['group_relation_ids'] + relation_ids = data["group_relation_ids"] SystemUserGroupRelation.objects.filter( id__in=relation_ids, - group_id=data['id'], - group__workspace_id=data['workspace_id'], + group_id=data["id"], + group__workspace_id=data["workspace_id"], ).delete() return True class UserGroupListPageSerializer(serializers.Serializer): class Query(serializers.Serializer): - workspace_id = serializers.CharField(required=True, label='Workspace ID') - group_id = serializers.CharField(required=True, label=_('Group ID')) - username = serializers.CharField(required=False, label=_('Username'), allow_null=True) - nick_name = serializers.CharField(required=False, label=_('Nick Name'), allow_null=True) - source = serializers.CharField(required=False, label=_('Source'), allow_null=True) + workspace_id = serializers.CharField(required=True, label="Workspace ID") + group_id = serializers.CharField(required=True, label=_("Group ID")) + username = serializers.CharField(required=False, label=_("Username"), allow_null=True) + nick_name = serializers.CharField(required=False, label=_("Nick Name"), allow_null=True) + source = serializers.CharField(required=False, label=_("Source"), allow_null=True) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=raise_exception) - group_id = self.data.get('group_id') - workspace_id = self.data.get('workspace_id') + group_id = self.data.get("group_id") + workspace_id = self.data.get("workspace_id") if not SystemUserGroup.objects.filter(id=group_id, workspace_id=workspace_id).exists(): raise AppApiException(500, _("User group does not exist")) @@ -249,17 +239,39 @@ def page(self, current_page, page_size): query_set, post_records_handler=lambda relation: { **UserInstanceSerializer(relation.user).data, - 'system_user_group_relation_id': relation.id - } + "system_user_group_relation_id": relation.id, + }, ) + + # 补充用户在指定工作空间的角色 + role_map = self._get_user_role_map(self.data.get("workspace_id"), result["records"]) + for user in result["records"]: + user["roles"] = role_map.get(str(user["id"]), []) return result + def _get_user_role_map(self, workspace_id, records): + """查询 records 中用户在指定工作空间的角色列表""" + role_model = DatabaseModelManage.get_model("role_model") + user_role_relation_model = DatabaseModelManage.get_model("workspace_user_role_mapping") + if not role_model or not user_role_relation_model: + return {} + + user_ids = [str(user["id"]) for user in records] + user_role_relations = user_role_relation_model.objects.filter( + workspace_id=workspace_id, user_id__in=user_ids, role__type="USER" + ).select_related("role", "user") + + role_map = defaultdict(list) + for relation in user_role_relations: + role_map[str(relation.user_id)].append(relation.role.role_name) + return role_map + def get_query_set(self): - group_id = self.data.get('group_id') - username = self.data.get('username') - nick_name = self.data.get('nick_name') - source = self.data.get('source') - query_set = SystemUserGroupRelation.objects.filter(group_id=group_id).select_related('user') + group_id = self.data.get("group_id") + username = self.data.get("username") + nick_name = self.data.get("nick_name") + source = self.data.get("source") + query_set = SystemUserGroupRelation.objects.filter(group_id=group_id).select_related("user") if username is not None: query_set = query_set.filter(user__username__contains=username) @@ -267,4 +279,4 @@ def get_query_set(self): query_set = query_set.filter(user__nick_name__contains=nick_name) if source is not None: query_set = query_set.filter(user__source=source) - return query_set.order_by('-user__create_time') + return query_set.order_by("-user__create_time")