Bug#199: Now work correctly the filtering of next/prev on retrieve actions
parent
5b99acd2a2
commit
d9ab184d0a
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue