diff --git a/apps/users/api/user.py b/apps/users/api/user.py index fb5c8a0c5..2c22cf270 100644 --- a/apps/users/api/user.py +++ b/apps/users/api/user.py @@ -129,6 +129,11 @@ class DeleteUserApi(APIMixin): required=True, )] + @staticmethod + def get_request(): + return serializers.ListSerializer(child=serializers.CharField(required=True), required=True, + label=_('User IDs')) + class ChangeUserPasswordApi(APIMixin): @staticmethod diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 63d483477..461dd7d4b 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -403,6 +403,18 @@ class UserManageSerializer(serializers.Serializer): users = User.objects.filter(id__in=user_ids).values('id', 'nick_name') return list(users) + class BatchDelete(serializers.Serializer): + ids = serializers.ListField(required=True, label=_('User IDs')) + + def batch_delete(self, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + ids = self.data.get('ids') + if not ids: + raise AppApiException(1004, _('User IDs cannot be empty')) + User.objects.filter(id__in=ids).delete() + return True + def update_user_role(instance, user): workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping") diff --git a/apps/users/urls.py b/apps/users/urls.py index 56a3c7e6d..68c641659 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -13,6 +13,7 @@ urlpatterns = [ path('workspace//user/profile', views.TestWorkspacePermissionUserView.as_view(), name="test_workspace_id_permission"), path("user_manage", views.UserManage.as_view(), name="user_manage"), + path("user_manage/batch_delete", views.UserManage.BatchDelete.as_view()), path("user_manage/password", views.UserManage.Password.as_view()), path("user_manage/", views.UserManage.Operate.as_view(), name="user_manage_operate"), path("user_manage//re_password", views.UserManage.RePassword.as_view(), diff --git a/apps/users/views/user.py b/apps/users/views/user.py index 6163bdb41..7ee15ba80 100644 --- a/apps/users/views/user.py +++ b/apps/users/views/user.py @@ -145,6 +145,20 @@ class UserManage(APIView): return result.success( UserManageSerializer.Operate(data={'id': user_id}).edit(request.data, with_valid=True)) + class BatchDelete(APIView): + authentication_classes = [TokenAuth] + + @extend_schema(methods=['POST'], + description=_("Batch delete user"), + summary=_("Batch delete user"), + operation_id=_("Batch delete user"), # type: ignore + tags=[_("User Management")], # type: ignore + request=DeleteUserApi.get_request(), + responses=DefaultModelResponse.get_response()) + @has_permissions(PermissionConstants.USER_DELETE) + def post(self, request: Request): + return result.success(UserManageSerializer.BatchDelete(data=request.data).batch_delete(with_valid=True)) + class RePassword(APIView): authentication_classes = [TokenAuth]