diff --git a/greenmine/base/filters.py b/greenmine/base/filters.py new file mode 100644 index 00000000..44171c43 --- /dev/null +++ b/greenmine/base/filters.py @@ -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 diff --git a/greenmine/base/routers.py b/greenmine/base/routers.py index c04244df..0352feee 100644 --- a/greenmine/base/routers.py +++ b/greenmine/base/routers.py @@ -3,10 +3,18 @@ from rest_framework import routers # 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}'}, name='{basename}-{methodnamehyphen}', initkwargs={}) + 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"] diff --git a/greenmine/scrum/api.py b/greenmine/scrum/api.py index a9ce3877..b757ed02 100644 --- a/greenmine/scrum/api.py +++ b/greenmine/scrum/api.py @@ -2,8 +2,7 @@ from django.db.models import Q -import django_filters -from rest_framework import generics +from rest_framework import mixins, viewsets from rest_framework.permissions import IsAuthenticated from greenmine.base.models import * @@ -13,366 +12,306 @@ from greenmine.scrum.serializers import * from greenmine.scrum.models import * from greenmine.scrum.permissions import * +# Generic viewset subclasses for this module -class UserStoryFilter(django_filters.FilterSet): - no_milestone = django_filters.NumberFilter(name="milestone", lookup_type='isnull') - - class Meta: - model = UserStory - fields = ['project', 'milestone', 'no_milestone'] +class ModelCrudViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, + mixins.RetrieveModelMixin, mixins.UpdateModelMixin, + mixins.DestroyModelMixin, viewsets.GenericViewSet): + pass -class SimpleFilterMixin(object): - filter_fields = [] - filter_special_fields = [] - - _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 ModelListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, + viewsets.GenericViewSet): + pass -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): - qs = self.model.objects.filter( - Q(owner=self.request.user) | Q(members=self.request.user) - ) - return qs.distinct() +# ViewSets definition - def pre_save(self, obj): - obj.owner = self.request.user - - -class ProjectDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView): - model = Project +class ProjectViewSet(NotificationSenderMixin, ModelCrudViewSet): + queryset = Project.objects.all() serializer_class = ProjectSerializer permission_classes = (IsAuthenticated, ProjectDetailPermission,) + create_notification_template = "create_project_notification" update_notification_template = "update_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): - 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() def pre_save(self, obj): + super(ProjectViewSet, self).pre_save(obj) obj.owner = self.request.user -class MilestoneDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView): - model = Milestone + +class MilestoneViewSet(NotificationSenderMixin, ModelCrudViewSet): + queryset = Milestone.objects.all() serializer_class = MilestoneSerializer permission_classes = (IsAuthenticated, MilestoneDetailPermission,) create_notification_template = "create_milestone_notification" update_notification_template = "update_milestone_notification" destroy_notification_template = "destroy_milestone_notification" - -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" + filter_fields = ('project',) def get_queryset(self): - qs = self.model.objects.filter(project__members=self.request.user) - return qs.distinct() + qs = super(MilestoneViewSet, self).get_queryset() + return qs.filter(project__members=self.request.user).distinct() def pre_save(self, obj): + super(MilestoneViewSet, self).pre_save(obj) obj.owner = self.request.user -class UserStoryDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView): - model = UserStory +class UserStoryViewSet(NotificationSenderMixin, ModelCrudViewSet): + queryset = UserStory.objects.all() serializer_class = UserStorySerializer permission_classes = (IsAuthenticated, UserStoryDetailPermission,) + create_notification_template = "create_user_story_notification" update_notification_template = "update_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): with reversion.create_revision(): if "comment" in self.request.DATA: # Update the comment in the last version 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 serializer_class = AttachmentSerializer - permission_classes = (IsAuthenticated,) - filter_class = AttachmentFilter + permission_classes = (IsAuthenticated, AttachmentDetailPermission,) + + filter_fields = ["project", "object_id"] def get_queryset(self): ct = ContentType.objects.get_for_model(Issue) - qs = super(IssuesAttachmentList, self).get_queryset()\ - .filter(project__members=self.request.user)\ - .filter(content_type=ct) + qs = super(IssuesAttachmentViewSet, self).get_queryset() + + qs = qs.filter(project__members=self.request.user) + qs = qs.filter(content_type=ct) return qs.distinct() def pre_save(self, obj): + super(IssuesAttachmentViewSet, self).pre_save(obj) obj.content_type = ContentType.objects.get_for_model(Issue) obj.owner = self.request.user -class IssuesAttachmentDetail(generics.RetrieveUpdateDestroyAPIView): +class TasksAttachmentViewSet(ModelCrudViewSet): model = Attachment serializer_class = AttachmentSerializer permission_classes = (IsAuthenticated, AttachmentDetailPermission,) - - -class TasksAttachmentList(generics.ListCreateAPIView): - model = Attachment - serializer_class = AttachmentSerializer - permission_classes = (IsAuthenticated,) - filter_class = AttachmentFilter + filter_fields = ["project", "object_id"] def get_queryset(self): ct = ContentType.objects.get_for_model(Task) - qs = super(TasksAttachmentList, self).get_queryset()\ - .filter(project__members=self.request.user)\ - .filter(content_type=ct) + qs = super(TasksAttachmentViewSet, self).get_queryset() + + qs = qs.filter(project__members=self.request.user) + qs = qs.filter(content_type=ct) return qs.distinct() def pre_save(self, obj): + super(TasksAttachmentViewSet, self).pre_save(obj) obj.content_type = ContentType.objects.get_for_model(Task) obj.owner = self.request.user -class TasksAttachmentDetail(generics.RetrieveUpdateDestroyAPIView): - model = Attachment - serializer_class = AttachmentSerializer - permission_classes = (IsAuthenticated, AttachmentDetailPermission,) +class TaskViewSet(NotificationSenderMixin, ModelCrudViewSet): + queryset = Task.objects.all() - -class TaskList(NotificationSenderMixin, generics.ListCreateAPIView): - model = Task serializer_class = TaskSerializer - filter_fields = ('user_story', 'milestone', 'project') - permission_classes = (IsAuthenticated,) + permission_classes = (IsAuthenticated, TaskDetailPermission,) + create_notification_template = "create_task_notification" update_notification_template = "update_task_notification" destroy_notification_template = "destroy_task_notification" + filter_fields = ['user_story', 'milestone', 'project'] 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() def pre_save(self, obj): + super(TaskViewSet, self).pre_save(obj) obj.owner = self.request.user 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): with reversion.create_revision(): if "comment" in self.request.DATA: # Update the comment in the last version 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): - obj.owner = self.request.user - - def get_queryset(self): - qs = self.model.objects.filter(project__members=self.request.user) - return qs.distinct() - - -class IssueDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView): - model = Issue +class IssueViewSet(NotificationSenderMixin, ModelCrudViewSet): + queryset = Issue.objects.all() serializer_class = IssueSerializer permission_classes = (IsAuthenticated, IssueDetailPermission,) + create_notification_template = "create_issue_notification" update_notification_template = "update_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): with reversion.create_revision(): if "comment" in self.request.DATA: # Update the comment in the last version reversion.set_comment(self.request.DATA['comment']) - super(IssueDetail, self).post_save(obj, created) - - -class SeverityList(generics.ListCreateAPIView): - model = Severity - serializer_class = SeveritySerializer - filter_fields = ('project',) - permission_classes = (IsAuthenticated,) + super(IssueViewSet, self).post_save(obj, created) 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() -class SeverityDetail(generics.RetrieveUpdateDestroyAPIView): - model = Severity +class SeverityViewSet(ModelListViewSet): + queryset = Severity.objects.all() 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): - model = IssueStatus +#class SeverityDetail(generics.RetrieveUpdateDestroyAPIView): +# model = Severity +# serializer_class = SeveritySerializer +# permission_classes = (IsAuthenticated, SeverityDetailPermission,) + +class IssueStatusViewSet(ModelListViewSet): + queryset = IssueStatus.objects.all() + serializer_class = IssueStatusSerializer filter_fields = ('project',) permission_classes = (IsAuthenticated,) 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() -class IssueStatusDetail(generics.RetrieveUpdateDestroyAPIView): - model = IssueStatus - serializer_class = IssueStatusSerializer - permission_classes = (IsAuthenticated, IssueStatusDetailPermission,) - - -class TaskStatusList(SimpleFilterMixin, generics.ListCreateAPIView): +class TaskStatusViewSet(ModelListViewSet): model = TaskStatus serializer_class = TaskStatusSerializer - filter_fields = ('project',) permission_classes = (IsAuthenticated,) + filter_fields = ('project',) 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() -class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView): - model = TaskStatus - serializer_class = TaskStatusSerializer - permission_classes = (IsAuthenticated, TaskStatusDetailPermission,) +#class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView): +# model = TaskStatus +# serializer_class = TaskStatusSerializer +# permission_classes = (IsAuthenticated, TaskStatusDetailPermission,) -class UserStoryStatusList(generics.ListCreateAPIView): +class UserStoryStatusViewSet(ModelListViewSet): model = UserStoryStatus serializer_class = UserStoryStatusSerializer - filter_fields = ('project',) permission_classes = (IsAuthenticated,) + filter_fields = ('project',) 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() -class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView): - model = UserStoryStatus - serializer_class = UserStoryStatusSerializer - permission_classes = (IsAuthenticated, UserStoryStatusDetailPermission,) +#class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView): +# model = UserStoryStatus +# serializer_class = UserStoryStatusSerializer +# permission_classes = (IsAuthenticated, UserStoryStatusDetailPermission,) -class PriorityList(generics.ListCreateAPIView): +class PriorityViewSet(ModelListViewSet): model = Priority serializer_class = PrioritySerializer - filter_fields = ('project',) permission_classes = (IsAuthenticated,) + filter_fields = ('project',) 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() -class PriorityDetail(generics.RetrieveUpdateDestroyAPIView): - model = Priority - serializer_class = PrioritySerializer - permission_classes = (IsAuthenticated, PriorityDetailPermission,) +#class PriorityDetail(generics.RetrieveUpdateDestroyAPIView): +# model = Priority +# serializer_class = PrioritySerializer +# permission_classes = (IsAuthenticated, PriorityDetailPermission,) -class IssueTypeList(generics.ListCreateAPIView): +class IssueTypeViewSet(ModelListViewSet): model = IssueType serializer_class = IssueTypeSerializer - filter_fields = ('project',) permission_classes = (IsAuthenticated,) + filter_fields = ('project',) 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() -class IssueTypeDetail(generics.RetrieveUpdateDestroyAPIView): - model = IssueType - serializer_class = IssueTypeSerializer - permission_classes = (IsAuthenticated, IssueTypeDetailPermission,) - - -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,) +#class PointsDetail(generics.RetrieveUpdateDestroyAPIView): +# model = Points +# serializer_class = PointsSerializer +# permission_classes = (IsAuthenticated, PointsDetailPermission,) diff --git a/greenmine/scrum/urls.py b/greenmine/scrum/urls.py index b7e5bd2f..3b897f65 100644 --- a/greenmine/scrum/urls.py +++ b/greenmine/scrum/urls.py @@ -6,39 +6,52 @@ from rest_framework.urlpatterns import format_suffix_patterns from greenmine.scrum import api 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('', - url(r'^projects/$', api.ProjectList.as_view(), name='project-list'), - url(r'^projects/(?P[0-9]+)/$', api.ProjectDetail.as_view(), name='project-detail'), - url(r'^milestones/$', api.MilestoneList.as_view(), name='milestone-list'), - url(r'^milestones/(?P[0-9]+)/$', api.MilestoneDetail.as_view(), name='milestone-detail'), - url(r'^user-stories/$', api.UserStoryList.as_view(), name='user-story-list'), - url(r'^user-stories/(?P[0-9]+)/$', api.UserStoryDetail.as_view(), name='user-story-detail'), - url(r'^user-stories/points/$', api.PointsList.as_view(), name='points-list'), - url(r'^user-stories/points/(?P[0-9]+)/$', api.PointsDetail.as_view(), name='points-detail'), - url(r'^user-stories/statuses/$', api.UserStoryStatusList.as_view(), name='user-story-status-list'), - url(r'^user-stories/statuses/(?P[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[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[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[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[0-9]+)/$', api.IssueTypeDetail.as_view(), name='issues-type-detail'), - url(r'^tasks/$', api.TaskList.as_view(), name='tasks-list'), - url(r'^tasks/(?P[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[0-9]+)/$', api.TasksAttachmentDetail.as_view(), name='tasks-attachment-detail'), - url(r'^severities/$', api.SeverityList.as_view(), name='severity-list'), - url(r'^severities/(?P[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[0-9]+)/$', api.TaskStatusDetail.as_view(), name='tasks-status-detail'), - url(r'^priorities/$', api.PriorityList.as_view(), name='priority-list'), - url(r'^priorities/(?P[0-9]+)/$', api.PriorityDetail.as_view(), name='priority-detail'), -)) +router = routers.Router(trailing_slash=False) +router.register(r"projects", api.ProjectViewSet, base_name="projects") +router.register(r"milestones", api.MilestoneViewSet, base_name="milestones") +router.register(r"userstories", api.UserStoryViewSet, base_name="userstories") +router.register(r"issue-attachments", api.IssuesAttachmentViewSet, base_name="issue-attachments") +router.register(r"task-attachments", api.TasksAttachmentViewSet, base_name="task-attachments") +router.register(r"tasks", api.TaskViewSet, base_name="tasks") +router.register(r"issues", api.IssueViewSet, base_name="issues") +router.register(r"severities", api.SeverityViewSet, base_name="severities") +router.register(r"issue-statuses", api.IssueStatusViewSet, base_name="issue-statuses") +router.register(r"task-statuses", api.TaskStatusViewSet, base_name="task-statuses") +router.register(r"userstory-statuses", api.UserStoryStatusViewSet, base_name="userstory-statuses") +router.register(r"priorities", api.PriorityViewSet, base_name="priorities") +router.register(r"issue-types", api.IssueTypeViewSet, base_name="issue-types") +router.register(r"points", api.PointsViewSet, base_name="points") + +urlpatterns = router.urls + +#urlpatterns = format_suffix_patterns(patterns('', +# url(r'^projects/$', api.ProjectList.as_view(), name='project-list'), +# url(r'^projects/(?P[0-9]+)/$', api.ProjectDetail.as_view(), name='project-detail'), +# url(r'^milestones/$', api.MilestoneList.as_view(), name='milestone-list'), +# url(r'^milestones/(?P[0-9]+)/$', api.MilestoneDetail.as_view(), name='milestone-detail'), +# url(r'^user-stories/$', api.UserStoryList.as_view(), name='user-story-list'), +# url(r'^user-stories/(?P[0-9]+)/$', api.UserStoryDetail.as_view(), name='user-story-detail'), +# url(r'^user-stories/points/$', api.PointsList.as_view(), name='points-list'), +# url(r'^user-stories/points/(?P[0-9]+)/$', api.PointsDetail.as_view(), name='points-detail'), +# url(r'^user-stories/statuses/$', api.UserStoryStatusList.as_view(), name='user-story-status-list'), +# url(r'^user-stories/statuses/(?P[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[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[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[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[0-9]+)/$', api.IssueTypeDetail.as_view(), name='issues-type-detail'), +# url(r'^tasks/$', api.TaskList.as_view(), name='tasks-list'), +# url(r'^tasks/(?P[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[0-9]+)/$', api.TasksAttachmentDetail.as_view(), name='tasks-attachment-detail'), +# url(r'^severities/$', api.SeverityList.as_view(), name='severity-list'), +# url(r'^severities/(?P[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[0-9]+)/$', api.TaskStatusDetail.as_view(), name='tasks-status-detail'), +# url(r'^priorities/$', api.PriorityList.as_view(), name='priority-list'), +# url(r'^priorities/(?P[0-9]+)/$', api.PriorityDetail.as_view(), name='priority-detail'), +#)) diff --git a/greenmine/settings/common.py b/greenmine/settings/common.py index b67c3fb4..5091edc0 100644 --- a/greenmine/settings/common.py +++ b/greenmine/settings/common.py @@ -321,7 +321,7 @@ REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'greenmine.base.auth.SessionAuthentication', ), - 'FILTER_BACKEND': 'rest_framework.filters.DjangoFilterBackend', + 'FILTER_BACKEND': 'greenmine.base.filters.SimpleFilterBackend', } from .appdefaults import *