Defining more rest framework permissions handlers

remotes/origin/enhancement/email-actions
Jesús Espino 2013-03-30 12:37:31 +01:00
parent 1c80e4f6f9
commit 3ce98ae1b2
3 changed files with 132 additions and 40 deletions

View File

@ -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

View File

@ -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,)

View File

@ -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']