17
17
from rest_framework .relations import RelatedField
18
18
from rest_framework .reverse import reverse
19
19
from rest_framework .serializers import SerializerMethodField
20
+ from rest_framework import permissions
20
21
from rest_framework import status
21
22
22
23
from patchwork .api .base import BaseHyperlinkedModelSerializer
30
31
from patchwork .models import Patch
31
32
from patchwork .models import PatchRelation
32
33
from patchwork .models import State
34
+ from patchwork .models import User
33
35
from patchwork .parser import clean_subject
34
36
35
37
@@ -373,6 +375,26 @@ def get_queryset(self):
373
375
)
374
376
375
377
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
+
376
398
class PatchDetail (RetrieveUpdateAPIView ):
377
399
"""
378
400
get:
@@ -385,7 +407,7 @@ class PatchDetail(RetrieveUpdateAPIView):
385
407
Update a patch.
386
408
"""
387
409
388
- permission_classes = (PatchworkPermission ,)
410
+ permission_classes = (PatchDetailPermission ,)
389
411
serializer_class = PatchDetailSerializer
390
412
391
413
def get_queryset (self ):
0 commit comments