1717from rest_framework .relations import RelatedField
1818from rest_framework .reverse import reverse
1919from rest_framework .serializers import SerializerMethodField
20+ from rest_framework import permissions
2021from rest_framework import status
2122
2223from patchwork .api .base import BaseHyperlinkedModelSerializer
3031from patchwork .models import Patch
3132from patchwork .models import PatchRelation
3233from patchwork .models import State
34+ from patchwork .models import User
3335from 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+
376398class 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