summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2021-01-26 14:46:40 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:24 +0100
commitf60cba3868bc754447bf9573345e74ea0fa3b2b1 (patch)
treef529b0da4cb78e4b86b9601505ccfe3bf506431b /archaeological_warehouse
parent4001e44945a3ed6731a740ee84d0f52ba7719a63 (diff)
downloadIshtar-f60cba3868bc754447bf9573345e74ea0fa3b2b1.tar.bz2
Ishtar-f60cba3868bc754447bf9573345e74ea0fa3b2b1.zip
Container autocomplete: more precise search
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])