Bug#199: Now work correctly the filtering of next/prev on retrieve actions

remotes/origin/enhancement/email-actions
Jesús Espino 2014-03-07 14:15:57 +01:00
parent 5b99acd2a2
commit d9ab184d0a
4 changed files with 15 additions and 5 deletions

View File

@ -42,6 +42,14 @@ class ListModelMixin(mixins.ListModelMixin):
return super().list(*args, **kwargs) return super().list(*args, **kwargs)
class NeighborsApiMixin:
def filter_queryset(self, queryset, force=False):
for backend in self.get_filter_backends():
if force or self.action != "retrieve" or backend not in self.retrieve_exclude_filters:
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
class DestroyModelMixin(mixins.DestroyModelMixin): class DestroyModelMixin(mixins.DestroyModelMixin):
""" """
Self version of DestroyModelMixin with Self version of DestroyModelMixin with

View File

@ -91,7 +91,7 @@ class NeighborsSerializerMixin:
def get_neighbors(self, obj): def get_neighbors(self, obj):
view, request = self.context.get("view", None), self.context.get("request", None) view, request = self.context.get("view", None), self.context.get("request", None)
if view and request: if view and request:
queryset = view.filter_queryset(view.get_queryset()) queryset = view.filter_queryset(view.get_queryset(), True)
previous, next = obj.get_neighbors(queryset) previous, next = obj.get_neighbors(queryset)
return {"previous": self.serialize_neighbor(previous), return {"previous": self.serialize_neighbor(previous),

View File

@ -13,7 +13,7 @@ from rest_framework import filters
from taiga.base import filters from taiga.base import filters
from taiga.base import exceptions as exc from taiga.base import exceptions as exc
from taiga.base.api import ModelCrudViewSet from taiga.base.api import ModelCrudViewSet, NeighborsApiMixin
from taiga.base.notifications.api import NotificationSenderMixin from taiga.base.notifications.api import NotificationSenderMixin
from taiga.projects.permissions import AttachmentPermission from taiga.projects.permissions import AttachmentPermission
from taiga.projects.serializers import AttachmentSerializer from taiga.projects.serializers import AttachmentSerializer
@ -85,13 +85,14 @@ class IssuesOrdering(filters.FilterBackend):
return queryset return queryset
class IssueViewSet(NotificationSenderMixin, ModelCrudViewSet): class IssueViewSet(NeighborsApiMixin, NotificationSenderMixin, ModelCrudViewSet):
model = models.Issue model = models.Issue
serializer_class = serializers.IssueNeighborsSerializer serializer_class = serializers.IssueNeighborsSerializer
list_serializer_class = serializers.IssueSerializer list_serializer_class = serializers.IssueSerializer
permission_classes = (IsAuthenticated, permissions.IssuePermission) permission_classes = (IsAuthenticated, permissions.IssuePermission)
filter_backends = (filters.IsProjectMemberFilterBackend, IssuesFilter, IssuesOrdering) filter_backends = (filters.IsProjectMemberFilterBackend, IssuesFilter, IssuesOrdering)
retrieve_exclude_filters = (IssuesFilter,)
filter_fields = ("project",) filter_fields = ("project",)
order_by_fields = ("severity", "status", "priority", "created_date", "modified_date", "owner", order_by_fields = ("severity", "status", "priority", "created_date", "modified_date", "owner",
"assigned_to", "subject") "assigned_to", "subject")

View File

@ -14,7 +14,7 @@ from rest_framework import status
from taiga.base import filters from taiga.base import filters
from taiga.base import exceptions as exc from taiga.base import exceptions as exc
from taiga.base.permissions import has_project_perm from taiga.base.permissions import has_project_perm
from taiga.base.api import ModelCrudViewSet from taiga.base.api import ModelCrudViewSet, NeighborsApiMixin
from taiga.base.notifications.api import NotificationSenderMixin from taiga.base.notifications.api import NotificationSenderMixin
from taiga.projects.permissions import AttachmentPermission from taiga.projects.permissions import AttachmentPermission
from taiga.projects.serializers import AttachmentSerializer from taiga.projects.serializers import AttachmentSerializer
@ -55,13 +55,14 @@ class UserStoryAttachmentViewSet(ModelCrudViewSet):
"add attachments to this user story")) "add attachments to this user story"))
class UserStoryViewSet(NotificationSenderMixin, ModelCrudViewSet): class UserStoryViewSet(NeighborsApiMixin, NotificationSenderMixin, ModelCrudViewSet):
model = models.UserStory model = models.UserStory
serializer_class = serializers.UserStoryNeighborsSerializer serializer_class = serializers.UserStoryNeighborsSerializer
list_serializer_class = serializers.UserStorySerializer list_serializer_class = serializers.UserStorySerializer
permission_classes = (IsAuthenticated, permissions.UserStoryPermission) permission_classes = (IsAuthenticated, permissions.UserStoryPermission)
filter_backends = (filters.IsProjectMemberFilterBackend, filters.TagsFilter) filter_backends = (filters.IsProjectMemberFilterBackend, filters.TagsFilter)
retrieve_exclude_filters = (filters.TagsFilter,)
filter_fields = ['project', 'milestone', 'milestone__isnull', 'status'] filter_fields = ['project', 'milestone', 'milestone__isnull', 'status']
create_notification_template = "create_userstory_notification" create_notification_template = "create_userstory_notification"