diff --git a/taiga/base/api.py b/taiga/base/api.py index 55a62b62..87a84b20 100644 --- a/taiga/base/api.py +++ b/taiga/base/api.py @@ -42,6 +42,14 @@ class ListModelMixin(mixins.ListModelMixin): 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): """ Self version of DestroyModelMixin with diff --git a/taiga/base/serializers.py b/taiga/base/serializers.py index e3925f41..01215075 100644 --- a/taiga/base/serializers.py +++ b/taiga/base/serializers.py @@ -91,7 +91,7 @@ class NeighborsSerializerMixin: def get_neighbors(self, obj): view, request = self.context.get("view", None), self.context.get("request", None) 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) return {"previous": self.serialize_neighbor(previous), diff --git a/taiga/projects/issues/api.py b/taiga/projects/issues/api.py index c038f48c..34cba0d2 100644 --- a/taiga/projects/issues/api.py +++ b/taiga/projects/issues/api.py @@ -13,7 +13,7 @@ from rest_framework import filters from taiga.base import filters 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.projects.permissions import AttachmentPermission from taiga.projects.serializers import AttachmentSerializer @@ -85,13 +85,14 @@ class IssuesOrdering(filters.FilterBackend): return queryset -class IssueViewSet(NotificationSenderMixin, ModelCrudViewSet): +class IssueViewSet(NeighborsApiMixin, NotificationSenderMixin, ModelCrudViewSet): model = models.Issue serializer_class = serializers.IssueNeighborsSerializer list_serializer_class = serializers.IssueSerializer permission_classes = (IsAuthenticated, permissions.IssuePermission) filter_backends = (filters.IsProjectMemberFilterBackend, IssuesFilter, IssuesOrdering) + retrieve_exclude_filters = (IssuesFilter,) filter_fields = ("project",) order_by_fields = ("severity", "status", "priority", "created_date", "modified_date", "owner", "assigned_to", "subject") diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index b1c9da0e..b4a1a673 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -14,7 +14,7 @@ from rest_framework import status from taiga.base import filters from taiga.base import exceptions as exc 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.projects.permissions import AttachmentPermission from taiga.projects.serializers import AttachmentSerializer @@ -55,13 +55,14 @@ class UserStoryAttachmentViewSet(ModelCrudViewSet): "add attachments to this user story")) -class UserStoryViewSet(NotificationSenderMixin, ModelCrudViewSet): +class UserStoryViewSet(NeighborsApiMixin, NotificationSenderMixin, ModelCrudViewSet): model = models.UserStory serializer_class = serializers.UserStoryNeighborsSerializer list_serializer_class = serializers.UserStorySerializer permission_classes = (IsAuthenticated, permissions.UserStoryPermission) filter_backends = (filters.IsProjectMemberFilterBackend, filters.TagsFilter) + retrieve_exclude_filters = (filters.TagsFilter,) filter_fields = ['project', 'milestone', 'milestone__isnull', 'status'] create_notification_template = "create_userstory_notification"