Skip to content

Commit 34243e2

Browse files
chore: project admin accesss to workspace admins
1 parent 291101a commit 34243e2

File tree

3 files changed

+48
-8
lines changed

3 files changed

+48
-8
lines changed

apps/api/plane/app/permissions/base.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,31 @@ def _wrapped_view(instance, request, *args, **kwargs):
3939
).exists():
4040
return view_func(instance, request, *args, **kwargs)
4141
else:
42-
if ProjectMember.objects.filter(
42+
is_user_has_allowed_role = ProjectMember.objects.filter(
4343
member=request.user,
4444
workspace__slug=kwargs["slug"],
4545
project_id=kwargs["project_id"],
4646
role__in=allowed_role_values,
4747
is_active=True,
48-
).exists():
48+
).exists()
49+
50+
is_user_part_of_project = ProjectMember.objects.filter(
51+
member=request.user,
52+
workspace__slug=kwargs["slug"],
53+
project_id=kwargs["project_id"],
54+
is_active=True,
55+
).exists()
56+
57+
is_user_workspace_admin = WorkspaceMember.objects.filter(
58+
member=request.user,
59+
workspace__slug=kwargs["slug"],
60+
role=ROLE.ADMIN.value,
61+
is_active=True,
62+
).exists()
63+
64+
if is_user_has_allowed_role:
65+
return view_func(instance, request, *args, **kwargs)
66+
elif is_user_part_of_project and is_user_workspace_admin:
4967
return view_func(instance, request, *args, **kwargs)
5068

5169
# Return permission denied if no conditions are met

apps/api/plane/app/permissions/project.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,31 @@ def has_permission(self, request, view):
3030
is_active=True,
3131
).exists()
3232

33-
## Only Project Admins can update project attributes
34-
return ProjectMember.objects.filter(
33+
is_project_admin = ProjectMember.objects.filter(
3534
workspace__slug=view.workspace_slug,
3635
member=request.user,
3736
role=Admin,
3837
project_id=view.project_id,
3938
is_active=True,
4039
).exists()
4140

41+
is_project_member = ProjectMember.objects.filter(
42+
workspace__slug=view.workspace_slug,
43+
member=request.user,
44+
project_id=view.project_id,
45+
is_active=True,
46+
).exists()
47+
48+
is_user_workspace_admin = WorkspaceMember.objects.filter(
49+
member=request.user,
50+
workspace__slug=view.workspace_slug,
51+
role=Admin,
52+
is_active=True,
53+
).exists()
54+
55+
## Only project admins or workspace admin who is part of the project can access
56+
return is_project_admin or (is_project_member and is_user_workspace_admin)
57+
4258

4359
class ProjectMemberPermission(BasePermission):
4460
def has_permission(self, request, view):

apps/api/plane/app/views/project/base.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
import json
66

77
# Django imports
8-
from django.db import IntegrityError
98
from django.db.models import Exists, F, OuterRef, Prefetch, Q, Subquery
109
from django.core.serializers.json import DjangoJSONEncoder
1110

1211
# Third Party imports
1312
from rest_framework.response import Response
14-
from rest_framework import serializers, status
13+
from rest_framework import status
1514
from rest_framework.permissions import AllowAny
1615

1716
# Module imports
@@ -341,13 +340,20 @@ def create(self, request, slug):
341340

342341
def partial_update(self, request, slug, pk=None):
343342
# try:
344-
if not ProjectMember.objects.filter(
343+
is_workspace_admin = WorkspaceMember.objects.filter(
344+
member=request.user, workspace__slug=slug, is_active=True, role=20
345+
).exists()
346+
347+
is_project_admin = ProjectMember.objects.filter(
345348
member=request.user,
346349
workspace__slug=slug,
347350
project_id=pk,
348351
role=20,
349352
is_active=True,
350-
).exists():
353+
).exists()
354+
355+
# Return error for if the user is neither workspace admin nor project admin
356+
if not is_project_admin and not is_workspace_admin:
351357
return Response(
352358
{"error": "You don't have the required permissions."},
353359
status=status.HTTP_403_FORBIDDEN,

0 commit comments

Comments
 (0)