Skip to content
Snippets Groups Projects
Commit 54f5c1bc authored by Martin Burchell's avatar Martin Burchell
Browse files

Add filter for feedback types

parent 131d7256
No related branches found
No related tags found
1 merge request!111Add feedback type filter
......@@ -11,6 +11,7 @@ class HidAppConfig(AppConfig):
AgeRangeFilter,
CategoryFilter,
EnumeratorFilter,
FeedbackTypeFilter,
GenderFilter,
LocationFilter,
SourceFilter,
......@@ -31,6 +32,7 @@ class HidAppConfig(AppConfig):
register_filter('enumerator', EnumeratorFilter())
register_filter('source', SourceFilter())
register_filter('tags', TagsFilter())
register_filter('feedback_type', FeedbackTypeFilter())
register_tab('view-and-edit-table', ViewAndEditTableTab())
......
......@@ -68,3 +68,13 @@ class SourceFilter(object):
source = query_dict.get('source', None)
if source is not None:
filters.update(source=source)
class FeedbackTypeFilter(object):
def apply(self, filters, query_dict, **kwargs):
feedback_type = query_dict.get('feedback_type', None)
if feedback_type:
filters.setdefault('terms', []).append(
'item-types:{}'.format(feedback_type)
)
......@@ -70,8 +70,8 @@
},
{
"fields": {
"long_name": "Rumor",
"name": "rumor",
"long_name": "Rumour",
"name": "rumour",
"taxonomy": 2
},
"model": "taxonomies.term",
......@@ -311,7 +311,7 @@
"name": "feedback",
"page": 1,
"position": 2,
"settings": "{\"label\":\"Feedback\",\"columns\":[\"select_item\",\"timestamp\",\"body\",\"translation\",\"category\",\"tags\",\"feedback_type\",\"gender\",\"age\",\"location\",\"enumerator\",\"source\"],\"filters\":{\"terms\":[]},\"dynamic_filters\":[\"time_range\",\"category\",\"tags\",\"gender\",\"age_range\",\"location\",\"enumerator\",\"source\"],\"categories\":[\"bangladesh-refugee-crisis-sectors\"]}",
"settings": "{\"label\":\"Feedback\",\"columns\":[\"select_item\",\"timestamp\",\"body\",\"translation\",\"category\",\"tags\",\"feedback_type\",\"gender\",\"age\",\"location\",\"enumerator\",\"source\"],\"filters\":{\"terms\":[]},\"dynamic_filters\":[\"time_range\",\"category\",\"tags\",\"gender\",\"feedback_type\",\"age_range\",\"location\",\"enumerator\",\"source\"],\"categories\":[\"bangladesh-refugee-crisis-sectors\"]}",
"tab_type": "view-and-edit-table"
},
"model": "tabbed_page.tabinstance",
......
......@@ -202,6 +202,15 @@ class ViewAndEditTableTab(object):
sources.sort()
return {'items': sources}
def _get_feedback_type_options(self):
terms = transport_terms.list(taxonomy='item-types')
sorted_terms = sorted(terms, key=lambda k: k['long_name'])
feedback_types = [(t['name'], t['long_name'],) for t in sorted_terms]
return feedback_types
def _build_actions_dropdown(self, question_types):
items = [
(NONE_COMMAND, '---------'),
......@@ -238,6 +247,7 @@ class ViewAndEditTableTab(object):
gender_options = self._get_gender_options(items, **kwargs)
enumerator_options = self._get_enumerator_options(items, **kwargs)
source_options = self._get_source_options(items, **kwargs)
feedback_type_options = self._get_feedback_type_options()
table = ItemTable(
items,
......@@ -264,6 +274,7 @@ class ViewAndEditTableTab(object):
'source': kwargs.get('source'),
'actions': actions,
'category_options': category_options,
'feedback_type_options': feedback_type_options,
'locations': location_options,
'gender': gender_options,
'enumerator': enumerator_options,
......
{% load i18n %}
<div class="filter-feedback-type form-group input-group">
<label class="control-label" for="feedback-type-selector">{% trans "Feedback type" %}</label>
<select id="feedback-type-selector" name="feedback_type" class="form-control">
<option value="" selected="selected">All Feedback Types</option>
{% for option in feedback_type_options %}
<option value="{{ option.0 }}"{% if option.0 == request.GET.feedback_type %} selected="selected"{% endif %}>{{ option.1 }}</option>
{% endfor %}
</select>
</div>
......@@ -537,6 +537,56 @@ def test_table_items_filtered_by_tags():
assert ids == [female_item['id']]
@pytest.mark.django_db
def test_table_items_filtered_by_feedback_type():
rumour_1 = transport.items.create({
'body': "Rumour 1",
})
rumour_2 = transport.items.create({
'body': "Rumour 2",
})
concern = transport.items.create({
'body': "Concern",
})
uncategorised = transport.items.create({
'body': "Message in no category",
})
taxonomy = TaxonomyFactory(name='Item Types', slug='item-types')
rumour_term = TermFactory(name='rumour', taxonomy=taxonomy)
transport.items.add_terms(
rumour_1['id'], rumour_term.taxonomy.slug, rumour_term.name)
transport.items.add_terms(
rumour_2['id'], rumour_term.taxonomy.slug, rumour_term.name)
concern_term = TermFactory(name='concern', taxonomy=taxonomy)
transport.items.add_terms(
concern['id'], concern_term.taxonomy.slug, concern_term.name)
page = TabbedPageFactory()
tab_instance = TabInstanceFactory(page=page)
request = MagicMock(session={'THREADED_FILTERS': {}},
GET={'feedback_type': 'rumour'})
tab = ViewAndEditTableTab()
context_data = tab.get_context_data(
tab_instance, request, categories=[],
dynamic_filters=['feedback_type']
)
table = context_data['table']
ids = [t['id'] for t in table.data.data]
assert rumour_1['id'] in ids
assert rumour_2['id'] in ids
assert concern['id'] not in ids
assert uncategorised['id'] not in ids
@pytest.mark.django_db
def test_dynamic_filters_read_from_tab_instance():
page = TabbedPageFactory(name='main')
......@@ -574,3 +624,29 @@ def test_category_options_in_context_data(item_type_taxonomy):
expected_options = [(t.name, t.name) for t in terms]
assert context_data['category_options'] == tuple(expected_options)
@pytest.mark.django_db
def test_feedback_type_options_in_context_data():
taxonomy = TaxonomyFactory(name='Item Types', slug='item-types')
TermFactory(name='rumor', long_name='Rumor', taxonomy=taxonomy)
TermFactory(name='concern', long_name='Concern', taxonomy=taxonomy)
TermFactory(name='question', long_name='Question', taxonomy=taxonomy)
page = TabbedPageFactory(name='main')
tab_instance = TabInstanceFactory(page=page)
request = MagicMock(session={'THREADED_FILTERS': {}}, GET={})
tab = ViewAndEditTableTab()
context_data = tab.get_context_data(tab_instance,
request,
categories=[])
expected_options = [
('concern', 'Concern', ),
('question', 'Question', ),
('rumor', 'Rumor', ),
]
assert context_data['feedback_type_options'] == expected_options
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment