diff --git a/apps/system_manage/sql/get_resource_user_group_permission_detail.sql b/apps/system_manage/sql/get_resource_user_group_permission_detail.sql index 67541199bf8..0f5a2b34ccd 100644 --- a/apps/system_manage/sql/get_resource_user_group_permission_detail.sql +++ b/apps/system_manage/sql/get_resource_user_group_permission_detail.sql @@ -1,6 +1,7 @@ SELECT u.id, u.name, + COALESCE(ugr."count", 0) AS "count", case when wurp."permission" is null then 'NOT_AUTH' @@ -26,4 +27,15 @@ LEFT JOIN ( ) wurp ON u.id = wurp.user_group_id +LEFT JOIN ( + SELECT + group_id, + COUNT(*) AS "count" + FROM + public."system_user_group_relation" + GROUP BY + group_id +) ugr +ON + u.id = ugr.group_id ${user_query_set} \ No newline at end of file diff --git a/apps/users/serializers/user_group.py b/apps/users/serializers/user_group.py index 848d3355aa9..40f8571f4b7 100644 --- a/apps/users/serializers/user_group.py +++ b/apps/users/serializers/user_group.py @@ -2,6 +2,7 @@ import uuid_utils.compat as uuid from django.db import transaction +from django.db.models import Count from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -32,7 +33,8 @@ def add_or_edit_user_group_relation(user, user_group_ids): class SystemUserGroupModelSerializer(serializers.ModelSerializer): class Meta: model = SystemUserGroup - fields = ['id', 'name', 'workspace_id'] + fields = ['id', 'name', 'workspace_id', 'count'] + class SystemUserGroupCreateSerializer(serializers.Serializer): @@ -61,7 +63,7 @@ def create_or_update_group(self, with_valid=True): data = self.validated_data group_id = data.get('id') name = data['name'] - workspace_id = data.get('workspace_id', 'default') + workspace_id = data['workspace_id'] if group_id: SystemUserGroup.objects.filter(id=group_id, workspace_id=workspace_id).update(name=name) @@ -99,6 +101,21 @@ def delete(self, *, with_valid=True): self.group.delete() return True + class UserGroupListSerializer(serializers.ModelSerializer): + workspace_id = serializers.CharField(required=True, label='Workspace ID') + + def get_user_groups(self, workspace_id: str): + + groups = ( + SystemUserGroup.objects + .filter(workspace_id=workspace_id) + .annotate( + count=Count("systemusergrouprelation_set__user", distinct=True) + ) + .order_by("name") + ) + return SystemUserGroupModelSerializer(groups, many=True).data + class UserGroupAddMemberSerializer(serializers.Serializer): id = serializers.CharField(required=True, label='ID') @@ -181,8 +198,9 @@ class UserGroupRemoveMemberSerializer(serializers.Serializer): def validate(self, data): 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).exists(): + 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: raise AppApiException(500, _("User group relation IDs cannot be empty")) @@ -193,7 +211,11 @@ def remove_member(self, with_valid=True): self.is_valid(raise_exception=True) data = self.validated_data relation_ids = data['group_relation_ids'] - SystemUserGroupRelation.objects.filter(id__in=relation_ids).delete() + SystemUserGroupRelation.objects.filter( + id__in=relation_ids, + group_id=data['id'], + group__workspace_id=data['workspace_id'], + ).delete() return True diff --git a/apps/users/views/system_user_group.py b/apps/users/views/system_user_group.py index bd40f0b6785..5b47efd0868 100644 --- a/apps/users/views/system_user_group.py +++ b/apps/users/views/system_user_group.py @@ -1,6 +1,7 @@ # coding=utf-8 from django.utils.translation import gettext_lazy as _ +from django.db.models import Count from drf_spectacular.utils import extend_schema from rest_framework.request import Request from rest_framework.views import APIView @@ -60,7 +61,12 @@ class SystemUserGroupView(APIView): get_operation_object=_get_operation_object, ) def post(self, request: Request, workspace_id: str): - serializer = SystemUserGroupCreateSerializer(request.data) + serializer = SystemUserGroupCreateSerializer( + data={ + **request.data, + "workspace_id": workspace_id, + } + ) data = serializer.create_or_update_group(with_valid=True) return result.success(data) @@ -75,8 +81,7 @@ def post(self, request: Request, workspace_id: str): ) @has_permissions(PermissionConstants.SYSTEM_USER_GROUP_READ, RoleConstants.ADMIN) def get(self, request: Request, workspace_id: str): - groups = SystemUserGroup.objects.filter(workspace_id=workspace_id).order_by("name") - return result.success(SystemUserGroupModelSerializer(groups, many=True).data) + return result.success(SystemUserGroupCreateSerializer.UserGroupListSerializer().get_user_groups(workspace_id)) class Delete(APIView): authentication_classes = [TokenAuth] @@ -150,7 +155,7 @@ def delete(self, request: Request, workspace_id: str, user_group_id: str): return result.success( UserGroupRemoveMemberSerializer( data={"id": user_group_id, "workspace_id": workspace_id, - "user_ids": request.data.get("user_ids", [])} + "group_relation_ids": request.data.get("group_relation_ids", [])} ).remove_member() )