diff options
Diffstat (limited to 'archaeological_warehouse/views.py')
-rw-r--r-- | archaeological_warehouse/views.py | 55 |
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]) |