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