basic sort title api
This commit is contained in:
parent
7e40c2667b
commit
47942e204c
2 changed files with 70 additions and 31 deletions
|
@ -38,12 +38,22 @@ class Person(db.Model):
|
||||||
return cls.query.filter_by(name=name).first()
|
return cls.query.filter_by(name=name).first()
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
|
from .models import Item, Find
|
||||||
if not self.sortname:
|
if not self.sortname:
|
||||||
self.sortname = ox.get_sort_name(self.name)
|
self.sortname = ox.get_sort_name(self.name)
|
||||||
self.sortname = unicodedata.normalize('NFKD', self.sortname)
|
self.sortname = unicodedata.normalize('NFKD', self.sortname)
|
||||||
self.sortsortname = ox.sort_string(self.sortname)
|
self.sortsortname = ox.sort_string(self.sortname)
|
||||||
self.numberofnames = len(self.name.split(' '))
|
self.numberofnames = len(self.name.split(' '))
|
||||||
state.db.session.add(self)
|
state.db.session.add(self)
|
||||||
|
for i in Item.find({
|
||||||
|
'query': {
|
||||||
|
'conditions': [{'key': 'author', 'value': self.name, 'operator': '=='}]
|
||||||
|
}
|
||||||
|
}):
|
||||||
|
i.update_sort()
|
||||||
|
Find.query.filter_by(key='author', value=self.name).update({
|
||||||
|
'sortvalue': self.sortname.lower()
|
||||||
|
})
|
||||||
state.db.session.commit()
|
state.db.session.commit()
|
||||||
|
|
||||||
def json(self, keys=None):
|
def json(self, keys=None):
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# vi:si:et:sw=4:sts=4:ts=4
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import unicodedata
|
||||||
|
|
||||||
|
import ox
|
||||||
|
from sqlalchemy.orm import load_only
|
||||||
|
|
||||||
from oxtornado import actions
|
from oxtornado import actions
|
||||||
from . import models
|
from . import models
|
||||||
from . import query
|
import utils
|
||||||
|
import state
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -14,17 +20,19 @@ def editTitle(data):
|
||||||
'''
|
'''
|
||||||
takes {
|
takes {
|
||||||
id string
|
id string
|
||||||
sortname string
|
sorttitle string
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
response = {}
|
response = {}
|
||||||
'''
|
ids = data['id'].split(':')
|
||||||
item = models.Item.get(data['id'])
|
data = {
|
||||||
item.sortname = unicodedata.normalize('NFKD', data['sortname'])
|
'sorttitle': unicodedata.normalize('NFKD', data['sorttitle'])
|
||||||
item.save()
|
}
|
||||||
response['name'] = item.name
|
for item in models.Item.query.filter(models.Item.id.in_(ids)):
|
||||||
response['sortname'] = item.sortname
|
if item.meta.get('sorttitle') != data['sorttitle']:
|
||||||
'''
|
item.edit(data)
|
||||||
|
response['title'] = item.meta.get('title', 'Untitled')
|
||||||
|
response['sorttitle'] = item.meta['sorttitle']
|
||||||
return response
|
return response
|
||||||
actions.register(editTitle)
|
actions.register(editTitle)
|
||||||
|
|
||||||
|
@ -41,34 +49,55 @@ def findTitles(data):
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
response = {}
|
response = {}
|
||||||
#q = query.parse(data)
|
conditions = [
|
||||||
|
{'key': 'list', 'value': ':', 'operator': '=='}
|
||||||
|
]
|
||||||
|
if data.get('query', {}).get('conditions'):
|
||||||
|
value = data.get('query', {}).get('conditions')[0].get('value')
|
||||||
|
if value:
|
||||||
|
conditions.append({
|
||||||
|
'key': 'title', 'operator': '=', 'value': value
|
||||||
|
})
|
||||||
q = {
|
q = {
|
||||||
'qs': models.Item.query,
|
'qs': models.Item.find({
|
||||||
|
'query': {
|
||||||
|
'conditions': conditions, 'operator': '&'
|
||||||
}
|
}
|
||||||
if 'range' in data:
|
}),
|
||||||
q['range'] = data['range']
|
}
|
||||||
|
_keydata = data.copy()
|
||||||
|
for key in ('range', 'position', 'positions'):
|
||||||
|
if key in _keydata:
|
||||||
|
del _keydata[key]
|
||||||
|
key = 'title:' + hashlib.sha1(json.dumps(_keydata, sort_keys=True).encode('utf-8')).hexdigest()
|
||||||
|
titles = state.cache.get(key)
|
||||||
|
if titles is None:
|
||||||
|
response['items'] = []
|
||||||
|
_titles = {}
|
||||||
|
for i in q['qs']:
|
||||||
|
title = i.meta.get('title')
|
||||||
|
if not title in _titles:
|
||||||
|
_titles[title] = {
|
||||||
|
'id': i.id,
|
||||||
|
'title': title,
|
||||||
|
'sorttitle': i.get_sorttitle()
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
_titles[title]['id'] += ':' + i.id
|
||||||
|
titles = list(_titles.values())
|
||||||
|
if 'sort' in data:
|
||||||
|
titles.sort(key=lambda t: ox.sort_string(t[data['sort'][0]['key']]).lower(),
|
||||||
|
reverse=data['sort'][0]['operator']=='-')
|
||||||
|
state.cache.set(key, titles)
|
||||||
|
|
||||||
if 'position' in data:
|
if 'position' in data:
|
||||||
pass
|
pass
|
||||||
#ids = [i.id for i in q['qs'].options(load_only('id'))]
|
|
||||||
#response['position'] = utils.get_positions(ids, [data['qs'][0].id])[0]
|
|
||||||
print('fixme', data)
|
|
||||||
elif 'positions' in data:
|
elif 'positions' in data:
|
||||||
#ids = [i.id for i in q['qs'].options(load_only('id'))]
|
ids = [t['id'] for t in titles]
|
||||||
#response['positions'] = utils.get_positions(ids, data['positions'])
|
response['positions'] = utils.get_positions(ids, data['positions'])
|
||||||
response['positions'] = []
|
|
||||||
print('fixme', data)
|
|
||||||
elif 'keys' in data:
|
elif 'keys' in data:
|
||||||
response['items'] = []
|
response['items'] = titles[data['range'][0]:data['range'][1]]
|
||||||
for i in q['qs'][q['range'][0]:q['range'][1]]:
|
|
||||||
j = {}
|
|
||||||
for key in (data['keys'] or ['title', 'sorttitle']):
|
|
||||||
if key == 'title':
|
|
||||||
j[key] = i.info.get(key)
|
|
||||||
elif key == 'sorttitle':
|
|
||||||
j[key] = i.sort[0].title
|
|
||||||
response['items'].append(j)
|
|
||||||
else:
|
else:
|
||||||
response['items'] = q['qs'].count()
|
response['items'] = len(titles)
|
||||||
return response
|
return response
|
||||||
actions.register(findTitles)
|
actions.register(findTitles)
|
||||||
|
|
Loading…
Reference in a new issue