From 528372aff613b4f76125e7034e307f9bc7fd143a Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 23 Nov 2023 12:34:34 +0530 Subject: [PATCH] chore: user deactivation --- apiserver/plane/app/views/user.py | 74 +++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/apiserver/plane/app/views/user.py b/apiserver/plane/app/views/user.py index ed1178886..cc1b8dd53 100644 --- a/apiserver/plane/app/views/user.py +++ b/apiserver/plane/app/views/user.py @@ -12,11 +12,14 @@ from plane.app.serializers import ( ) from plane.app.views.base import BaseViewSet, BaseAPIView -from plane.db.models import User, IssueActivity, WorkspaceMember +from plane.db.models import User, IssueActivity, WorkspaceMember, ProjectMember from plane.license.models import Instance, InstanceAdmin from plane.utils.paginator import BasePaginator +from django.db.models import Q, F, Count, Case, When, Value, IntegerField + + class UserEndpoint(BaseViewSet): serializer_class = UserSerializer model = User @@ -45,13 +48,68 @@ class UserEndpoint(BaseViewSet): def deactivate(self, request): # Check all workspace user is active user = self.get_object() - if WorkspaceMember.objects.filter(member=request.user, is_active=True).exists(): - return Response( - { - "error": "User cannot deactivate account as user is active in some workspaces" - }, - status=status.HTTP_400_BAD_REQUEST, - ) + + projects_to_deactivate = [] + workspaces_to_deactivate = [] + + + projects = ProjectMember.objects.filter( + member=request.user, is_active=True + ).annotate( + other_admin_exists=Count( + Case( + When(Q(role=20, is_active=True) & ~Q(member=request.user), then=1), + default=0, + output_field=IntegerField(), + ) + ), + total_members=Count("id"), + ) + + for project in projects: + if project.other_admin_exists > 0 or (project.total_members == 1): + project.is_active = False + projects_to_deactivate.append(project) + else: + return Response( + { + "error": "You cannot deactivate account as you are the only admin in some projects." + }, + status=status.HTTP_400_BAD_REQUEST, + ) + + workspaces = WorkspaceMember.objects.filter( + member=request.user, is_active=True + ).annotate( + other_admin_exists=Count( + Case( + When(Q(role=20, is_active=True) & ~Q(member=request.user), then=1), + default=0, + output_field=IntegerField(), + ) + ), + total_members=Count("id"), + ) + + for workspace in workspaces: + if workspace.other_admin_exists > 0 or (workspace.total_members == 1): + workspace.is_active = False + workspaces_to_deactivate.append(workspace) + else: + return Response( + { + "error": "You cannot deactivate account as you are the only admin in some workspaces." + }, + status=status.HTTP_400_BAD_REQUEST, + ) + + ProjectMember.objects.bulk_update( + projects_to_deactivate, ["is_active"], batch_size=100 + ) + + WorkspaceMember.objects.bulk_update( + workspaces_to_deactivate, ["is_active"], batch_size=100 + ) # Deactivate the user user.is_active = False