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

Merge branch 'staging' into filter-age-from-to

parents 28f78a8f f9f6cfe4
No related branches found
No related tags found
1 merge request!101Change age filter to have ranges instead of a dropdown
Pipeline #3059 passed
......@@ -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):
......
......@@ -5,7 +5,7 @@
<select id="ennumerator-selector" name="ennumerator" class="form-control">
<option value="All Ennumerators" selected="selected">All Enumerators</option>
{% for ennumerator in ennumerator.items %}
<option value="{{ ennumerator }}">{{ ennumerator | title }}</option>
<option value="{{ ennumerator }}"{% if ennumerator == request.GET.ennumerator %} selected="selected"{% endif %}>{{ ennumerator | title }}</option>
{% endfor %}
</select>
</div>
......
......@@ -5,7 +5,7 @@
<select id="gender-selector" name="gender" class="form-control">
<option value="All Genders" selected="selected">All Genders</option>
{% for gender in gender.items %}
<option value="{{ gender }}">{{ gender | title }}</option>
<option value="{{ gender }}"{% if gender == request.GET.gender %} selected="selected"{% endif %}>{{ gender | title }}</option>
{% endfor %}
</select>
</div>
......
......@@ -5,7 +5,7 @@
<select id="location-selector" name="location" class="form-control">
<option value="All Locations" selected="selected">All Locations</option>
{% for location in locations.items %}
<option value="{{ location }}">{{ location | title }}</option>
<option value="{{ location }}"{% if location == request.GET.location %} selected="selected"{% endif %}>{{ location | title }}</option>
{% endfor %}
</select>
</div>
......
{% load i18n %}
<div class="filter-tags form-group input-group">
<label class="control-label" for="tags-selector">{% trans "Tags" %}</label>
<input type="text" placeholder="All Tags" name="tags" class="form-control">
<input type="text" placeholder="All Tags" name="tags" class="form-control" value="{{ request.GET.tags }}">
</div>
......@@ -479,7 +479,6 @@ def test_table_items_filtered_by_age_range():
tab_instance, request, categories=[],
dynamic_filters=['age_range']
)
table = context_data['table']
ids = [t['id'] for t in table.data.data]
......@@ -491,6 +490,53 @@ def test_table_items_filtered_by_age_range():
assert too_young['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')
......
......@@ -154,6 +154,26 @@ def test_filter_by_location():
assert payload[0]['location'] == 'somewhere'
@pytest.mark.django_db
def test_filter_by_enumerator():
create_item(
body='item1',
ennumerator='Yasmin')
create_item(
body='item2',
ennumerator='Collected by ....Mohammed yousuf@ Mohammed Ullah'
)
payload = get(
data={
'ennumerator': 'Collected by ....Mohammed yousuf@ Mohammed Ullah',
}
).data
assert len(payload) == 1
assert payload[0]['body'] == 'item2'
@pytest.mark.django_db
def test_filter_by_multiple_terms():
# TODO: Refactor to use the REST API when we can add
......@@ -191,6 +211,22 @@ def test_filter_by_term_works_when_term_name_includes_colon():
assert payload[0]['body'] == item['body']
@pytest.mark.django_db
def test_empty_term_filter_ignored():
taxonomy = create_taxonomy(name='taxonomy').data
term = add_term(taxonomy=taxonomy['slug'], name='my term').data
item1 = create_item(body='item 1').data
item2 = create_item(body='item 2').data
categorize_item(item1, term)
term_filter = '{}:'.format(taxonomy['slug'])
payload = get(data={'terms': [term_filter]}).data
assert len(payload) == 2
assert payload[0]['body'] == item1['body']
assert payload[1]['body'] == item2['body']
@pytest.mark.django_db
def test_item_listed_with_associated_terms():
# TODO: Refactor to use the REST API when we can add
......
......@@ -63,22 +63,15 @@ class ItemViewSet(viewsets.ModelViewSet, BulkDestroyModelMixin):
terms = self.request.query_params.getlist('terms', [])
for taxonomy_and_term in terms:
(taxonomy, term) = taxonomy_and_term.split(':', 1)
matches = Term.objects.filter(
name=term, taxonomy__slug=taxonomy
)
if len(matches) == 0:
# If the term doesn't exist, there can be no matches
return Item.objects.none()
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)
if term:
matches = Term.objects.filter(
name=term, taxonomy__slug=taxonomy
)
if len(matches) == 0:
# If the term doesn't exist, there can be no matches
return Item.objects.none()
items = items.filter(terms__id=matches[0].id)
location = self.request.query_params.get('location', None)
if location is not None:
......
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