From cf954b280043339aa09ef193dc23d181c624029d Mon Sep 17 00:00:00 2001 From: Alice Heaton <aliceh@aptivate.org> Date: Mon, 27 Jul 2015 15:16:27 +0100 Subject: [PATCH] Ensure that drop downs use the short name version and are sorted alphabetically. --- django/website/hid/tests/views_tests.py | 32 ++++++++++++++++++++++--- django/website/hid/views.py | 15 ++++++++---- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/django/website/hid/tests/views_tests.py b/django/website/hid/tests/views_tests.py index 145f6967..86c0b0d8 100644 --- a/django/website/hid/tests/views_tests.py +++ b/django/website/hid/tests/views_tests.py @@ -158,6 +158,32 @@ def test_get_category_options_with_no_taxonomy_returns_all(): assert (other_term.name, other_term.long_name) in options +@pytest.mark.django_db +def test_get_category_options_orders_by_lowercase_name(): + # TODO: Rewrite tests to use transport layer + ebola_questions = TaxonomyFactory(name="Ebola Questions") + test_term_values = [ + ('test a1', '1'), ('test b1', '2'), + ('test A2', '3'), ('test B2', '4') + ] + for test_value in test_term_values: + TermFactory( + name=test_value[0], + long_name=test_value[1], + taxonomy=ebola_questions + ) + + view = ViewItems() + options = view.get_category_options(ebola_questions.id) + # Make sure we are only comparing with out test values! + options = [o for o in options if o in test_term_values] + + # Expected is the list ordered by lowercase short name. + expected = sorted(test_term_values, key=lambda e: e[0].lower()) + + assert options == expected + + def test_views_item_get_request_parameters_renames_items_of_active_location(): query = QueryDict( 'action=something-bottom&item-top=top-value&item-bottom=bottom-value' @@ -186,12 +212,12 @@ def test_views_item_get_request_parameters_sets_default_location(): def test_views_item_get_request_parameters_sets_default_action_and_location(): query = QueryDict( - 'item-top=value&item-bottom=unchanged' + 'item-top=top-value&item-bottom=bottom-value' ) expected = { 'action': 'none', - 'item': 'value', - 'item-bottom': 'unchanged' + 'item': 'top-value', + 'item-bottom': 'bottom-value' } actual = ViewItems.get_request_parameters(query) assert actual.dict() == expected diff --git a/django/website/hid/views.py b/django/website/hid/views.py index 0b7da4fd..e30f7737 100644 --- a/django/website/hid/views.py +++ b/django/website/hid/views.py @@ -1,5 +1,7 @@ import re +from collections import OrderedDict + from django.contrib import messages from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect, QueryDict @@ -89,14 +91,19 @@ class ViewItems(SingleTableView): def get_category_options(self, categories_id=None): # TODO: Use data layer terms = self.get_matching_terms(categories_id) - return tuple((t.name, t.long_name) for t in terms) def get_matching_terms(self, categories_id): if categories_id is None: - return Term.objects.all() + return (Term.objects + .extra(select={'name_lower': 'lower(name)'}) + .order_by('name_lower') + .all()) - return Term.objects.filter(taxonomy__id=categories_id) + return (Term.objects + .extra(select={'name_lower': 'lower(name)'}) + .order_by('name_lower') + .filter(taxonomy__id=categories_id)) def get_table(self, **kwargs): # TODO: Filter on taxonomy @@ -138,7 +145,7 @@ class ViewItems(SingleTableView): """ return { 'label': label, - 'items': dict( + 'items': OrderedDict( [(prefix + short_name, short_name) for short_name, long_name in items] ) -- GitLab