From aaf3308017ec38c97975ea0db5b85aa1bc5f0f4d Mon Sep 17 00:00:00 2001 From: Martin Burchell <martinb@aptivate.org> Date: Tue, 11 Dec 2018 15:09:17 +0000 Subject: [PATCH] Fix bug where items were not filtered by tag --- internewshid/hid/filters.py | 6 ++-- internewshid/hid/tests/views_tests.py | 47 +++++++++++++++++++++++++++ internewshid/rest_api/views.py | 8 ----- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/internewshid/hid/filters.py b/internewshid/hid/filters.py index beaee22a..9a0b57aa 100644 --- a/internewshid/hid/filters.py +++ b/internewshid/hid/filters.py @@ -11,9 +11,11 @@ class CategoryFilter(object): class TagsFilter(object): def apply(self, filters, query_dict, **kwargs): - tags = kwargs.get('tags', None) + tags = query_dict.get('tags', None) if tags is not None: - filters.update(tags=tags) + filters.setdefault('terms', []).append( + 'tags:{}'.format(tags) + ) class TimeRangeFilter(object): diff --git a/internewshid/hid/tests/views_tests.py b/internewshid/hid/tests/views_tests.py index 88474221..a71a56c2 100644 --- a/internewshid/hid/tests/views_tests.py +++ b/internewshid/hid/tests/views_tests.py @@ -446,6 +446,53 @@ def test_table_items_filtered_by_date_range(): assert too_new['id'] not in ids +@pytest.mark.django_db +def test_table_items_filtered_by_tags(): + tags = TaxonomyFactory(name="Tags") + not_tags = TaxonomyFactory(name="Not tags") + + female_item = transport.items.create({ + 'body': 'Message from female', + }) + + male_item = transport.items.create({ + 'body': 'Message from male', + }) + + another_item = transport.items.create({ + 'body': 'Another message', + }) + + tags = TaxonomyFactory(name='tags') + female_term = TermFactory(name='female', taxonomy=tags) + male_term = TermFactory(name='male', taxonomy=tags) + + non_tag_term = TermFactory(name='female', taxonomy=not_tags) + + transport.items.add_terms( + female_item['id'], female_term.taxonomy.slug, female_term.name) + transport.items.add_terms( + male_item['id'], male_term.taxonomy.slug, male_term.name) + transport.items.add_terms( + another_item['id'], non_tag_term.taxonomy.slug, non_tag_term.name) + + page = TabbedPageFactory() + tab_instance = TabInstanceFactory(page=page) + request = MagicMock(session={'THREADED_FILTERS': {}}, + GET={'tags': 'female'}) + tab = ViewAndEditTableTab() + context_data = tab.get_context_data( + tab_instance, request, + dynamic_filters=['tags'] + ) + + table = context_data['table'] + + ids = [t['id'] for t in table.data.data] + + assert ids == [female_item['id']] + + @pytest.mark.django_db def test_dynamic_filters_read_from_tab_instance(): page = TabbedPageFactory(name='main') diff --git a/internewshid/rest_api/views.py b/internewshid/rest_api/views.py index cd353bde..8b82c32f 100644 --- a/internewshid/rest_api/views.py +++ b/internewshid/rest_api/views.py @@ -72,14 +72,6 @@ class ItemViewSet(viewsets.ModelViewSet, BulkDestroyModelMixin): items = items.filter(terms__id=matches[0].id) - tags = self.request.query_params.get('tags', None) - if tags is not None: - exact_match_items = items.filter(terms__name__iexact=tags) - if exact_match_items.exists(): - items = exact_match_items - else: - items = items.filter(terms__name__icontains=tags) - location = self.request.query_params.get('location', None) if location is not None: items = items.filter(location__icontains=location) -- GitLab