From 3ad9d4821bbcb8046a59eb07cda45e5b14fdc673 Mon Sep 17 00:00:00 2001 From: Will Thompson Date: Wed, 20 May 2015 12:30:31 +0200 Subject: [PATCH] Fix findEntities( ... name == x ... ), fixes #2769 --- pandora/entity/managers.py | 15 ++++++++++++++- pandora/entity/views.py | 11 +++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/pandora/entity/managers.py b/pandora/entity/managers.py index e3151940..47b725f3 100644 --- a/pandora/entity/managers.py +++ b/pandora/entity/managers.py @@ -5,6 +5,17 @@ from django.db.models import Q, Manager import ox from ox.django.query import QuerySet + +def namePredicate(op, value): + pat = { + '==': '|%s|', + '^': '|%s', + '$': '%s|', + }.get(op, '%s') + + return ('name_find__icontains', pat % value) + + def parseCondition(condition, user, item=None): ''' ''' @@ -29,10 +40,12 @@ def parseCondition(condition, user, item=None): return Q(**{k: v}) if isinstance(v, bool): #featured and public flag key = k + elif k == 'name_find': + key, v = namePredicate(op, v) else: if k == '*': k = 'find__value' - elif k not in ('name_find', 'id', 'user__username', 'type'): + elif k not in ('id', 'user__username', 'type'): find_key = k k = 'find__value' key = "%s%s" % (k, { diff --git a/pandora/entity/views.py b/pandora/entity/views.py index 626626eb..762b1b6f 100644 --- a/pandora/entity/views.py +++ b/pandora/entity/views.py @@ -19,6 +19,7 @@ from itemlist.models import List from changelog.models import add_changelog import models +from managers import namePredicate def get_entity_or_404_json(id): try: @@ -119,14 +120,8 @@ def autocompleteEntities(request, data): qs = models.Entity.objects.filter(type=data['key']) if data['value']: - if op == '=': - qs = qs.filter(name_find__icontains=data['value']) - elif op == '==': - qs = qs.filter(name_find__icontains=u'|%s|'%data['value']) - elif op == '^': - qs = qs.filter(name_find__icontains=u'|%s'%data['value']) - elif op == '$': - qs = qs.filter(name_find__icontains=u'%s|'%data['value']) + k, v = namePredicate(op, data['value']) + qs = qs.filter(**{k: v}) qs = qs.order_by(order_by) if op != '$': value_lower = data['value'].lower()