forked from github/plane
Merge branch 'chore/user_deactivation' of github.com:makeplane/plane into develop-deploy
This commit is contained in:
commit
762d68ad22
@ -12,11 +12,14 @@ from plane.app.serializers import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from plane.app.views.base import BaseViewSet, BaseAPIView
|
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.license.models import Instance, InstanceAdmin
|
||||||
from plane.utils.paginator import BasePaginator
|
from plane.utils.paginator import BasePaginator
|
||||||
|
|
||||||
|
|
||||||
|
from django.db.models import Q, F, Count, Case, When, Value, IntegerField
|
||||||
|
|
||||||
|
|
||||||
class UserEndpoint(BaseViewSet):
|
class UserEndpoint(BaseViewSet):
|
||||||
serializer_class = UserSerializer
|
serializer_class = UserSerializer
|
||||||
model = User
|
model = User
|
||||||
@ -45,14 +48,69 @@ class UserEndpoint(BaseViewSet):
|
|||||||
def deactivate(self, request):
|
def deactivate(self, request):
|
||||||
# Check all workspace user is active
|
# Check all workspace user is active
|
||||||
user = self.get_object()
|
user = self.get_object()
|
||||||
if WorkspaceMember.objects.filter(member=request.user, is_active=True).exists():
|
|
||||||
|
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(
|
return Response(
|
||||||
{
|
{
|
||||||
"error": "You cannot deactivate account as you are a member in some workspaces."
|
"error": "You cannot deactivate account as you are the only admin in some projects."
|
||||||
},
|
},
|
||||||
status=status.HTTP_400_BAD_REQUEST,
|
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
|
# Deactivate the user
|
||||||
user.is_active = False
|
user.is_active = False
|
||||||
user.save()
|
user.save()
|
||||||
|
Loading…
Reference in New Issue
Block a user