Skip to content

Commit d248d12

Browse files
committed
Refactor engagement permissions: introduce BaseRelatedObjectPermission and update related views
1 parent ec2ef59 commit d248d12

2 files changed

Lines changed: 41 additions & 25 deletions

File tree

dojo/api_v2/permissions.py

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -278,40 +278,55 @@ def has_object_permission(self, request, view, obj):
278278
)
279279

280280

281-
class UserHasEngagementPermission(permissions.BasePermission):
282-
# Permission checks for related objects (like notes or metadata) can be moved
283-
# into a seperate class, when the legacy authorization will be removed.
284-
path_engagement_post = re.compile(r"^/api/v2/engagements/$")
285-
path_engagement = re.compile(r"^/api/v2/engagements/\d+/$")
281+
class BaseRelatedObjectPermission(permissions.BasePermission):
282+
283+
"""
284+
An "abstract" base class for related object permissions (like notes, metadata, etc.)
285+
that only need object permissions, not general permissions. This class will serve as
286+
the base class for other more aptly named permission classes.
287+
"""
288+
289+
permission_map = {
290+
"get_permission": None,
291+
"put_permission": None,
292+
"delete_permission": None,
293+
"post_permission": None,
294+
}
286295

287296
def has_permission(self, request, view):
288-
if UserHasEngagementPermission.path_engagement_post.match(
289-
request.path,
290-
) or UserHasEngagementPermission.path_engagement.match(request.path):
291-
return check_post_permission(
292-
request, Product, "product", Permissions.Engagement_Add,
293-
)
294297
# related object only need object permission
295298
return True
296299

297300
def has_object_permission(self, request, view, obj):
298-
if UserHasEngagementPermission.path_engagement_post.match(
299-
request.path,
300-
) or UserHasEngagementPermission.path_engagement.match(request.path):
301-
return check_object_permission(
302-
request,
303-
obj,
304-
Permissions.Engagement_View,
305-
Permissions.Engagement_Edit,
306-
Permissions.Engagement_Delete,
301+
return check_object_permission(
302+
request,
303+
obj,
304+
**self.permission_map,
305+
)
306+
307+
308+
class UserHasEngagementRelatedObjectPermission(BaseRelatedObjectPermission):
309+
permission_map = {
310+
"get_permission": Permissions.Engagement_View,
311+
"put_permission": Permissions.Engagement_Edit,
312+
"delete_permission": Permissions.Engagement_Edit,
313+
"post_permission": Permissions.Engagement_Edit,
314+
}
315+
316+
317+
class UserHasEngagementPermission(permissions.BasePermission):
318+
def has_permission(self, request, view):
319+
return check_post_permission(
320+
request, Product, "product", Permissions.Engagement_Add,
307321
)
322+
323+
def has_object_permission(self, request, view, obj):
308324
return check_object_permission(
309325
request,
310326
obj,
311327
Permissions.Engagement_View,
312328
Permissions.Engagement_Edit,
313-
Permissions.Engagement_Edit,
314-
Permissions.Engagement_Edit,
329+
Permissions.Engagement_Delete,
315330
)
316331

317332

dojo/api_v2/views.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ def generate_report(self, request, pk=None):
503503
request=serializers.AddNewNoteOptionSerializer,
504504
responses={status.HTTP_201_CREATED: serializers.NoteSerializer},
505505
)
506-
@action(detail=True, methods=["get", "post"])
506+
@action(detail=True, methods=["get", "post"], permission_classes=[IsAuthenticated, permissions.UserHasEngagementRelatedObjectPermission])
507507
def notes(self, request, pk=None):
508508
engagement = self.get_object()
509509
if request.method == "POST":
@@ -567,7 +567,7 @@ def notes(self, request, pk=None):
567567
responses={status.HTTP_201_CREATED: serializers.FileSerializer},
568568
)
569569
@action(
570-
detail=True, methods=["get", "post"], parser_classes=(MultiPartParser,),
570+
detail=True, methods=["get", "post"], parser_classes=(MultiPartParser,), permission_classes=[IsAuthenticated, permissions.UserHasEngagementRelatedObjectPermission],
571571
)
572572
def files(self, request, pk=None):
573573
engagement = self.get_object()
@@ -603,7 +603,7 @@ def files(self, request, pk=None):
603603
status.HTTP_201_CREATED: serializers.EngagementCheckListSerializer,
604604
},
605605
)
606-
@action(detail=True, methods=["get", "post"])
606+
@action(detail=True, methods=["get", "post"], permission_classes=[IsAuthenticated, permissions.UserHasEngagementRelatedObjectPermission])
607607
def complete_checklist(self, request, pk=None):
608608
engagement = self.get_object()
609609
check_lists = Check_List.objects.filter(engagement=engagement)
@@ -650,6 +650,7 @@ def complete_checklist(self, request, pk=None):
650650
detail=True,
651651
methods=["get"],
652652
url_path=r"files/download/(?P<file_id>\d+)",
653+
permission_classes=[IsAuthenticated, permissions.UserHasEngagementRelatedObjectPermission],
653654
)
654655
def download_file(self, request, file_id, pk=None):
655656
engagement = self.get_object()

0 commit comments

Comments
 (0)