openmedialibrary/oml/item/person_api.py

112 lines
3.2 KiB
Python

# -*- coding: utf-8 -*-
import unicodedata
from oxtornado import actions
from queryparser import get_operator
from .person import Person
import logging
logger = logging.getLogger(__name__)
def parse(data, model):
query = {}
query['range'] = [0, 100]
if not 'group' in data:
query['sort'] = [{'key':'sortname', 'operator':'+'}]
for key in ('keys', 'group', 'list', 'range', 'sort', 'query'):
if key in data:
query[key] = data[key]
query['qs'] = model.query
if 'query' in data and data['query'].get('conditions'):
conditions = []
for c in data['query']['conditions']:
op = get_operator(c['operator'])
conditions.append(op(getattr(model, c['key']), c['value']))
if data['query'].get('operator') == '|':
q = conditions[0]
for c in conditions[1:]:
q = q | c
q = [q]
else:
q = conditions
for c in q:
query['qs'] = query['qs'].filter(c)
query['qs'] = order(query['qs'], query['sort'])
return query
def order(qs, sort):
order_by = []
for e in sort:
operator = e['operator']
if operator != '-':
operator = ''
else:
operator = ' DESC'
key = {}.get(e['key'], e['key'])
order = '%s%s' % (key, operator)
order_by.append(order)
if order_by:
#nulllast not supported in sqlite, use IS NULL hack instead
#order_by = map(nullslast, order_by)
_order_by = []
for order in order_by:
nulls = "%s IS NULL" % order.split(' ')[0]
_order_by.append(nulls)
_order_by.append(order)
order_by = _order_by
qs = qs.order_by(*order_by)
return qs
def editName(data):
'''
takes {
name string
sortanme string
}
'''
response = {}
person = Person.get(data['name'])
person.sortname = unicodedata.normalize('NFKD', data['sortname'])
person.save()
response['name'] = person.name
response['sortname'] = person.sortname
return response
actions.register(editName)
def findNames(data):
'''
takes {
query {
conditions [{}]
operator string
}
keys [string]
sort [{}]
range [int, int]
}
'''
response = {}
q = parse(data, Person)
if 'position' in data:
pass
#ids = [i.id for i in q['qs'].options(load_only('id'))]
#response['position'] = utils.get_positions(ids, [data['qs'][0].id])[0]
logger.debug('fix position request %s', data)
elif 'positions' in data:
#ids = [i.id for i in q['qs'].options(load_only('id'))]
#response['positions'] = utils.get_positions(ids, data['positions'])
response['positions'] = []
logger.debug('fix positions request %s', data)
elif 'keys' in data:
response['items'] = []
for i in q['qs'][q['range'][0]:q['range'][1]]:
j = i.json()
response['items'].append({k:j[k] for k in j if not data['keys'] or k in data['keys']})
else:
response['items'] = q['qs'].count()
return response
actions.register(findNames)