Port scrum api views to use viewsets and routers.
parent
4804c7a12b
commit
2d31e9754d
|
@ -0,0 +1,27 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from rest_framework import filters
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleFilterBackend(filters.BaseFilterBackend):
|
||||||
|
_special_values_dict = {
|
||||||
|
'true': True,
|
||||||
|
'false': False,
|
||||||
|
'null': None,
|
||||||
|
}
|
||||||
|
|
||||||
|
def filter_queryset(self, request, queryset, view):
|
||||||
|
query_params = {}
|
||||||
|
|
||||||
|
for field_name in view.filter_fields:
|
||||||
|
if field_name in request.QUERY_PARAMS:
|
||||||
|
field_data = request.QUERY_PARAMS[field_name]
|
||||||
|
if field_data in self._special_values_dict:
|
||||||
|
query_params[field_name] = self._special_values_dict[field_data]
|
||||||
|
else:
|
||||||
|
query_params[field_name] = field_data
|
||||||
|
|
||||||
|
if query_params:
|
||||||
|
queryset = queryset.filter(**query_params)
|
||||||
|
|
||||||
|
return queryset
|
|
@ -3,10 +3,18 @@
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
# Special router for actions.
|
# Special router for actions.
|
||||||
actions_router = routers.Route(url=r'^{prefix}/actions/{methodname}{trailing_slash}$',
|
actions_router = routers.Route(url=r'^{prefix}/{methodname}{trailing_slash}$',
|
||||||
mapping={'{httpmethod}': '{methodname}'},
|
mapping={'{httpmethod}': '{methodname}'},
|
||||||
name='{basename}-{methodnamehyphen}',
|
name='{basename}-{methodnamehyphen}',
|
||||||
initkwargs={})
|
initkwargs={})
|
||||||
|
|
||||||
|
|
||||||
class Router(routers.DefaultRouter):
|
class Router(routers.DefaultRouter):
|
||||||
routes = routers.DefaultRouter.routes + [actions_router]
|
routes = [
|
||||||
|
routers.DefaultRouter.routes[0],
|
||||||
|
actions_router,
|
||||||
|
routers.DefaultRouter.routes[2],
|
||||||
|
routers.DefaultRouter.routes[1]]
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["Router"]
|
||||||
|
|
|
@ -2,8 +2,7 @@
|
||||||
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
|
||||||
import django_filters
|
from rest_framework import mixins, viewsets
|
||||||
from rest_framework import generics
|
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from greenmine.base.models import *
|
from greenmine.base.models import *
|
||||||
|
@ -13,366 +12,306 @@ from greenmine.scrum.serializers import *
|
||||||
from greenmine.scrum.models import *
|
from greenmine.scrum.models import *
|
||||||
from greenmine.scrum.permissions import *
|
from greenmine.scrum.permissions import *
|
||||||
|
|
||||||
|
# Generic viewset subclasses for this module
|
||||||
|
|
||||||
class UserStoryFilter(django_filters.FilterSet):
|
class ModelCrudViewSet(mixins.CreateModelMixin, mixins.ListModelMixin,
|
||||||
no_milestone = django_filters.NumberFilter(name="milestone", lookup_type='isnull')
|
mixins.RetrieveModelMixin, mixins.UpdateModelMixin,
|
||||||
|
mixins.DestroyModelMixin, viewsets.GenericViewSet):
|
||||||
class Meta:
|
pass
|
||||||
model = UserStory
|
|
||||||
fields = ['project', 'milestone', 'no_milestone']
|
|
||||||
|
|
||||||
|
|
||||||
class SimpleFilterMixin(object):
|
class ModelListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,
|
||||||
filter_fields = []
|
viewsets.GenericViewSet):
|
||||||
filter_special_fields = []
|
pass
|
||||||
|
|
||||||
_special_values_dict = {
|
|
||||||
'true': True,
|
|
||||||
'false': False,
|
|
||||||
'null': None,
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
queryset = super(SimpleFilterMixin, self).get_queryset()
|
|
||||||
query_params = {}
|
|
||||||
|
|
||||||
for field_name in self.filter_fields:
|
|
||||||
if field_name in self.request.QUERY_PARAMS:
|
|
||||||
field_data = self.request.QUERY_PARAMS[field_name]
|
|
||||||
if field_data in self._special_values_dict:
|
|
||||||
query_params[field_name] = self._special_values_dict[field_data]
|
|
||||||
else:
|
|
||||||
query_params[field_name] = field_data
|
|
||||||
|
|
||||||
if query_params:
|
|
||||||
queryset = queryset.filter(**query_params)
|
|
||||||
|
|
||||||
return queryset
|
|
||||||
|
|
||||||
|
|
||||||
class ProjectList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
||||||
model = Project
|
|
||||||
serializer_class = ProjectSerializer
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
create_notification_template = "create_project_notification"
|
|
||||||
update_notification_template = "update_project_notification"
|
|
||||||
destroy_notification_template = "destroy_project_notification"
|
|
||||||
|
|
||||||
def get_queryset(self):
|
# ViewSets definition
|
||||||
qs = self.model.objects.filter(
|
|
||||||
Q(owner=self.request.user) | Q(members=self.request.user)
|
|
||||||
)
|
|
||||||
return qs.distinct()
|
|
||||||
|
|
||||||
def pre_save(self, obj):
|
class ProjectViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
||||||
obj.owner = self.request.user
|
queryset = Project.objects.all()
|
||||||
|
|
||||||
|
|
||||||
class ProjectDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
model = Project
|
|
||||||
serializer_class = ProjectSerializer
|
serializer_class = ProjectSerializer
|
||||||
permission_classes = (IsAuthenticated, ProjectDetailPermission,)
|
permission_classes = (IsAuthenticated, ProjectDetailPermission,)
|
||||||
|
|
||||||
create_notification_template = "create_project_notification"
|
create_notification_template = "create_project_notification"
|
||||||
update_notification_template = "update_project_notification"
|
update_notification_template = "update_project_notification"
|
||||||
destroy_notification_template = "destroy_project_notification"
|
destroy_notification_template = "destroy_project_notification"
|
||||||
|
|
||||||
|
|
||||||
class MilestoneList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
||||||
model = Milestone
|
|
||||||
serializer_class = MilestoneSerializer
|
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
create_notification_template = "create_milestone_notification"
|
|
||||||
update_notification_template = "update_milestone_notification"
|
|
||||||
destroy_notification_template = "destroy_milestone_notification"
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(ProjectViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(Q(owner=self.request.user) |
|
||||||
|
Q(members=self.request.user))
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
|
super(ProjectViewSet, self).pre_save(obj)
|
||||||
obj.owner = self.request.user
|
obj.owner = self.request.user
|
||||||
|
|
||||||
|
|
||||||
class MilestoneDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
model = Milestone
|
class MilestoneViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
||||||
|
queryset = Milestone.objects.all()
|
||||||
serializer_class = MilestoneSerializer
|
serializer_class = MilestoneSerializer
|
||||||
permission_classes = (IsAuthenticated, MilestoneDetailPermission,)
|
permission_classes = (IsAuthenticated, MilestoneDetailPermission,)
|
||||||
create_notification_template = "create_milestone_notification"
|
create_notification_template = "create_milestone_notification"
|
||||||
update_notification_template = "update_milestone_notification"
|
update_notification_template = "update_milestone_notification"
|
||||||
destroy_notification_template = "destroy_milestone_notification"
|
destroy_notification_template = "destroy_milestone_notification"
|
||||||
|
|
||||||
|
filter_fields = ('project',)
|
||||||
class UserStoryList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
||||||
model = UserStory
|
|
||||||
serializer_class = UserStorySerializer
|
|
||||||
filter_class = UserStoryFilter
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
create_notification_template = "create_user_story_notification"
|
|
||||||
update_notification_template = "update_user_story_notification"
|
|
||||||
destroy_notification_template = "destroy_user_story_notification"
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(MilestoneViewSet, self).get_queryset()
|
||||||
return qs.distinct()
|
return qs.filter(project__members=self.request.user).distinct()
|
||||||
|
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
|
super(MilestoneViewSet, self).pre_save(obj)
|
||||||
obj.owner = self.request.user
|
obj.owner = self.request.user
|
||||||
|
|
||||||
|
|
||||||
class UserStoryDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
class UserStoryViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
||||||
model = UserStory
|
queryset = UserStory.objects.all()
|
||||||
serializer_class = UserStorySerializer
|
serializer_class = UserStorySerializer
|
||||||
permission_classes = (IsAuthenticated, UserStoryDetailPermission,)
|
permission_classes = (IsAuthenticated, UserStoryDetailPermission,)
|
||||||
|
|
||||||
create_notification_template = "create_user_story_notification"
|
create_notification_template = "create_user_story_notification"
|
||||||
update_notification_template = "update_user_story_notification"
|
update_notification_template = "update_user_story_notification"
|
||||||
destroy_notification_template = "destroy_user_story_notification"
|
destroy_notification_template = "destroy_user_story_notification"
|
||||||
|
|
||||||
|
filter_fields = ['project', 'milestone', 'milestone__isnull']
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
qs = super(UserStoryViewSet, self).get_queryset()
|
||||||
|
return qs.filter(project__members=self.request.user).distinct()
|
||||||
|
|
||||||
|
def pre_save(self, obj):
|
||||||
|
super(UserStoryViewSet, self).pre_save(obj)
|
||||||
|
obj.owner = self.request.user
|
||||||
|
|
||||||
def post_save(self, obj, created=False):
|
def post_save(self, obj, created=False):
|
||||||
with reversion.create_revision():
|
with reversion.create_revision():
|
||||||
if "comment" in self.request.DATA:
|
if "comment" in self.request.DATA:
|
||||||
# Update the comment in the last version
|
# Update the comment in the last version
|
||||||
reversion.set_comment(self.request.DATA['comment'])
|
reversion.set_comment(self.request.DATA['comment'])
|
||||||
super(UserStoryDetail, self).post_save(obj, created)
|
super(UserStoryViewSet, self).post_save(obj, created)
|
||||||
|
|
||||||
|
|
||||||
class AttachmentFilter(django_filters.FilterSet):
|
|
||||||
class Meta:
|
|
||||||
model = Attachment
|
|
||||||
fields = ['project', 'object_id']
|
|
||||||
|
|
||||||
|
|
||||||
class IssuesAttachmentList(generics.ListCreateAPIView):
|
class IssuesAttachmentViewSet(ModelCrudViewSet):
|
||||||
model = Attachment
|
model = Attachment
|
||||||
serializer_class = AttachmentSerializer
|
serializer_class = AttachmentSerializer
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated, AttachmentDetailPermission,)
|
||||||
filter_class = AttachmentFilter
|
|
||||||
|
filter_fields = ["project", "object_id"]
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
ct = ContentType.objects.get_for_model(Issue)
|
ct = ContentType.objects.get_for_model(Issue)
|
||||||
qs = super(IssuesAttachmentList, self).get_queryset()\
|
qs = super(IssuesAttachmentViewSet, self).get_queryset()
|
||||||
.filter(project__members=self.request.user)\
|
|
||||||
.filter(content_type=ct)
|
qs = qs.filter(project__members=self.request.user)
|
||||||
|
qs = qs.filter(content_type=ct)
|
||||||
|
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
|
super(IssuesAttachmentViewSet, self).pre_save(obj)
|
||||||
obj.content_type = ContentType.objects.get_for_model(Issue)
|
obj.content_type = ContentType.objects.get_for_model(Issue)
|
||||||
obj.owner = self.request.user
|
obj.owner = self.request.user
|
||||||
|
|
||||||
|
|
||||||
class IssuesAttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
|
class TasksAttachmentViewSet(ModelCrudViewSet):
|
||||||
model = Attachment
|
model = Attachment
|
||||||
serializer_class = AttachmentSerializer
|
serializer_class = AttachmentSerializer
|
||||||
permission_classes = (IsAuthenticated, AttachmentDetailPermission,)
|
permission_classes = (IsAuthenticated, AttachmentDetailPermission,)
|
||||||
|
filter_fields = ["project", "object_id"]
|
||||||
|
|
||||||
class TasksAttachmentList(generics.ListCreateAPIView):
|
|
||||||
model = Attachment
|
|
||||||
serializer_class = AttachmentSerializer
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
filter_class = AttachmentFilter
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
ct = ContentType.objects.get_for_model(Task)
|
ct = ContentType.objects.get_for_model(Task)
|
||||||
qs = super(TasksAttachmentList, self).get_queryset()\
|
qs = super(TasksAttachmentViewSet, self).get_queryset()
|
||||||
.filter(project__members=self.request.user)\
|
|
||||||
.filter(content_type=ct)
|
qs = qs.filter(project__members=self.request.user)
|
||||||
|
qs = qs.filter(content_type=ct)
|
||||||
|
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
|
super(TasksAttachmentViewSet, self).pre_save(obj)
|
||||||
obj.content_type = ContentType.objects.get_for_model(Task)
|
obj.content_type = ContentType.objects.get_for_model(Task)
|
||||||
obj.owner = self.request.user
|
obj.owner = self.request.user
|
||||||
|
|
||||||
|
|
||||||
class TasksAttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
|
class TaskViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
||||||
model = Attachment
|
queryset = Task.objects.all()
|
||||||
serializer_class = AttachmentSerializer
|
|
||||||
permission_classes = (IsAuthenticated, AttachmentDetailPermission,)
|
|
||||||
|
|
||||||
|
|
||||||
class TaskList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
||||||
model = Task
|
|
||||||
serializer_class = TaskSerializer
|
serializer_class = TaskSerializer
|
||||||
filter_fields = ('user_story', 'milestone', 'project')
|
permission_classes = (IsAuthenticated, TaskDetailPermission,)
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
create_notification_template = "create_task_notification"
|
create_notification_template = "create_task_notification"
|
||||||
update_notification_template = "update_task_notification"
|
update_notification_template = "update_task_notification"
|
||||||
destroy_notification_template = "destroy_task_notification"
|
destroy_notification_template = "destroy_task_notification"
|
||||||
|
filter_fields = ['user_story', 'milestone', 'project']
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(TaskViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
|
super(TaskViewSet, self).pre_save(obj)
|
||||||
obj.owner = self.request.user
|
obj.owner = self.request.user
|
||||||
obj.milestone = obj.user_story.milestone
|
obj.milestone = obj.user_story.milestone
|
||||||
|
|
||||||
|
|
||||||
class TaskDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
model = Task
|
|
||||||
serializer_class = TaskSerializer
|
|
||||||
permission_classes = (IsAuthenticated, TaskDetailPermission,)
|
|
||||||
create_notification_template = "create_task_notification"
|
|
||||||
update_notification_template = "update_task_notification"
|
|
||||||
destroy_notification_template = "destroy_task_notification"
|
|
||||||
|
|
||||||
def post_save(self, obj, created=False):
|
def post_save(self, obj, created=False):
|
||||||
with reversion.create_revision():
|
with reversion.create_revision():
|
||||||
if "comment" in self.request.DATA:
|
if "comment" in self.request.DATA:
|
||||||
# Update the comment in the last version
|
# Update the comment in the last version
|
||||||
reversion.set_comment(self.request.DATA['comment'])
|
reversion.set_comment(self.request.DATA['comment'])
|
||||||
super(TaskDetail, self).post_save(obj, created)
|
super(TaskViewSet, self).post_save(obj, created)
|
||||||
|
|
||||||
|
|
||||||
class IssueList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
||||||
model = Issue
|
|
||||||
serializer_class = IssueSerializer
|
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
create_notification_template = "create_issue_notification"
|
|
||||||
update_notification_template = "update_issue_notification"
|
|
||||||
destroy_notification_template = "destroy_issue_notification"
|
|
||||||
|
|
||||||
def pre_save(self, obj):
|
class IssueViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
||||||
obj.owner = self.request.user
|
queryset = Issue.objects.all()
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
|
||||||
return qs.distinct()
|
|
||||||
|
|
||||||
|
|
||||||
class IssueDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
model = Issue
|
|
||||||
serializer_class = IssueSerializer
|
serializer_class = IssueSerializer
|
||||||
permission_classes = (IsAuthenticated, IssueDetailPermission,)
|
permission_classes = (IsAuthenticated, IssueDetailPermission,)
|
||||||
|
|
||||||
create_notification_template = "create_issue_notification"
|
create_notification_template = "create_issue_notification"
|
||||||
update_notification_template = "update_issue_notification"
|
update_notification_template = "update_issue_notification"
|
||||||
destroy_notification_template = "destroy_issue_notification"
|
destroy_notification_template = "destroy_issue_notification"
|
||||||
|
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
|
def pre_save(self, obj):
|
||||||
|
super(IssueViewSet, self).pre_save(obj)
|
||||||
|
obj.owner = self.request.user
|
||||||
|
|
||||||
def post_save(self, obj, created=False):
|
def post_save(self, obj, created=False):
|
||||||
with reversion.create_revision():
|
with reversion.create_revision():
|
||||||
if "comment" in self.request.DATA:
|
if "comment" in self.request.DATA:
|
||||||
# Update the comment in the last version
|
# Update the comment in the last version
|
||||||
reversion.set_comment(self.request.DATA['comment'])
|
reversion.set_comment(self.request.DATA['comment'])
|
||||||
super(IssueDetail, self).post_save(obj, created)
|
super(IssueViewSet, self).post_save(obj, created)
|
||||||
|
|
||||||
|
|
||||||
class SeverityList(generics.ListCreateAPIView):
|
|
||||||
model = Severity
|
|
||||||
serializer_class = SeveritySerializer
|
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(IssueViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
|
|
||||||
class SeverityDetail(generics.RetrieveUpdateDestroyAPIView):
|
class SeverityViewSet(ModelListViewSet):
|
||||||
model = Severity
|
queryset = Severity.objects.all()
|
||||||
serializer_class = SeveritySerializer
|
serializer_class = SeveritySerializer
|
||||||
permission_classes = (IsAuthenticated, SeverityDetailPermission,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
qs = super(SeverityViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
|
return qs.distinct()
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusList(generics.ListCreateAPIView):
|
#class SeverityDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = IssueStatus
|
# model = Severity
|
||||||
|
# serializer_class = SeveritySerializer
|
||||||
|
# permission_classes = (IsAuthenticated, SeverityDetailPermission,)
|
||||||
|
|
||||||
|
class IssueStatusViewSet(ModelListViewSet):
|
||||||
|
queryset = IssueStatus.objects.all()
|
||||||
|
|
||||||
serializer_class = IssueStatusSerializer
|
serializer_class = IssueStatusSerializer
|
||||||
filter_fields = ('project',)
|
filter_fields = ('project',)
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(IssueStatusViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
class TaskStatusViewSet(ModelListViewSet):
|
||||||
model = IssueStatus
|
|
||||||
serializer_class = IssueStatusSerializer
|
|
||||||
permission_classes = (IsAuthenticated, IssueStatusDetailPermission,)
|
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusList(SimpleFilterMixin, generics.ListCreateAPIView):
|
|
||||||
model = TaskStatus
|
model = TaskStatus
|
||||||
serializer_class = TaskStatusSerializer
|
serializer_class = TaskStatusSerializer
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(TaskStatusViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
#class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = TaskStatus
|
# model = TaskStatus
|
||||||
serializer_class = TaskStatusSerializer
|
# serializer_class = TaskStatusSerializer
|
||||||
permission_classes = (IsAuthenticated, TaskStatusDetailPermission,)
|
# permission_classes = (IsAuthenticated, TaskStatusDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusList(generics.ListCreateAPIView):
|
class UserStoryStatusViewSet(ModelListViewSet):
|
||||||
model = UserStoryStatus
|
model = UserStoryStatus
|
||||||
serializer_class = UserStoryStatusSerializer
|
serializer_class = UserStoryStatusSerializer
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(UserStoryStatusViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
#class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = UserStoryStatus
|
# model = UserStoryStatus
|
||||||
serializer_class = UserStoryStatusSerializer
|
# serializer_class = UserStoryStatusSerializer
|
||||||
permission_classes = (IsAuthenticated, UserStoryStatusDetailPermission,)
|
# permission_classes = (IsAuthenticated, UserStoryStatusDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class PriorityList(generics.ListCreateAPIView):
|
class PriorityViewSet(ModelListViewSet):
|
||||||
model = Priority
|
model = Priority
|
||||||
serializer_class = PrioritySerializer
|
serializer_class = PrioritySerializer
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(PriorityViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
|
|
||||||
class PriorityDetail(generics.RetrieveUpdateDestroyAPIView):
|
#class PriorityDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = Priority
|
# model = Priority
|
||||||
serializer_class = PrioritySerializer
|
# serializer_class = PrioritySerializer
|
||||||
permission_classes = (IsAuthenticated, PriorityDetailPermission,)
|
# permission_classes = (IsAuthenticated, PriorityDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeList(generics.ListCreateAPIView):
|
class IssueTypeViewSet(ModelListViewSet):
|
||||||
model = IssueType
|
model = IssueType
|
||||||
serializer_class = IssueTypeSerializer
|
serializer_class = IssueTypeSerializer
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
qs = super(IssueTypeViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
|
return qs.distinct()
|
||||||
|
|
||||||
|
#class IssueTypeDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
# model = IssueType
|
||||||
|
# serializer_class = IssueTypeSerializer
|
||||||
|
# permission_classes = (IsAuthenticated, IssueTypeDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
|
class PointsViewSet(ModelListViewSet):
|
||||||
|
model = Points
|
||||||
|
serializer_class = PointsSerializer
|
||||||
|
permission_classes = (IsAuthenticated,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
qs = super(PointsViewSet, self).get_queryset()
|
||||||
|
qs = qs.filter(project__members=self.request.user)
|
||||||
return qs.distinct()
|
return qs.distinct()
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeDetail(generics.RetrieveUpdateDestroyAPIView):
|
#class PointsDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
model = IssueType
|
# model = Points
|
||||||
serializer_class = IssueTypeSerializer
|
# serializer_class = PointsSerializer
|
||||||
permission_classes = (IsAuthenticated, IssueTypeDetailPermission,)
|
# permission_classes = (IsAuthenticated, PointsDetailPermission,)
|
||||||
|
|
||||||
|
|
||||||
class PointsList(generics.ListCreateAPIView):
|
|
||||||
model = Points
|
|
||||||
serializer_class = PointsSerializer
|
|
||||||
filter_fields = ('project',)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
qs = self.model.objects.filter(project__members=self.request.user)
|
|
||||||
return qs.distinct()
|
|
||||||
|
|
||||||
|
|
||||||
class PointsDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
model = Points
|
|
||||||
serializer_class = PointsSerializer
|
|
||||||
permission_classes = (IsAuthenticated, PointsDetailPermission,)
|
|
||||||
|
|
|
@ -6,39 +6,52 @@ from rest_framework.urlpatterns import format_suffix_patterns
|
||||||
from greenmine.scrum import api
|
from greenmine.scrum import api
|
||||||
from greenmine.base import routers
|
from greenmine.base import routers
|
||||||
|
|
||||||
#router = routers.Router(trailing_slash=False)
|
|
||||||
#router.register("users", api.UsersViewSet, base_name="users")
|
|
||||||
#router.register("roles", api.RolesViewSet, base_name="roles")
|
|
||||||
#router.register("search", api.Search, base_name="search")
|
|
||||||
#urlpatterns = router.urls
|
|
||||||
|
|
||||||
urlpatterns = format_suffix_patterns(patterns('',
|
router = routers.Router(trailing_slash=False)
|
||||||
url(r'^projects/$', api.ProjectList.as_view(), name='project-list'),
|
router.register(r"projects", api.ProjectViewSet, base_name="projects")
|
||||||
url(r'^projects/(?P<pk>[0-9]+)/$', api.ProjectDetail.as_view(), name='project-detail'),
|
router.register(r"milestones", api.MilestoneViewSet, base_name="milestones")
|
||||||
url(r'^milestones/$', api.MilestoneList.as_view(), name='milestone-list'),
|
router.register(r"userstories", api.UserStoryViewSet, base_name="userstories")
|
||||||
url(r'^milestones/(?P<pk>[0-9]+)/$', api.MilestoneDetail.as_view(), name='milestone-detail'),
|
router.register(r"issue-attachments", api.IssuesAttachmentViewSet, base_name="issue-attachments")
|
||||||
url(r'^user-stories/$', api.UserStoryList.as_view(), name='user-story-list'),
|
router.register(r"task-attachments", api.TasksAttachmentViewSet, base_name="task-attachments")
|
||||||
url(r'^user-stories/(?P<pk>[0-9]+)/$', api.UserStoryDetail.as_view(), name='user-story-detail'),
|
router.register(r"tasks", api.TaskViewSet, base_name="tasks")
|
||||||
url(r'^user-stories/points/$', api.PointsList.as_view(), name='points-list'),
|
router.register(r"issues", api.IssueViewSet, base_name="issues")
|
||||||
url(r'^user-stories/points/(?P<pk>[0-9]+)/$', api.PointsDetail.as_view(), name='points-detail'),
|
router.register(r"severities", api.SeverityViewSet, base_name="severities")
|
||||||
url(r'^user-stories/statuses/$', api.UserStoryStatusList.as_view(), name='user-story-status-list'),
|
router.register(r"issue-statuses", api.IssueStatusViewSet, base_name="issue-statuses")
|
||||||
url(r'^user-stories/statuses/(?P<pk>[0-9]+)/$', api.UserStoryStatusDetail.as_view(), name='user-story-status-detail'),
|
router.register(r"task-statuses", api.TaskStatusViewSet, base_name="task-statuses")
|
||||||
url(r'^issues/$', api.IssueList.as_view(), name='issues-list'),
|
router.register(r"userstory-statuses", api.UserStoryStatusViewSet, base_name="userstory-statuses")
|
||||||
url(r'^issues/(?P<pk>[0-9]+)/$', api.IssueDetail.as_view(), name='issues-detail'),
|
router.register(r"priorities", api.PriorityViewSet, base_name="priorities")
|
||||||
url(r'^issues/attachments/$', api.IssuesAttachmentList.as_view(), name='issues-attachment-list'),
|
router.register(r"issue-types", api.IssueTypeViewSet, base_name="issue-types")
|
||||||
url(r'^issues/attachments/(?P<pk>[0-9]+)/$', api.IssuesAttachmentDetail.as_view(), name='issues-attachment-detail'),
|
router.register(r"points", api.PointsViewSet, base_name="points")
|
||||||
url(r'^issues/statuses/$', api.IssueStatusList.as_view(), name='issues-status-list'),
|
|
||||||
url(r'^issues/statuses/(?P<pk>[0-9]+)/$', api.IssueStatusDetail.as_view(), name='issues-status-detail'),
|
urlpatterns = router.urls
|
||||||
url(r'^issues/types/$', api.IssueTypeList.as_view(), name='issues-type-list'),
|
|
||||||
url(r'^issues/types/(?P<pk>[0-9]+)/$', api.IssueTypeDetail.as_view(), name='issues-type-detail'),
|
#urlpatterns = format_suffix_patterns(patterns('',
|
||||||
url(r'^tasks/$', api.TaskList.as_view(), name='tasks-list'),
|
# url(r'^projects/$', api.ProjectList.as_view(), name='project-list'),
|
||||||
url(r'^tasks/(?P<pk>[0-9]+)/$', api.TaskDetail.as_view(), name='tasks-detail'),
|
# url(r'^projects/(?P<pk>[0-9]+)/$', api.ProjectDetail.as_view(), name='project-detail'),
|
||||||
url(r'^tasks/attachments/$', api.TasksAttachmentList.as_view(), name='tasks-attachment-list'),
|
# url(r'^milestones/$', api.MilestoneList.as_view(), name='milestone-list'),
|
||||||
url(r'^tasks/attachments/(?P<pk>[0-9]+)/$', api.TasksAttachmentDetail.as_view(), name='tasks-attachment-detail'),
|
# url(r'^milestones/(?P<pk>[0-9]+)/$', api.MilestoneDetail.as_view(), name='milestone-detail'),
|
||||||
url(r'^severities/$', api.SeverityList.as_view(), name='severity-list'),
|
# url(r'^user-stories/$', api.UserStoryList.as_view(), name='user-story-list'),
|
||||||
url(r'^severities/(?P<pk>[0-9]+)/$', api.SeverityDetail.as_view(), name='severity-detail'),
|
# url(r'^user-stories/(?P<pk>[0-9]+)/$', api.UserStoryDetail.as_view(), name='user-story-detail'),
|
||||||
url(r'^tasks/statuses/$', api.TaskStatusList.as_view(), name='tasks-status-list'),
|
# url(r'^user-stories/points/$', api.PointsList.as_view(), name='points-list'),
|
||||||
url(r'^tasks/statuses/(?P<pk>[0-9]+)/$', api.TaskStatusDetail.as_view(), name='tasks-status-detail'),
|
# url(r'^user-stories/points/(?P<pk>[0-9]+)/$', api.PointsDetail.as_view(), name='points-detail'),
|
||||||
url(r'^priorities/$', api.PriorityList.as_view(), name='priority-list'),
|
# url(r'^user-stories/statuses/$', api.UserStoryStatusList.as_view(), name='user-story-status-list'),
|
||||||
url(r'^priorities/(?P<pk>[0-9]+)/$', api.PriorityDetail.as_view(), name='priority-detail'),
|
# url(r'^user-stories/statuses/(?P<pk>[0-9]+)/$', api.UserStoryStatusDetail.as_view(), name='user-story-status-detail'),
|
||||||
))
|
# url(r'^issues/$', api.IssueList.as_view(), name='issues-list'),
|
||||||
|
# url(r'^issues/(?P<pk>[0-9]+)/$', api.IssueDetail.as_view(), name='issues-detail'),
|
||||||
|
# url(r'^issues/attachments/$', api.IssuesAttachmentList.as_view(), name='issues-attachment-list'),
|
||||||
|
# url(r'^issues/attachments/(?P<pk>[0-9]+)/$', api.IssuesAttachmentDetail.as_view(), name='issues-attachment-detail'),
|
||||||
|
# url(r'^issues/statuses/$', api.IssueStatusList.as_view(), name='issues-status-list'),
|
||||||
|
# url(r'^issues/statuses/(?P<pk>[0-9]+)/$', api.IssueStatusDetail.as_view(), name='issues-status-detail'),
|
||||||
|
# url(r'^issues/types/$', api.IssueTypeList.as_view(), name='issues-type-list'),
|
||||||
|
# url(r'^issues/types/(?P<pk>[0-9]+)/$', api.IssueTypeDetail.as_view(), name='issues-type-detail'),
|
||||||
|
# url(r'^tasks/$', api.TaskList.as_view(), name='tasks-list'),
|
||||||
|
# url(r'^tasks/(?P<pk>[0-9]+)/$', api.TaskDetail.as_view(), name='tasks-detail'),
|
||||||
|
# url(r'^tasks/attachments/$', api.TasksAttachmentList.as_view(), name='tasks-attachment-list'),
|
||||||
|
# url(r'^tasks/attachments/(?P<pk>[0-9]+)/$', api.TasksAttachmentDetail.as_view(), name='tasks-attachment-detail'),
|
||||||
|
# url(r'^severities/$', api.SeverityList.as_view(), name='severity-list'),
|
||||||
|
# url(r'^severities/(?P<pk>[0-9]+)/$', api.SeverityDetail.as_view(), name='severity-detail'),
|
||||||
|
# url(r'^tasks/statuses/$', api.TaskStatusList.as_view(), name='tasks-status-list'),
|
||||||
|
# url(r'^tasks/statuses/(?P<pk>[0-9]+)/$', api.TaskStatusDetail.as_view(), name='tasks-status-detail'),
|
||||||
|
# url(r'^priorities/$', api.PriorityList.as_view(), name='priority-list'),
|
||||||
|
# url(r'^priorities/(?P<pk>[0-9]+)/$', api.PriorityDetail.as_view(), name='priority-detail'),
|
||||||
|
#))
|
||||||
|
|
|
@ -321,7 +321,7 @@ REST_FRAMEWORK = {
|
||||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||||
'greenmine.base.auth.SessionAuthentication',
|
'greenmine.base.auth.SessionAuthentication',
|
||||||
),
|
),
|
||||||
'FILTER_BACKEND': 'rest_framework.filters.DjangoFilterBackend',
|
'FILTER_BACKEND': 'greenmine.base.filters.SimpleFilterBackend',
|
||||||
}
|
}
|
||||||
|
|
||||||
from .appdefaults import *
|
from .appdefaults import *
|
||||||
|
|
Loading…
Reference in New Issue