diff --git a/taiga/base/filters.py b/taiga/base/filters.py index 333b8125..208be999 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -364,6 +364,26 @@ class TagsFilter(FilterBackend): return super().filter_queryset(request, queryset, view) +class StatusFilter(FilterBackend): + def __init__(self, filter_name='status'): + self.filter_name = filter_name + + def _get_status_queryparams(self, params): + status = params.get(self.filter_name, None) + if status is not None: + status = set([x.strip() for x in status.split(",")]) + return list(status) + + return None + + def filter_queryset(self, request, queryset, view): + query_status = self._get_status_queryparams(request.QUERY_PARAMS) + if query_status: + queryset = queryset.filter(status__in=query_status) + + return super().filter_queryset(request, queryset, view) + + class QFilter(FilterBackend): def filter_queryset(self, request, queryset, view): q = request.QUERY_PARAMS.get('q', None) diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 4b419041..b3e6ed05 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -50,10 +50,11 @@ class UserStoryViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMi list_serializer_class = serializers.UserStorySerializer permission_classes = (permissions.UserStoryPermission,) - filter_backends = (filters.CanViewUsFilterBackend, filters.TagsFilter, + filter_backends = (filters.StatusFilter, filters.CanViewUsFilterBackend, filters.TagsFilter, filters.QFilter, filters.OrderByFilterMixin) - retrieve_exclude_filters = (filters.TagsFilter,) - filter_fields = ["project", "milestone", "milestone__isnull", "status", + + retrieve_exclude_filters = (filters.StatusFilter, filters.TagsFilter,) + filter_fields = ["project", "milestone", "milestone__isnull", "is_archived", "status__is_archived", "assigned_to", "status__is_closed", "watchers", "is_closed"] order_by_fields = ["backlog_order", "sprint_order", "kanban_order"] diff --git a/tests/integration/test_userstories.py b/tests/integration/test_userstories.py index 8f26e8c7..9819d413 100644 --- a/tests/integration/test_userstories.py +++ b/tests/integration/test_userstories.py @@ -214,6 +214,25 @@ def test_archived_filter(client): assert len(json.loads(response.content)) == 1 +def test_filter_by_multiple_status(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create(owner=user) + f.MembershipFactory.create(project=project, user=user, is_owner=True) + f.UserStoryFactory.create(project=project) + us1 = f.UserStoryFactory.create(project=project) + us2 = f.UserStoryFactory.create(project=project) + + client.login(user) + + url = reverse("userstories-list") + url = "{}?status={},{}".format(reverse("userstories-list"), us1.status.id, us2.status.id) + + + data = {} + response = client.get(url, data) + assert len(json.loads(response.content)) == 2 + + def test_get_total_points(client): project = f.ProjectFactory.create()