summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r--archaeological_warehouse/views.py55
1 files changed, 39 insertions, 16 deletions
diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py
index de0c64d19..a67af5925 100644
--- a/archaeological_warehouse/views.py
+++ b/archaeological_warehouse/views.py
@@ -101,26 +101,49 @@ def autocomplete_container(request, warehouse_id=None):
if warehouse_id:
base_query = Q(location_id=warehouse_id)
query = base_query
- for q in term.split(' '):
- extra = Q(reference__iexact=q)
- query = query & extra
+ # exact ref
+ query = query & Q(reference__unaccent__iexact=term)
containers = list(models.Container.objects.filter(
query).values('id', 'cached_label')[:limit])
limit = 15 - len(containers)
+ splitted = term.split(' ')
if limit > 0:
- query = base_query
- for q in term.split(' '):
- extra = Q(container_type__label__icontains=q) | \
- Q(container_type__reference__icontains=q) | \
- Q(reference__icontains=q) | \
- Q(cached_label__icontains=q) | \
- Q(location__name=q) | \
- Q(location__town=q)
- query = query & extra
- containers += list(
- models.Container.objects.filter(query).exclude(
- pk__in=[c['id'] for c in containers]
- ).values('id', 'cached_label')[:limit])
+ if len(splitted) > 1:
+ # group to do a "type" "reference" search
+ for idx in range(1, len(splitted)):
+ group_1 = splitted[:idx]
+ group_2 = splitted[idx:]
+ extra = Q(
+ container_type__label__unaccent__iexact=" ".join(group_1),
+ reference__unaccent__iexact=" ".join(group_2))
+ query = base_query & extra
+ containers += list(models.Container.objects.filter(
+ query).values('id', 'cached_label')[:limit])
+ if (15 - len(containers)) <= 0:
+ break
+ if (15 - len(containers)) > 0:
+ query = base_query
+ for q in splitted:
+ extra = Q(reference__unaccent__iexact=q)
+ query = query & extra
+ containers += list(models.Container.objects.filter(
+ query).values('id', 'cached_label')[:limit])
+ limit = 15 - len(containers)
+ if limit > 0:
+ query = base_query
+ for q in splitted:
+ extra = Q(container_type__label__unaccent__icontains=q) | \
+ Q(container_type__reference__unaccent__icontains=q) | \
+ Q(reference__unaccent__icontains=q) | \
+ Q(cached_label__unaccent__icontains=q)
+ if not warehouse_id:
+ extra |= Q(location__unaccent__name=q) | Q(
+ location__unaccent__town=q)
+ query = query & extra
+ containers += list(
+ models.Container.objects.filter(query).exclude(
+ pk__in=[c['id'] for c in containers]
+ ).values('id', 'cached_label')[:limit])
data = json.dumps(
[{'id': container['id'], 'value': container['cached_label']}
for container in containers])