Defining more rest framework permissions handlers
parent
1c80e4f6f9
commit
3ce98ae1b2
|
@ -0,0 +1,42 @@
|
||||||
|
from rest_framework import permissions
|
||||||
|
|
||||||
|
from greenmine.scrum.models import Membership
|
||||||
|
|
||||||
|
def has_project_perm(user, project, perm):
|
||||||
|
if user.is_authenticated():
|
||||||
|
try:
|
||||||
|
membership = Membership.objects.get(project=project, user=user)
|
||||||
|
if membership.role.permissions.filter(codename=perm).count() > 0:
|
||||||
|
return True
|
||||||
|
except Membership.DoesNotExist:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class BaseDetailPermission(permissions.BasePermission):
|
||||||
|
get_permission = None
|
||||||
|
put_permission = None
|
||||||
|
delete_permission = None
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = []
|
||||||
|
|
||||||
|
def has_object_permission(self, request, view, obj):
|
||||||
|
if request.method in self.safe_methods:
|
||||||
|
return True
|
||||||
|
|
||||||
|
project_obj = obj
|
||||||
|
for attrib in self.path_to_project:
|
||||||
|
project_obj = getattr(project_obj, attrib)
|
||||||
|
|
||||||
|
if request.method == "GET":
|
||||||
|
return has_project_perm(request.user, project_obj, self.get_permission)
|
||||||
|
|
||||||
|
elif request.method == "PUT":
|
||||||
|
return has_project_perm(request.user, project_obj, self.put_permission)
|
||||||
|
|
||||||
|
elif request.method == "DELETE":
|
||||||
|
return has_project_perm(request.user, project_obj, self.delete_permission)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ class UserStoryList(SimpleFilterMixin, generics.ListCreateAPIView):
|
||||||
class UserStoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
class UserStoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = UserStory
|
model = UserStory
|
||||||
serializer_class = UserStorySerializer
|
serializer_class = UserStorySerializer
|
||||||
|
permission_classes = (UserStoryDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class ChangeList(generics.ListCreateAPIView):
|
class ChangeList(generics.ListCreateAPIView):
|
||||||
|
@ -86,6 +87,7 @@ class ChangeList(generics.ListCreateAPIView):
|
||||||
class ChangeDetail(generics.RetrieveUpdateDestroyAPIView):
|
class ChangeDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = Change
|
model = Change
|
||||||
serializer_class = ChangeSerializer
|
serializer_class = ChangeSerializer
|
||||||
|
permission_classes = (ChangeDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class ChangeAttachmentList(generics.ListCreateAPIView):
|
class ChangeAttachmentList(generics.ListCreateAPIView):
|
||||||
|
@ -99,6 +101,7 @@ class ChangeAttachmentList(generics.ListCreateAPIView):
|
||||||
class ChangeAttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
|
class ChangeAttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = ChangeAttachment
|
model = ChangeAttachment
|
||||||
serializer_class = ChangeAttachmentSerializer
|
serializer_class = ChangeAttachmentSerializer
|
||||||
|
permission_classes = (ChangeAttachmentDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class IssueList(generics.ListCreateAPIView):
|
class IssueList(generics.ListCreateAPIView):
|
||||||
|
@ -113,6 +116,7 @@ class IssueList(generics.ListCreateAPIView):
|
||||||
class IssueDetail(generics.RetrieveUpdateDestroyAPIView):
|
class IssueDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = Issue
|
model = Issue
|
||||||
serializer_class = IssueSerializer
|
serializer_class = IssueSerializer
|
||||||
|
permission_classes = (IssueDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class TaskList(generics.ListCreateAPIView):
|
class TaskList(generics.ListCreateAPIView):
|
||||||
|
@ -127,6 +131,7 @@ class TaskList(generics.ListCreateAPIView):
|
||||||
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
|
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = Task
|
model = Task
|
||||||
serializer_class = TaskSerializer
|
serializer_class = TaskSerializer
|
||||||
|
permission_classes = (TaskDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class SeverityList(generics.ListCreateAPIView):
|
class SeverityList(generics.ListCreateAPIView):
|
||||||
|
@ -141,6 +146,7 @@ class SeverityList(generics.ListCreateAPIView):
|
||||||
class SeverityDetail(generics.RetrieveUpdateDestroyAPIView):
|
class SeverityDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = Severity
|
model = Severity
|
||||||
serializer_class = SeveritySerializer
|
serializer_class = SeveritySerializer
|
||||||
|
permission_classes = (SeverityDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusList(generics.ListCreateAPIView):
|
class IssueStatusList(generics.ListCreateAPIView):
|
||||||
|
@ -155,6 +161,7 @@ class IssueStatusList(generics.ListCreateAPIView):
|
||||||
class IssueStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
class IssueStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = IssueStatus
|
model = IssueStatus
|
||||||
serializer_class = IssueStatusSerializer
|
serializer_class = IssueStatusSerializer
|
||||||
|
permission_classes = (IssueStatusDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusList(SimpleFilterMixin, generics.ListCreateAPIView):
|
class TaskStatusList(SimpleFilterMixin, generics.ListCreateAPIView):
|
||||||
|
@ -169,6 +176,7 @@ class TaskStatusList(SimpleFilterMixin, generics.ListCreateAPIView):
|
||||||
class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = TaskStatus
|
model = TaskStatus
|
||||||
serializer_class = TaskStatusSerializer
|
serializer_class = TaskStatusSerializer
|
||||||
|
permission_classes = (TaskStatusDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusList(generics.ListCreateAPIView):
|
class UserStoryStatusList(generics.ListCreateAPIView):
|
||||||
|
@ -183,6 +191,7 @@ class UserStoryStatusList(generics.ListCreateAPIView):
|
||||||
class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = UserStoryStatus
|
model = UserStoryStatus
|
||||||
serializer_class = UserStoryStatusSerializer
|
serializer_class = UserStoryStatusSerializer
|
||||||
|
permission_classes = (UserStoryStatusDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class PriorityList(generics.ListCreateAPIView):
|
class PriorityList(generics.ListCreateAPIView):
|
||||||
|
@ -197,6 +206,7 @@ class PriorityList(generics.ListCreateAPIView):
|
||||||
class PriorityDetail(generics.RetrieveUpdateDestroyAPIView):
|
class PriorityDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = Priority
|
model = Priority
|
||||||
serializer_class = PrioritySerializer
|
serializer_class = PrioritySerializer
|
||||||
|
permission_classes = (PriorityDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeList(generics.ListCreateAPIView):
|
class IssueTypeList(generics.ListCreateAPIView):
|
||||||
|
@ -211,6 +221,7 @@ class IssueTypeList(generics.ListCreateAPIView):
|
||||||
class IssueTypeDetail(generics.RetrieveUpdateDestroyAPIView):
|
class IssueTypeDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = IssueType
|
model = IssueType
|
||||||
serializer_class = IssueTypeSerializer
|
serializer_class = IssueTypeSerializer
|
||||||
|
permission_classes = (IssueTypeDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class PointsList(generics.ListCreateAPIView):
|
class PointsList(generics.ListCreateAPIView):
|
||||||
|
@ -225,3 +236,4 @@ class PointsList(generics.ListCreateAPIView):
|
||||||
class PointsDetail(generics.RetrieveUpdateDestroyAPIView):
|
class PointsDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = Points
|
model = Points
|
||||||
serializer_class = PointsSerializer
|
serializer_class = PointsSerializer
|
||||||
|
permission_classes = (PointsDetailPermission,)
|
||||||
|
|
|
@ -1,43 +1,4 @@
|
||||||
from rest_framework import permissions
|
from greenmine.base.permissions import BaseDetailPermission
|
||||||
|
|
||||||
from greenmine.scrum.models import Membership
|
|
||||||
|
|
||||||
def has_project_perm(user, project, perm):
|
|
||||||
if user.is_authenticated():
|
|
||||||
try:
|
|
||||||
membership = Membership.objects.get(project=project, user=user)
|
|
||||||
if membership.role.permissions.filter(codename=perm).count() > 0:
|
|
||||||
return True
|
|
||||||
except Membership.DoesNotExist:
|
|
||||||
pass
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
class BaseDetailPermission(permissions.BasePermission):
|
|
||||||
get_permission = None
|
|
||||||
put_permission = None
|
|
||||||
delete_permission = None
|
|
||||||
safe_methods = ['HEAD', 'OPTIONS']
|
|
||||||
path_to_project = []
|
|
||||||
|
|
||||||
def has_object_permission(self, request, view, obj):
|
|
||||||
if request.method in self.safe_methods:
|
|
||||||
return True
|
|
||||||
|
|
||||||
project_obj = obj
|
|
||||||
for attrib in self.path_to_project:
|
|
||||||
project_obj = getattr(project_obj, attrib)
|
|
||||||
|
|
||||||
if request.method == "GET":
|
|
||||||
return has_project_perm(request.user, project_obj, self.get_permission)
|
|
||||||
|
|
||||||
elif request.method == "PUT":
|
|
||||||
return has_project_perm(request.user, project_obj, self.put_permission)
|
|
||||||
|
|
||||||
elif request.method == "DELETE":
|
|
||||||
return has_project_perm(request.user, project_obj, self.delete_permission)
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
class ProjectDetailPermission(BaseDetailPermission):
|
class ProjectDetailPermission(BaseDetailPermission):
|
||||||
get_permission = "can_view_project"
|
get_permission = "can_view_project"
|
||||||
|
@ -59,3 +20,80 @@ class UserStoryDetailPermission(BaseDetailPermission):
|
||||||
delete_permission = "can_delete_userstory"
|
delete_permission = "can_delete_userstory"
|
||||||
safe_methods = ['HEAD', 'OPTIONS']
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
path_to_project = ['project']
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class TaskDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_task"
|
||||||
|
put_permission = "can_change_task"
|
||||||
|
delete_permission = "can_delete_task"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class IssueDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_issue"
|
||||||
|
put_permission = "can_change_issue"
|
||||||
|
delete_permission = "can_delete_issue"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class ChangeDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_change"
|
||||||
|
put_permission = "can_change_change"
|
||||||
|
delete_permission = "can_delete_change"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class ChangeAttachmentDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_changeattachment"
|
||||||
|
put_permission = "can_change_changeattachment"
|
||||||
|
delete_permission = "can_delete_changeattachment"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['change', 'project']
|
||||||
|
|
||||||
|
class SeverityDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_severity"
|
||||||
|
put_permission = "can_severity_severity"
|
||||||
|
delete_permission = "can_delete_severity"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class IssueStatusDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_issuestatus"
|
||||||
|
put_permission = "can_severity_issuestatus"
|
||||||
|
delete_permission = "can_delete_issuestatus"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class TaskStatusDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_taskstatus"
|
||||||
|
put_permission = "can_severity_taskstatus"
|
||||||
|
delete_permission = "can_delete_taskstatus"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class UserStoryStatusDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_userstorystatus"
|
||||||
|
put_permission = "can_severity_userstorystatus"
|
||||||
|
delete_permission = "can_delete_userstorystatus"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class PriorityDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_priority"
|
||||||
|
put_permission = "can_severity_priority"
|
||||||
|
delete_permission = "can_delete_priority"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class IssueTypeDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_issuetype"
|
||||||
|
put_permission = "can_severity_issuetype"
|
||||||
|
delete_permission = "can_delete_issuetype"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
||||||
|
class PointsDetailPermission(BaseDetailPermission):
|
||||||
|
get_permission = "can_view_points"
|
||||||
|
put_permission = "can_severity_points"
|
||||||
|
delete_permission = "can_delete_points"
|
||||||
|
safe_methods = ['HEAD', 'OPTIONS']
|
||||||
|
path_to_project = ['project']
|
||||||
|
|
Loading…
Reference in New Issue