diff --git a/pandora/annotation/managers.py b/pandora/annotation/managers.py index 798433bc..57384d61 100644 --- a/pandora/annotation/managers.py +++ b/pandora/annotation/managers.py @@ -6,12 +6,25 @@ from django.db.models import Q, Manager from oxdjango.query import QuerySet from item.utils import decode_id +from oxdjango.managers import get_operator +keymap = { + 'user': 'user__username', + 'place': 'places__id', + 'event': 'events__id', + 'in': 'start', + 'out': 'end', + 'id': 'public_id', + 'item': 'item__public_id', + 'value': 'findvalue', +} +case_insensitive_keys = ('user__username', ) case_sensitive_keys = ( 'public_id', 'layer', 'item__public_id', ) +default_key = 'findvalue' def parseCondition(condition, user): @@ -27,18 +40,9 @@ def parseCondition(condition, user): } ''' k = condition.get('key') - k = { - 'user': 'user__username', - 'place': 'places__id', - 'event': 'events__id', - 'in': 'start', - 'out': 'end', - 'id': 'public_id', - 'item': 'item__public_id', - 'value': 'findvalue', - }.get(k, k) + k = keymap.get(k, k) if not k: - k = 'findvalue' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -57,38 +61,12 @@ def parseCondition(condition, user): return q if k in ('places__id', 'events__id'): v = decode_id(v) - if isinstance(v, bool): #featured and public flag + if isinstance(v, bool): key = k elif k in ('places__id', 'events__id'): - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op, '')) - elif k in case_sensitive_keys: - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - '==': '__exact', - '=': '__contains', - '^': '__startswith', - '$': '__endswith', - }.get(op, '__contains')) + key = k + get_operator(op, 'int') else: - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - '==': '__iexact', - '=': '__icontains', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) - + key = k + get_operator(op, 'istr' if k in case_insensitive_keys else 'str') key = str(key) if isinstance(v, unicode): v = unicodedata.normalize('NFKD', v) diff --git a/pandora/annotation/models.py b/pandora/annotation/models.py index 7fa4ff05..11545184 100644 --- a/pandora/annotation/models.py +++ b/pandora/annotation/models.py @@ -22,9 +22,11 @@ from tasks import update_matches def get_super_matches(obj, model): super_matches = [] - q = Q(name_find__contains=" " + obj.name)|Q(name_find__contains="|%s"%obj.name) + name_lower = obj.name.lower() + q = Q(name_find__contains=" " + name_lower) | Q(name_find__contains="|%s" % name_lower) for name in obj.alternativeNames: - q = q|Q(name_find__contains=" " + name)|Q(name_find__contains="|%s"%name) + name_lower = name.lower() + q = q | Q(name_find__contains=" " + name_lower) | Q(name_find__contains="|%s" % name_lower) for p in model.objects.filter(q).exclude(id=obj.id): for othername in [p.name] + list(p.alternativeNames): for name in [obj.name] + list(obj.alternativeNames): @@ -48,11 +50,11 @@ def get_matches(obj, model, layer_type, qs=None): if contains: name = ox.decode_html(obj.name) name = unicodedata.normalize('NFKD', name).lower() - q = Q(findvalue__icontains=" " + name)|Q(findvalue__istartswith=name) + q = Q(findvalue__contains=" " + name) | Q(findvalue__startswith=name) for name in obj.alternativeNames: name = ox.decode_html(name) name = unicodedata.normalize('NFKD', name).lower() - q = q|Q(findvalue__icontains=" " + name)|Q(findvalue__istartswith=name) + q = q | Q(findvalue__contains=" " + name) | Q(findvalue__startswith=name) contains_matches = q&Q(layer__in=contains) if f: f = contains_matches | f diff --git a/pandora/changelog/managers.py b/pandora/changelog/managers.py index ac227dd7..b995b49d 100644 --- a/pandora/changelog/managers.py +++ b/pandora/changelog/managers.py @@ -4,8 +4,14 @@ from django.db.models import Q, Manager from oxdjango.query import QuerySet from item.utils import decode_id +from oxdjango.managers import get_operator +keymap = { + 'user': 'user__username', +} +default_key = 'name' + def parseCondition(condition, user): ''' condition: { @@ -19,12 +25,10 @@ def parseCondition(condition, user): } ... ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -43,22 +47,12 @@ def parseCondition(condition, user): return q if k == 'id': v = decode_id(v) - if isinstance(v, bool): #featured and public flag + if isinstance(v, bool): key = k elif k in ('id', 'created'): - key = '%s%s' % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op,'')) + key = k + get_operator(op, 'int') else: - key = '%s%s' % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op,'__icontains')) - + key = k + get_operator(op, 'istr') key = str(key) if exclude: q = ~Q(**{key: v}) diff --git a/pandora/clip/managers.py b/pandora/clip/managers.py index 453d30d3..a2cd2487 100644 --- a/pandora/clip/managers.py +++ b/pandora/clip/managers.py @@ -8,8 +8,21 @@ from django.conf import settings from oxdjango.query import QuerySet from item.utils import decode_id, get_by_id +from oxdjango.managers import get_operator +keymap = { + 'event': 'annotations__events__id', + 'in': 'start', + 'out': 'end', + 'place': 'annotations__places__id', + 'text': 'findvalue', + 'annotations': 'findvalue', + 'user': 'annotations__user__username', +} +case_insensitive_keys = ('annotations__user__username', ) +default_key = 'name' + def parseCondition(condition, user): ''' condition: { @@ -22,18 +35,10 @@ def parseCondition(condition, user): operator: "!=" } ''' - k = condition.get('key', 'name') - k = { - 'event': 'annotations__events__id', - 'in': 'start', - 'out': 'end', - 'place': 'annotations__places__id', - 'text': 'findvalue', - 'annotations': 'findvalue', - 'user': 'annotations__user__username', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -60,35 +65,18 @@ def parseCondition(condition, user): if k == 'id': public_id, points = v.split('/') - points = [float('%0.03f'%float(p)) for p in points.split('-')] + points = [float('%0.03f' % float(p)) for p in points.split('-')] q = Q(item__public_id=public_id, start=points[0], end=points[1]) return exclude and ~q or q - elif k.endswith('__id'): v = decode_id(v) - if isinstance(v, bool): #featured and public flag - key = k - elif k in ('lat', 'lng', 'area', 'south', 'west', 'north', 'east', 'matches', - 'id') or k.endswith('__id'): - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op, '')) - else: - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - '===': '__exact', - '==': '__iexact', - '=': '__icontains', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) + if isinstance(v, bool): + key = k + elif k in ('id', ) or k.endswith('__id'): + key = k + get_operator(op, 'int') + else: + key = k + get_operator(op, 'istr' if k in case_insensitive_keys else 'str') key = str(key) if isinstance(v, unicode) and op != '===': v = unicodedata.normalize('NFKD', v).lower() @@ -137,8 +125,6 @@ def parseConditions(conditions, operator, user): return q return None - - class ClipManager(Manager): def get_query_set(self): @@ -150,17 +136,9 @@ class ClipManager(Manager): conditions = data.get('query', {}).get('conditions', []) conditions = filter(lambda c: c['key'] in keys, conditions) operator = data.get('query', {}).get('operator', '&') + def parse(condition): - key = "%s%s" % ('findvalue', { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - '==': '__iexact', - '=': '__icontains', - '^': '__istartswith', - '$': '__iendswith', - }.get(condition.get('operator', ''), '__icontains')) + key = 'findvalue' + get_operator(condition.get('operator', '')) v = condition['value'] if isinstance(v, unicode): v = unicodedata.normalize('NFKD', v).lower() @@ -168,6 +146,7 @@ class ClipManager(Manager): if condition['key'] in layer_ids: q = q & Q(layer=condition['key']) return q + conditions = map(parse, conditions) if conditions: q = conditions[0] diff --git a/pandora/document/managers.py b/pandora/document/managers.py index 2772d63c..d0334ea2 100644 --- a/pandora/document/managers.py +++ b/pandora/document/managers.py @@ -6,18 +6,22 @@ import ox from oxdjango.query import QuerySet import entity.managers +from oxdjango.managers import get_operator +keymap = { + 'user': 'user__username', + 'item': 'items__public_id', +} +default_key = 'name' + def parseCondition(condition, user, item=None): ''' ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - 'item': 'items__public_id', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key if item and k == 'description': item_conditions = condition.copy() item_conditions['key'] = 'items__itemproperties__description' @@ -38,17 +42,13 @@ 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 == 'entity': entity_key, v = entity.managers.namePredicate(op, v) key = 'entities__' + entity_key else: - key = "%s%s" % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) + key = k + get_operator(op, 'istr') key = str(key) return Q(**{key: v}) diff --git a/pandora/edit/managers.py b/pandora/edit/managers.py index 7d0fe874..83a05b21 100644 --- a/pandora/edit/managers.py +++ b/pandora/edit/managers.py @@ -3,19 +3,21 @@ from django.db.models import Q, Manager from oxdjango.query import QuerySet +from oxdjango.managers import get_operator +keymap = { + 'user': 'user__username', + 'position': 'position__position', + 'posterFrames': 'poster_frames', +} +default_key = 'name' + def parseCondition(condition, user): - ''' - ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - 'position': 'position__position', - 'posterFrames': 'poster_frames', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition.get('value', '') op = condition.get('operator') if not op: @@ -36,14 +38,10 @@ def parseCondition(condition, user): if k == 'subscribed': key = 'subscribed_users__username' v = user.username - elif isinstance(v, bool): #featured and public flag + elif isinstance(v, bool): key = k else: - key = "%s%s" % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) + key = k + get_operator(op, 'istr') key = str(key) if exclude: q = ~Q(**{key: v}) diff --git a/pandora/entity/managers.py b/pandora/entity/managers.py index 03bede0b..7ea6133c 100644 --- a/pandora/entity/managers.py +++ b/pandora/entity/managers.py @@ -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}) diff --git a/pandora/entity/models.py b/pandora/entity/models.py index d515937f..3819d638 100644 --- a/pandora/entity/models.py +++ b/pandora/entity/models.py @@ -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) diff --git a/pandora/event/managers.py b/pandora/event/managers.py index 336e9e23..cb11ed35 100644 --- a/pandora/event/managers.py +++ b/pandora/event/managers.py @@ -3,16 +3,19 @@ import unicodedata from django.db.models import Q, Manager -from oxdjango.query import QuerySet +from oxdjango.query import QuerySet +from oxdjango.managers import get_operator from item.utils import decode_id +keymap = { + 'user': 'user__username', +} +default_key = 'name' def parseCondition(condition, user): - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) v = condition['value'] op = condition.get('operator') if not op: @@ -25,12 +28,7 @@ def parseCondition(condition, user): if k == 'id': v = decode_id(v) - key = '%s%s' % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op,'__icontains')) - + key = k + get_operator(op, 'istr') key = str(key) if isinstance(v, unicode): v = unicodedata.normalize('NFKD', v).lower() diff --git a/pandora/event/models.py b/pandora/event/models.py index f4902794..c21d72c5 100644 --- a/pandora/event/models.py +++ b/pandora/event/models.py @@ -62,7 +62,7 @@ class Event(models.Model): @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() @@ -131,6 +131,7 @@ class Event(models.Model): if not self.name_sort: self.set_name_sort() self.name_find = '||' + '||'.join((self.name,) + self.alternativeNames) + '||' + self.name_find = self.name_find.lower() self.defined = len(filter(None, [getattr(self, key) for key in ('start', 'end')])) > 0 if self.endTime and self.startTime: diff --git a/pandora/item/managers.py b/pandora/item/managers.py index a3e2a171..06391da2 100644 --- a/pandora/item/managers.py +++ b/pandora/item/managers.py @@ -13,29 +13,7 @@ import models import utils from oxdjango.query import QuerySet - -def get_operator(op, type='str'): - return { - 'str': { - '==': '__iexact', - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - '^': '__istartswith', - '$': '__iendswith', - }, - 'int': { - '==': '__exact', - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - } - }[type].get(op, { - 'str': '__icontains', - 'int': '' - }[type]) +from oxdjango.managers import get_operator def parseCondition(condition, user, owner=None): ''' @@ -97,8 +75,7 @@ def parseCondition(condition, user, owner=None): if (not exclude and op == '=' or op in ('$', '^')) and v == '': return Q() - elif k == 'filename' and (user.is_anonymous() or \ - not user.profile.capability('canSeeMedia')): + elif k == 'filename' and (user.is_anonymous() or not user.profile.capability('canSeeMedia')): return Q(id=0) elif k == 'oshash': return Q(files__oshash=v) @@ -140,19 +117,17 @@ def parseCondition(condition, user, owner=None): value_key = 'find__value' else: value_key = k + if isinstance(v, unicode): + v = unicodedata.normalize('NFKD', v).lower() if k in facet_keys: in_find = False - facet_value = 'facets__value' + get_operator(op) - v = models.Item.objects.filter(**{'facets__key':k, facet_value:v}) + facet_value = 'facets__value' + get_operator(op, 'istr') + v = models.Item.objects.filter(**{'facets__key': k, facet_value: v}) value_key = 'id__in' else: value_key = value_key + get_operator(op) - if 'find__value' in value_key: - value_key = value_key.replace('_icontains', '_contains') k = str(k) value_key = str(value_key) - if isinstance(v, unicode): - v = unicodedata.normalize('NFKD', v).lower() if k == '*': q = Q(**{value_key: v}) elif in_find: diff --git a/pandora/item/models.py b/pandora/item/models.py index f4c45f9a..6b49e354 100644 --- a/pandora/item/models.py +++ b/pandora/item/models.py @@ -124,9 +124,10 @@ def get_item(info, user=None): item.save(sync=True) tasks.update_poster.delay(item.public_id) else: - qs = Item.objects.filter(find__key='title', find__value__iexact=info['title']) + title = unicodedata.normalize('NFKD', info['title']).lower() + qs = Item.objects.filter(find__key='title', find__value=title) if 'year' in info: - qs = qs.filter(find__key='year', find__value__iexact=str(info['year'])) + qs = qs.filter(find__key='year', find__value=str(info['year'])) if qs.count() == 1: item = qs[0] else: diff --git a/pandora/itemlist/managers.py b/pandora/itemlist/managers.py index 2e95e321..267a20e9 100644 --- a/pandora/itemlist/managers.py +++ b/pandora/itemlist/managers.py @@ -3,19 +3,21 @@ from django.db.models import Q, Manager +from oxdjango.managers import get_operator from oxdjango.query import QuerySet +keymap = { + 'user': 'user__username', +} +default_key = 'name' + def parseCondition(condition, user): ''' ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - 'position': 'position__position', - 'posterFrames': 'poster_frames', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition.get('value', '') op = condition.get('operator') if not op: @@ -36,14 +38,10 @@ def parseCondition(condition, user): if k == 'subscribed': key = 'subscribed_users__username' v = user.username - elif isinstance(v, bool): #featured and public flag + elif isinstance(v, bool): key = k else: - key = "%s%s" % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) + key = k + get_operator(op, 'istr') key = str(key) if exclude: q = ~Q(**{key: v}) diff --git a/pandora/log/managers.py b/pandora/log/managers.py index 98f75064..78c2f76e 100644 --- a/pandora/log/managers.py +++ b/pandora/log/managers.py @@ -1,11 +1,17 @@ # -*- coding: utf-8 -*- # vi:si:et:sw=4:sts=4:ts=4 from django.db.models import Q, Manager -from oxdjango.query import QuerySet +from oxdjango.query import QuerySet +from oxdjango.managers import get_operator from item.utils import decode_id +keymap = { + 'user': 'user__username', +} +default_key = 'name' + def parseCondition(condition, user): ''' condition: { @@ -19,12 +25,10 @@ def parseCondition(condition, user): } ... ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -43,22 +47,12 @@ def parseCondition(condition, user): return q if k == 'id': v = decode_id(v) - if isinstance(v, bool): #featured and public flag + if isinstance(v, bool): key = k elif k in ('id', ): - key = '%s%s' % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op,'')) + key = k + get_operator(op, 'int') else: - key = '%s%s' % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op,'__icontains')) - + key = k + get_operator(op, 'istr') key = str(key) if exclude: q = ~Q(**{key: v}) diff --git a/pandora/news/managers.py b/pandora/news/managers.py index aa332167..eff13876 100644 --- a/pandora/news/managers.py +++ b/pandora/news/managers.py @@ -4,15 +4,18 @@ from django.db.models import Q, Manager from oxdjango.query import QuerySet from item.utils import decode_id +from oxdjango.managers import get_operator +keymap = { + 'user': 'user__username', +} +default_key = 'name' def parseCondition(condition, user): - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - }.get(k, k) + k = condition.get('key', defauly_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -31,26 +34,12 @@ def parseCondition(condition, user): return q if k == 'id': v = decode_id(v) - if isinstance(v, bool): #featured and public flag + if isinstance(v, bool): key = k elif k in ('id',): - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op, '')) + key = k + get_operator(op, 'int') else: - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - '==': '__iexact', - '=': '__icontains', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) + key = k + get_operator(op, 'istr') key = str(key) if exclude: diff --git a/pandora/oxdjango/managers.py b/pandora/oxdjango/managers.py new file mode 100644 index 00000000..c1a5edb7 --- /dev/null +++ b/pandora/oxdjango/managers.py @@ -0,0 +1,36 @@ + +def get_operator(op, type='str'): + return { + 'str': { + '==': '', + '===': '', + '>': '__gt', + '>=': '__gte', + '<': '__lt', + '<=': '__lte', + '^': '__startswith', + '$': '__endswith', + }, + 'istr': { + '==': '__iexact', + '===': '', + '>': '__gt', + '>=': '__gte', + '<': '__lt', + '<=': '__lte', + '^': '__istartswith', + '$': '__iendswith', + }, + 'int': { + '==': '', + '>': '__gt', + '>=': '__gte', + '<': '__lt', + '<=': '__lte', + } + }[type].get(op, { + 'str': '__contains', + 'istr': '__icontains', + 'int': '' + }[type]) + diff --git a/pandora/person/managers.py b/pandora/person/managers.py index 7e8e800b..969c7eec 100644 --- a/pandora/person/managers.py +++ b/pandora/person/managers.py @@ -3,10 +3,16 @@ import unicodedata from django.db.models import Q, Manager -from oxdjango.query import QuerySet from item.utils import decode_id +from oxdjango.query import QuerySet +from oxdjango.managers import get_operator +keymap = { + 'user': 'user__username', +} +case_insensitive_keys = ('user__username', 'subscribed_users__username') +default_key = 'name' def parseCondition(condition, user): ''' @@ -21,12 +27,10 @@ def parseCondition(condition, user): } ... ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -45,22 +49,12 @@ def parseCondition(condition, user): return q if k == 'id': v = decode_id(v) - if isinstance(v, bool): #featured and public flag + if isinstance(v, bool): key = k - elif k in ('lat', 'lng', 'area', 'south', 'west', 'north', 'east', 'matches', 'id'): - key = '%s%s' % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op,'')) + elif k in ('id',): + key = k + get_operator(op, 'int') else: - key = '%s%s' % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op,'__icontains')) - + key = k + get_operator(op, 'istr') key = str(key) if isinstance(v, unicode): v = unicodedata.normalize('NFKD', v).lower() diff --git a/pandora/place/managers.py b/pandora/place/managers.py index d61e6034..a9292e7e 100644 --- a/pandora/place/managers.py +++ b/pandora/place/managers.py @@ -3,10 +3,15 @@ import unicodedata from django.db.models import Q, Manager -from oxdjango.query import QuerySet from item.utils import decode_id +from oxdjango.managers import get_operator +from oxdjango.query import QuerySet +keymap = { + 'user': 'user__username', +} +default_key = 'name' def parseCondition(condition, user): ''' @@ -21,12 +26,10 @@ def parseCondition(condition, user): } ... ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -44,21 +47,12 @@ def parseCondition(condition, user): return q if k == 'id': v = decode_id(v) - if isinstance(v, bool): #featured and public flag + if isinstance(v, bool): key = k elif k in ('lat', 'lng', 'area', 'south', 'west', 'north', 'east', 'matches', 'id'): - key = '%s%s' % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op,'')) + key = k + get_operator(op, 'int') else: - key = '%s%s' % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op,'__icontains')) + key = k + get_operator(op, 'istr') key = str(key) if isinstance(v, unicode): diff --git a/pandora/place/models.py b/pandora/place/models.py index 9e0024e7..bd482475 100644 --- a/pandora/place/models.py +++ b/pandora/place/models.py @@ -56,7 +56,7 @@ class Place(models.Model): @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() @@ -148,7 +148,7 @@ class Place(models.Model): self.name_sort = self.name #', '.join(self.name) if self.geoname: self.geoname_sort = ', '.join(reversed(self.geoname.split(', '))) - self.name_find = '|%s|'%'|'.join([self.name]+list(self.alternativeNames)) + self.name_find = '|%s|' % '|'.join([self.name]+list(self.alternativeNames)).lower() self.defined = len(filter(None, [getattr(self, key) for key in ('south', 'west', 'north', 'east')])) > 0 diff --git a/pandora/place/views.py b/pandora/place/views.py index 0040abfa..5070173a 100644 --- a/pandora/place/views.py +++ b/pandora/place/views.py @@ -50,7 +50,7 @@ def addPlace(request, data): n = 0 while _exists: _exists = models.Place.objects.filter(defined=True, - name_find__icontains=u'|%s|'%name).count() > 0 + name_find__contains=u'|%s|' % name.lower()).count() > 0 if _exists: name = 'Untitled [%s]' %n n += 1 @@ -61,7 +61,7 @@ def addPlace(request, data): for n in names: n = ox.decode_html(name) if models.Place.objects.filter(defined=True, - name_find__icontains=u'|%s|'%n).count() != 0: + name_find__contains=u'|%s|' % n.lower()).count() != 0: exists = True existing_names.append(n) ''' @@ -130,7 +130,7 @@ def editPlace(request, data): for name in names + alternative_names: name = ox.decode_html(name) if models.Place.objects.filter(defined=True, - name_find__icontains=u'|%s|'%name).exclude(id=place.id).count() != 0: + name_find__contains=u'|%s|' % name.lower()).exclude(id=place.id).count() != 0: conflict = True conflict_names.append(name) ''' diff --git a/pandora/sequence/managers.py b/pandora/sequence/managers.py index 11ef401b..77aef3ff 100644 --- a/pandora/sequence/managers.py +++ b/pandora/sequence/managers.py @@ -2,12 +2,20 @@ # vi:si:et:sw=4:sts=4:ts=4 from django.db.models import Q, Manager -from oxdjango.query import QuerySet from item.utils import decode_id +from oxdjango.managers import get_operator +from oxdjango.query import QuerySet import models +keymap = { + 'in': 'start', + 'out': 'end' +} +case_insensitive_keys = ('user__username', 'subscribed_users__username') +default_key = 'name' + def parseCondition(condition, user): ''' @@ -21,13 +29,10 @@ def parseCondition(condition, user): operator: "!=" } ''' - k = condition.get('key', 'name') - k = { - 'in': 'start', - 'out': 'end' - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -47,31 +52,22 @@ def parseCondition(condition, user): if k == 'id': public_id, points = v.split('/') - points = [float('%0.03f'%float(p)) for p in points.split('-')] + points = [float('%0.03f' % float(p)) for p in points.split('-')] q = Q(sort__item__public_id=public_id, start=points[0], end=points[1]) return exclude and ~q or q if k == 'hash': - v = models.parse_hash(v) + v = models.parse_hash(v) if k == 'mode': v = models.Sequence.MODE[v] if k.endswith('__id'): v = decode_id(v) - if isinstance(v, bool): #featured and public flag + + if isinstance(v, bool): + key = k + elif k in ('mode', 'hash'): key = k else: - if k in ('mode', 'hash'): - key = k - else: - key = "%s%s" % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - '==': '__iexact', - '=': '__icontains', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) + key = k + get_operator(op, 'istr') key = str(key) if exclude: diff --git a/pandora/text/managers.py b/pandora/text/managers.py index 515825b5..37b30d48 100644 --- a/pandora/text/managers.py +++ b/pandora/text/managers.py @@ -2,19 +2,24 @@ # vi:si:et:sw=4:sts=4:ts=4 from django.db.models import Q, Manager +from oxdjango.managers import get_operator from oxdjango.query import QuerySet + +keymap = { + 'user': 'user__username', + 'position': 'position__position', + 'posterFrames': 'poster_frames', +} +default_key = 'name' + def parseCondition(condition, user): ''' ''' - k = condition.get('key', 'name') - k = { - 'user': 'user__username', - 'position': 'position__position', - 'posterFrames': 'poster_frames', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'name' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -35,14 +40,10 @@ def parseCondition(condition, user): if k == 'subscribed': key = 'subscribed_users__username' v = user.username - elif isinstance(v, bool): #featured and public flag + elif isinstance(v, bool): key = k else: - key = "%s%s" % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op, '__icontains')) + key = k + get_operator(op, 'istr') key = str(key) if exclude: q = ~Q(**{key: v}) diff --git a/pandora/title/managers.py b/pandora/title/managers.py index 4bf73739..1c2afc46 100644 --- a/pandora/title/managers.py +++ b/pandora/title/managers.py @@ -2,10 +2,14 @@ # vi:si:et:sw=4:sts=4:ts=4 import unicodedata from django.db.models import Q, Manager -from oxdjango.query import QuerySet from item.utils import decode_id +from oxdjango.managers import get_operator +from oxdjango.query import QuerySet +keymap = { +} +default_key = 'title' def parseCondition(condition, user): ''' @@ -20,12 +24,10 @@ def parseCondition(condition, user): } ... ''' - k = condition.get('key', 'title') - k = { - 'user': 'user__usertitle', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) if not k: - k = 'title' + k = default_key v = condition['value'] op = condition.get('operator') if not op: @@ -45,23 +47,13 @@ def parseCondition(condition, user): if k == 'id': v = decode_id(v) elif isinstance(v, unicode): - v = unicodedata.normalize('NFKD', v) - if isinstance(v, bool): #featured and public flag + v = unicodedata.normalize('NFKD', v).lower() + if isinstance(v, bool): key = k - elif k in ('lat', 'lng', 'area', 'south', 'west', 'north', 'east', 'matches', 'id'): - key = '%s%s' % (k, { - '>': '__gt', - '>=': '__gte', - '<': '__lt', - '<=': '__lte', - }.get(op,'')) + elif k in ('id', ): + key = k + get_operator(op, 'int') else: - key = '%s%s' % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op,'__icontains')) - + key = k + get_operator(op, 'istr') key = str(key) if exclude: q = ~Q(**{key: v}) diff --git a/pandora/user/managers.py b/pandora/user/managers.py index bfdc064a..d23007e5 100644 --- a/pandora/user/managers.py +++ b/pandora/user/managers.py @@ -1,17 +1,22 @@ # -*- coding: utf-8 -*- # vi:si:et:sw=4:sts=4:ts=4 from django.db.models import Q, Manager -from oxdjango.query import QuerySet from django.conf import settings +from oxdjango.managers import get_operator +from oxdjango.query import QuerySet + +keymap = { + 'email': 'user__email', + 'user': 'username', + 'group': 'user__groups__name', + 'groups': 'user__groups__name', +} +default_key = 'username' + def parseCondition(condition, user): - k = condition.get('key', 'name') - k = { - 'email': 'user__email', - 'user': 'username', - 'group': 'user__groups__name', - 'groups': 'user__groups__name', - }.get(k, k) + k = condition.get('key', default_key) + k = keymap.get(k, k) v = condition['value'] op = condition.get('operator') if not op: @@ -28,18 +33,9 @@ def parseCondition(condition, user): v = levels.index(v) - 1 else: v = 0 - key = '%s%s' % (k, { - '==': '__exact', - '<': '__lt', - '>': '__gt', - }.get(op,'')) + key = k + get_operator(op, 'int') else: - key = '%s%s' % (k, { - '==': '__iexact', - '^': '__istartswith', - '$': '__iendswith', - }.get(op,'__icontains')) - + key = k + get_operator(op, 'istr') key = str(key) q = Q(**{key: v})