summaryrefslogtreecommitdiff
path: root/archaeological_finds
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-05-16 16:39:55 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-05-16 16:39:55 +0200
commitc573609f76f5d0081cde0727f52a69a62d388e10 (patch)
treeec391d3cae5842a74159eb452cd52b404e1cf19e /archaeological_finds
parent0f48778cee5d7f47fac9163e6ce032a3f8b3821a (diff)
downloadIshtar-c573609f76f5d0081cde0727f52a69a62d388e10.tar.bz2
Ishtar-c573609f76f5d0081cde0727f52a69a62d388e10.zip
Autocomplete: filter by more relevant search term
Diffstat (limited to 'archaeological_finds')
-rw-r--r--archaeological_finds/tests.py39
-rw-r--r--archaeological_finds/views.py29
2 files changed, 57 insertions, 11 deletions
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index 3c9995632..d9b79be89 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -937,6 +937,45 @@ class FindSearchTest(FindInit, TestCase):
self._test_search(c, result)
+class FindAutocompleteTest(FindInit, TestCase):
+ fixtures = WAREHOUSE_FIXTURES
+ model = models.Find
+
+ def setUp(self):
+ self.create_finds(force=True)
+ self.create_finds(force=True)
+ self.create_finds(force=True)
+ self.create_finds(force=True)
+ self.username = 'myuser'
+ self.password = 'mypassword'
+ User.objects.create_superuser(self.username, 'myemail@test.com',
+ self.password)
+ self.client = Client()
+
+ def test_autocomplete(self):
+ find = self.finds[0]
+ find.label = "test 012"
+ find.save()
+ find2 = self.finds[1]
+ find2.label = "test 12"
+ find2.save()
+ find3 = self.finds[2]
+ find3.label = "test 1"
+ find3.save()
+ find4 = self.finds[3]
+ find4.label = "test 0120"
+ find4.save()
+ c = Client()
+ c.login(username=self.username, password=self.password)
+ response = c.get(reverse('autocomplete-find') + "?term=12")
+ self.assertEqual(response.status_code, 200)
+ res = json.loads(response.content)
+ self.assertEqual(len(res), 3)
+ self.assertEqual(res[0]['id'], find2.pk) # " 12" - startswith
+ self.assertEqual(res[1]['id'], find.pk) # 12 - endswith
+ self.assertEqual(res[2]['id'], find4.pk) # 12 - contains
+
+
class FindPermissionTest(FindInit, TestCase):
fixtures = FIND_FIXTURES
model = models.Find
diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py
index 72d02305c..9e1a22a2a 100644
--- a/archaeological_finds/views.py
+++ b/archaeological_finds/views.py
@@ -17,6 +17,7 @@
# See the file COPYING for details.
+from collections import OrderedDict
import json
from django.core.exceptions import PermissionDenied
@@ -42,7 +43,7 @@ from archaeological_finds import forms
from ishtar_common.views import get_autocomplete_generic, IshtarMixin, \
LoginRequiredMixin, QAItemEditForm, QAItemForm
from ishtar_common.views_item import display_item, get_item, show_item, \
- revert_item, get_autocomplete_item, get_autocomplete_query
+ revert_item, get_autocomplete_item, get_autocomplete_queries
from archaeological_operations.wizards import AdministrativeActDeletionWizard
from archaeological_finds import wizards
@@ -152,17 +153,23 @@ def autocomplete_findbasket(request, current_right=None):
if not request.GET.get('term'):
return HttpResponse(content_type='text/plain')
- query = get_autocomplete_query(request, ['label'])
limit = 20
- query = query & models.FindBasket.get_write_query_owns(
- request.user.ishtaruser)
- items = models.FindBasket.objects.filter(query).distinct().order_by(
- 'label')[:limit]
- data = json.dumps(
- [{'id': item.pk,
- 'value': u"{} - {}".format(item.label, item.user)[:60]}
- for item in items]
- )
+ result = OrderedDict()
+ for query in get_autocomplete_queries(request, ['label']):
+ query = query & models.FindBasket.get_write_query_owns(
+ request.user.ishtaruser)
+ objects = models.FindBasket.objects.filter(query).distinct().order_by(
+ 'label')[:limit]
+ for obj in objects:
+ if obj.id not in list(result.keys()):
+ result[obj.id] = u"{} - {}".format(obj.label, obj.user)[:60]
+ limit -= 1
+ if not limit:
+ break
+ if not limit:
+ break
+ data = json.dumps([{'id': obj[0], 'value': obj[1]}
+ for obj in list(result.items())])
return HttpResponse(data, content_type='text/plain')