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