diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-12-03 16:48:07 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-02-28 12:15:22 +0100 | 
| commit | cf5c573889f4c8e7047988cbd05483c12f3ba403 (patch) | |
| tree | ec979a2242f8935862db4125336fbd318e1bae51 /ishtar_common | |
| parent | 38f65d977e45572129d1d23cbba55d49f7503279 (diff) | |
| download | Ishtar-cf5c573889f4c8e7047988cbd05483c12f3ba403.tar.bz2 Ishtar-cf5c573889f4c8e7047988cbd05483c12f3ba403.zip | |
Fix distinct for autocomplete (refs #4994)
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/views.py | 38 | 
1 files changed, 20 insertions, 18 deletions
| diff --git a/ishtar_common/views.py b/ishtar_common/views.py index ceb8db200..396f31a6f 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -271,7 +271,7 @@ def get_autocomplete_generic(model, extra=None):                  continue              query = query & Q(label__icontains=q)          limit = 20 -        objects = model.objects.filter(query)[:limit] +        objects = model.objects.filter(query).distinct()[:limit]          get_label = lambda x: x.full_label() if hasattr(x, 'full_label') \              else str(x)          data = json.dumps([{'id': obj.pk, 'value': get_label(obj)} @@ -590,11 +590,15 @@ def autocomplete_user(request):                Q(first_name__icontains=q) |                Q(last_name__icontains=q))          query = query & qu -    users = models.User.objects.filter(query)[:limit] -    data = json.dumps([ -        {'id': user.pk, -         'value': str(user.ishtaruser)} -        for user in users if user and user.ishtaruser]) +    users = models.User.objects.filter(query).distinct()[:limit] +    values = [] +    for user in users: +        try: +            if user and user.ishtaruser: +                values.append({'id': user.pk, 'value': str(user.ishtaruser)}) +        except models.User.ishtaruser.RelatedObjectDoesNotExist: +            pass +    data = json.dumps(values)      return HttpResponse(data, content_type='text/plain') @@ -613,7 +617,7 @@ def autocomplete_ishtaruser(request):                Q(person__surname__icontains=q) |                Q(person__raw_name__icontains=q))          query = query & qu -    users = models.IshtarUser.objects.filter(query)[:limit] +    users = models.IshtarUser.objects.filter(query).distinct()[:limit]      data = json.dumps([          {'id': user.pk,           'value': str(user)} @@ -660,7 +664,7 @@ def autocomplete_person(request, person_types=None, attached_to=None,          if not hasattr(request.user, 'ishtaruser'):              return HttpResponse(json.dumps([]), content_type='text/plain')          query &= models.Person.get_query_owns(request.user.ishtaruser) -    persons = models.Person.objects.filter(query)[:limit] +    persons = models.Person.objects.filter(query).distinct()[:limit]      data = json.dumps([{'id': person.pk, 'value': str(person)}                         for person in persons if person])      return HttpResponse(data, content_type='text/plain') @@ -676,7 +680,7 @@ def autocomplete_department(request):          extra = (Q(label__icontains=q) | Q(number__istartswith=q))          query = query & extra      limit = 20 -    departments = models.Department.objects.filter(query)[:limit] +    departments = models.Department.objects.filter(query).distinct()[:limit]      data = json.dumps([{'id': department.pk, 'value': str(department)}                         for department in departments])      return HttpResponse(data, content_type='text/plain') @@ -694,7 +698,7 @@ def autocomplete_town(request):              extra |= Q(numero_insee__istartswith=q)          query &= extra      limit = 20 -    towns = models.Town.objects.filter(query)[:limit] +    towns = models.Town.objects.filter(query).distinct()[:limit]      data = json.dumps([{'id': town.pk, 'value': str(town)}                         for town in towns])      return HttpResponse(data, content_type='text/plain') @@ -718,7 +722,7 @@ def autocomplete_advanced_town(request, department_id=None, state_id=None):      if state_id:          query = query & Q(departement__state__number__iexact=state_id)      limit = 20 -    towns = models.Town.objects.filter(query)[:limit] +    towns = models.Town.objects.filter(query).distinct()[:limit]      result = []      for town in towns:          val = town.name @@ -743,12 +747,10 @@ def autocomplete_document(request):          qu = Q(**{fields[0]: q})          for field in fields[1:]:              qu |= Q(**{field: q}) -        if not query: -            query = qu -        else: -            query = query & qu +        query = qu if not query else query & qu      limit = 20 -    items = models.Document.objects.filter(query)[:limit] +    items = models.Document.objects.filter( +        query).exclude(title="").distinct()[:limit]      data = json.dumps([{'id': item.pk, 'value': str(item)}                         for item in items])      return HttpResponse(data, content_type='text/plain') @@ -788,7 +790,7 @@ def autocomplete_organization(request, orga_type=None):          except (ValueError, ObjectDoesNotExist):              pass      limit = 15 -    organizations = models.Organization.objects.filter(query)[:limit] +    organizations = models.Organization.objects.filter(query).distinct()[:limit]      data = json.dumps([{'id': org.pk, 'value': str(org)}                         for org in organizations])      return HttpResponse(data, content_type='text/plain') @@ -810,7 +812,7 @@ def autocomplete_author(request):              Q(author_type__label__icontains=q)          query = query & extra      limit = 15 -    authors = models.Author.objects.filter(query)[:limit] +    authors = models.Author.objects.filter(query).distinct()[:limit]      data = json.dumps([{'id': author.pk, 'value': str(author)}                         for author in authors])      return HttpResponse(data, content_type='text/plain') | 
