Skip to content

Commit 29b4087

Browse files
committed
permissions: create a PatchDetailPermission to allow non delegate users to edit it
Signed-off-by: andrepapoti <andrepapoti@gmail.com>
1 parent d64a023 commit 29b4087

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

patchwork/api/patch.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from rest_framework.relations import RelatedField
1818
from rest_framework.reverse import reverse
1919
from rest_framework.serializers import SerializerMethodField
20+
from rest_framework import permissions
2021
from rest_framework import status
2122

2223
from patchwork.api.base import BaseHyperlinkedModelSerializer
@@ -30,6 +31,7 @@
3031
from patchwork.models import Patch
3132
from patchwork.models import PatchRelation
3233
from patchwork.models import State
34+
from patchwork.models import User
3335
from patchwork.parser import clean_subject
3436

3537

@@ -373,6 +375,26 @@ def get_queryset(self):
373375
)
374376

375377

378+
class PatchDetailPermission(permissions.BasePermission):
379+
non_delegate_editable_fields = set(['planning_to_review'])
380+
381+
def has_object_permission(self, request, view, obj):
382+
if request.method in permissions.SAFE_METHODS:
383+
return True
384+
385+
data = request.data
386+
387+
if set(data.keys()).issubset(self.non_delegate_editable_fields):
388+
user_id = data['planning_to_review'][0]['user']
389+
reviewing_user = User.objects.get(id=user_id)
390+
if request.user == reviewing_user:
391+
return True
392+
detail = "Only the user can declare it's own intention to reviewing a patch"
393+
raise PermissionDenied(detail=detail)
394+
else:
395+
return obj.is_editable(request.user)
396+
397+
376398
class PatchDetail(RetrieveUpdateAPIView):
377399
"""
378400
get:
@@ -385,7 +407,7 @@ class PatchDetail(RetrieveUpdateAPIView):
385407
Update a patch.
386408
"""
387409

388-
permission_classes = (PatchworkPermission,)
410+
permission_classes = (PatchDetailPermission,)
389411
serializer_class = PatchDetailSerializer
390412

391413
def get_queryset(self):

0 commit comments

Comments
 (0)