summaryrefslogtreecommitdiff
path: root/archaeological_warehouse/views.py
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
commit66a9fbec5a1e555a33cb4aed0e585224acd18b36 (patch)
treef529b0da4cb78e4b86b9601505ccfe3bf506431b /archaeological_warehouse/views.py
parent44cd3cad8b85a9e7477797d074a5aebc1ad40607 (diff)
downloadIshtar-66a9fbec5a1e555a33cb4aed0e585224acd18b36.tar.bz2
Ishtar-66a9fbec5a1e555a33cb4aed0e585224acd18b36.zip
Container autocomplete: more precise search
Diffstat (limited to 'archaeological_warehouse/views.py')
-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])