always use get_operator, avoid case-insensitive match if possible

This commit is contained in:
j 2016-06-29 23:58:29 +02:00
commit e9863c238e
24 changed files with 289 additions and 370 deletions

View file

@ -3,7 +3,16 @@
from django.db.models import Q, Manager
import ox
from oxdjango.query import QuerySet
from oxdjango.managers import get_operator
keymap = {
'user': 'user__username',
'name': 'name_find'
}
case_insensitive_keys = ('user__username',)
default_key = 'name'
def namePredicate(op, value):
@ -13,17 +22,14 @@ def namePredicate(op, value):
'$': '%s|',
}.get(op, '%s')
return ('name_find__icontains', pat % value)
return ('name_find__contains', pat % value.lower())
def parseCondition(condition, user, item=None):
'''
'''
k = condition.get('key', 'name')
k = {
'user': 'user__username',
'name': 'name_find'
}.get(k, k)
k = condition.get('key', default_key)
k = keymap.get(k, k)
v = condition['value']
op = condition.get('operator')
@ -42,7 +48,7 @@ def buildCondition(k, op, v):
if k == 'id':
v = ox.fromAZ(v)
return Q(**{k: v})
if isinstance(v, bool): #featured and public flag
if isinstance(v, bool):
key = k
elif k == 'name_find':
key, v = namePredicate(op, v)
@ -52,11 +58,7 @@ def buildCondition(k, op, v):
elif k not in ('id', 'user__username', 'type'):
find_key = k
k = 'find__value'
key = "%s%s" % (k, {
'==': '__iexact',
'^': '__istartswith',
'$': '__iendswith',
}.get(op, '__icontains'))
key = k + get_operator(op, 'istr' if k in case_insensitive_keys else 'str')
key = str(key)
if find_key:
return Q(**{'find__key': find_key, key: v})

View file

@ -56,6 +56,7 @@ class Entity(models.Model):
else:
self.name_sort = ox.sort_string(self.name or u'')[:255].lower() or None
self.name_find = '||' + '||'.join((self.name,) + self.alternativeNames) + '||'
self.name_find = self.name_find.lower()
super(Entity, self).save(*args, **kwargs)
self.update_matches()
self.update_annotations()
@ -70,11 +71,11 @@ class Entity(models.Model):
@classmethod
def get_by_name(cls, name, type):
return cls.objects.get(name_find__icontains=u'|%s|'%name, type=type)
return cls.objects.get(name_find__contains=u'|%s|' % name.lower(), type=type)
@classmethod
def get_or_create(model, name):
qs = model.objects.filter(name_find__icontains=u'|%s|'%name)
qs = model.objects.filter(name_find__contains=u'|%s|' % name.lower())
if qs.count() == 0:
instance = model(name=name)
instance.save()
@ -115,7 +116,7 @@ class Entity(models.Model):
data['name'] = "Unnamed"
name = data['name']
n = 1
while Entity.objects.filter(name_find__icontains=u'|%s|'%name).exclude(id=self.id).count() > 0:
while Entity.objects.filter(name_find__contains=u'|%s|' % name.lower()).exclude(id=self.id).count() > 0:
n += 1
name = data['name'] + ' [%d]' % n
self.name = name
@ -130,7 +131,7 @@ class Entity(models.Model):
name_ = name
n = 1
while name in used_names or \
Entity.objects.filter(name_find__icontains=u'|%s|'%name).exclude(id=self.id).count() > 0:
Entity.objects.filter(name_find__contains=u'|%s|' % name.lower()).exclude(id=self.id).count() > 0:
n += 1
name = name_ + ' [%d]' % n
names.append(name)