From 3830d8a3461f3e5a29d59fcec4183f7ae425e4f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex=20Hermida?= Date: Tue, 20 Nov 2018 12:08:49 +0100 Subject: [PATCH] Add US id's filter --- taiga/base/filters.py | 23 +++++++++++++++++++++++ taiga/projects/userstories/api.py | 1 + tests/integration/test_userstories.py | 17 +++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/taiga/base/filters.py b/taiga/base/filters.py index 23cee13e..2f934830 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -423,6 +423,29 @@ class BaseRelatedFieldsFilter(FilterBackend): return super().filter_queryset(request, queryset, view) +class IdsFilter(FilterBackend): + filter_name = 'id__in' + + def __init__(self, filter_name=None): + if filter_name: + self.filter_name = filter_name + + def _get_id_queryparams(self, params): + ids = params.get(self.filter_name, None) + if ids: + return ids.split(",") + + return None + + def filter_queryset(self, request, queryset, view): + query_ids = self._get_id_queryparams(request.QUERY_PARAMS) + + if query_ids: + queryset = queryset.filter(id__in=query_ids) + + return super().filter_queryset(request, queryset, view) + + class OwnersFilter(BaseRelatedFieldsFilter): filter_name = 'owner' diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 2788d9e1..e88f2238 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -65,6 +65,7 @@ class UserStoryViewSet(AssignedUsersSignalMixin, OCCResourceMixin, permission_classes = (permissions.UserStoryPermission,) filter_backends = (base_filters.CanViewUsFilterBackend, filters.EpicFilter, + base_filters.IdsFilter, base_filters.UserStoriesRoleFilter, base_filters.OwnersFilter, base_filters.AssignedToFilter, diff --git a/tests/integration/test_userstories.py b/tests/integration/test_userstories.py index 78f44a65..da11c4a1 100644 --- a/tests/integration/test_userstories.py +++ b/tests/integration/test_userstories.py @@ -588,6 +588,23 @@ def test_get_total_points(client): assert us_mixed.get_total_points() == 1.0 +def test_api_filter_by_id(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create(owner=user) + f.MembershipFactory.create(project=project, user=user, is_admin=True) + us1 = f.UserStoryFactory.create(project=project, subject='Test 1') + us2 = f.UserStoryFactory.create(project=project, subject='Test 2') + us3 = f.UserStoryFactory.create(project=project, subject='Test 3') + + client.login(user) + url = reverse("userstories-list") + "?id__in={},{}".format(us1.id, us3.id) + + response = client.get(url) + + assert len(response.data) == 2 + assert response.data[1]["subject"] == us3.subject + + def test_api_filter_by_created_date(client): user = f.UserFactory(is_superuser=True) one_day_ago = datetime.now(pytz.utc) - timedelta(days=1)