Merged in autocomplete (pull request #37)

Autocomplete by multiple names at once
This commit is contained in:
Tom Price
2015-05-21 14:50:30 +01:00

View File

@@ -9,6 +9,7 @@ from django.core import serializers
import simplejson import simplejson
from django.contrib import messages from django.contrib import messages
import datetime import datetime
import operator
from RIGS import models, forms from RIGS import models, forms
@@ -253,27 +254,37 @@ class SecureAPIRequest(generic.View):
# Supply data for autocomplete ajax request in json form # Supply data for autocomplete ajax request in json form
term = request.GET.get('term', None) term = request.GET.get('term', None)
if term: if term:
if fields is None: if fields is None: # Default to just name
fields = ['name'] fields = ['name']
all_objects = self.models[model].objects
# Build a list of Q objects for use later
queries = []
for part in term.split(" "):
qs = []
for field in fields:
q = Q(**{field + "__icontains": part})
qs.append(q)
queries.append(reduce(operator.or_, qs))
# Build the data response list
results = [] results = []
for field in fields: query = reduce(operator.and_, queries)
filter = field + "__icontains" objects = self.models[model].objects.filter(query)
objects = all_objects.filter(**{filter: term}) for o in objects:
for o in objects: data = {
data = { 'pk': o.pk,
'pk': o.pk, 'value': o.pk,
'value': o.pk, 'label': o.name,
'label': o.name, }
} try: # See if there is a valid update URL
data['update'] = reverse("%s_update" % model, kwargs={'pk': o.pk})
except NoReverseMatch:
pass
results.append(data)
try: # See if there is an update url or don't bother with it otherwise # return a data response
data['update'] = reverse("%s_update" % model, kwargs={'pk': o.pk}) json = simplejson.dumps(results)
except NoReverseMatch:
pass
results.append(data)
json = simplejson.dumps(results[:20])
return HttpResponse(json, content_type="application/json") # Always json return HttpResponse(json, content_type="application/json") # Always json
start = request.GET.get('start', None) start = request.GET.get('start', None)