Skip to content
This repository has been archived by the owner on Jan 28, 2020. It is now read-only.

Commit

Permalink
Fixed bug with sorting by title being case sensitive
Browse files Browse the repository at this point in the history
  • Loading branch information
Giovanni Di Milia committed Sep 10, 2015
1 parent c0f8fa8 commit 3859d8d
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 8 deletions.
30 changes: 26 additions & 4 deletions rest/tests/test_search.py
Expand Up @@ -18,6 +18,7 @@
REPO_BASE,
as_json,
)
from search.sorting import LoreSortingFields
from taxonomy.models import Term, Vocabulary


Expand Down Expand Up @@ -177,6 +178,10 @@ def test_sortby(self):
resource1 = all_resources[0]
resource2 = all_resources[1]
resource3 = all_resources[2]
# remove all the learning resources we do not need to
# avoid interferences
for resource in all_resources[3:]:
resource.delete()

resource1.xa_avg_grade = 2.0
resource1.xa_nr_attempts = 4
Expand All @@ -202,24 +207,41 @@ def test_sortby(self):
self.assertEqual(default_results[1]['lid'], resource3.id)
self.assertEqual(default_results[2]['lid'], resource2.id)

nr_views_results = self.get_results(sortby="nr_views")['results']
nr_views_results = self.get_results(
sortby=LoreSortingFields.SORT_BY_NR_VIEWS[0])['results']
self.assertEqual(default_results, nr_views_results)

avg_grade_results = self.get_results(sortby="avg_grade")['results']
avg_grade_results = self.get_results(
sortby=LoreSortingFields.SORT_BY_AVG_GRADE[0])['results']
self.assertEqual(avg_grade_results[0]['lid'], resource2.id)
self.assertEqual(avg_grade_results[1]['lid'], resource1.id)
self.assertEqual(avg_grade_results[2]['lid'], resource3.id)

avg_grade_results = self.get_results(sortby="nr_attempts")['results']
avg_grade_results = self.get_results(
sortby=LoreSortingFields.SORT_BY_NR_ATTEMPTS[0])['results']
self.assertEqual(avg_grade_results[0]['lid'], resource1.id)
self.assertEqual(avg_grade_results[1]['lid'], resource3.id)
self.assertEqual(avg_grade_results[2]['lid'], resource2.id)

title_results = self.get_results(sortby="title")['results']
title_results = self.get_results(
sortby=LoreSortingFields.SORT_BY_TITLE[0])['results']
self.assertEqual(title_results[0]['lid'], resource3.id)
self.assertEqual(title_results[1]['lid'], resource2.id)
self.assertEqual(title_results[2]['lid'], resource1.id)

# special case for sorting by title
resource1.title = ' uuuu' # space at the beginning
resource1.save()
resource2.title = '' # empty title
resource2.save()
resource3.title = ' aaa ' # many spaces around
resource3.save()
title_results = self.get_results(
sortby=LoreSortingFields.SORT_BY_TITLE[0])['results']
self.assertEqual(title_results[0]['lid'], resource3.id)
self.assertEqual(title_results[1]['lid'], resource1.id)
self.assertEqual(title_results[2]['lid'], resource2.id)

def test_facets(self):
"""
Test run, course, resource_type and term facets.
Expand Down
15 changes: 12 additions & 3 deletions search/search_indexes.py
Expand Up @@ -85,9 +85,8 @@ class LearningResourceIndex(indexes.SearchIndex, indexes.Indexable):
avg_grade = indexes.FloatField(model_attr="xa_avg_grade")

lid = indexes.IntegerField(model_attr="id", indexed=False)
# title set in this way because of a known bug in haystack
# http://bit.ly/1ENeElY
title = indexes.CharField(model_attr="title", indexed=False, stored=True)
title = indexes.CharField(model_attr="title", indexed=False)
titlesort = indexes.CharField(indexed=False)
description = indexes.CharField(model_attr="description", indexed=False)
description_path = indexes.CharField(
model_attr="description_path",
Expand Down Expand Up @@ -137,6 +136,16 @@ def prepare_preview_url(self, obj): # pylint: disable=no-self-use
run=data["run"],
)

def prepare_titlesort(self, obj): # pylint: disable=no-self-use
"""Define what goes into the "titlesort" index."""
title = obj.title.strip()
# hack to handle empty titles
# to show up at the bottom of the sorted list
if title:
title = '0{0}'.format(title)
return title.lower()
return '1'

@staticmethod
def prepare_course(obj):
"""Define what goes into the "course" index."""
Expand Down
2 changes: 1 addition & 1 deletion search/sorting.py
Expand Up @@ -13,7 +13,7 @@ class LoreSortingFields(object):
SORT_BY_NR_VIEWS = ('nr_views', 'Number of Views (desc)', '-')
SORT_BY_NR_ATTEMPTS = ('nr_attempts', 'Number of Attempts (desc)', '-')
SORT_BY_AVG_GRADE = ('avg_grade', 'Average Grade (desc)', '-')
SORT_BY_TITLE = ('title', 'Title (asc)', '')
SORT_BY_TITLE = ('titlesort', 'Title (asc)', '')

DEFAULT_SORTING_FIELD = SORT_BY_NR_VIEWS[0]

Expand Down

0 comments on commit 3859d8d

Please sign in to comment.