diff options
| -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]) | 
