diff --git a/internewshid/hid/filters.py b/internewshid/hid/filters.py index beaee22a69fef59dafc4a014ed9c1a52b55f8b03..9a0b57aa4621991d24c79e90a9719392ffd17b68 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 8847422167cb32a7b11f9cdabbc2382f26aa4603..a71a56c231cc3ac31fae194fbd9012cba57a171d 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 cd353bdea03fc95c316fa23bc5d66f67008b10c7..8b82c32f442aeb0a27ed05c7f204b2374a0630c6 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)