allow custom metadata

This commit is contained in:
j 2014-05-19 22:58:00 +02:00
commit 996a754db5
12 changed files with 126 additions and 144 deletions

View file

@ -161,13 +161,17 @@ class Changelog(db.Model):
i = Item.get(itemid)
if i.timestamp > timestamp:
return True
key = meta.keys()[0]
if not meta[key] and i.meta.get('mainid') == key:
logger.debug('remove id mapping %s currenrlt %s', key, meta[key], i.meta[key])
i.update_mainid(key, meta[key])
elif meta[key] and (i.meta.get('mainid') != key or meta[key] != i.meta.get(key)):
logger.debug('new mapping %s %s currently %s %s', key, meta[key], i.meta.get('mainid'), i.meta.get(i.meta.get('mainid')))
i.update_mainid(key, meta[key])
keys = filter(lambda k: k in Item.id_keys, meta.keys())
if keys:
key = keys[0]
if not meta[key] and i.meta.get('mainid') == key:
logger.debug('remove id mapping %s currently %s', key, meta[key], i.meta[key])
i.update_mainid(key, meta[key])
elif meta[key] and (i.meta.get('mainid') != key or meta[key] != i.meta.get(key)):
logger.debug('new mapping %s %s currently %s %s', key, meta[key], i.meta.get('mainid'), i.meta.get(i.meta.get('mainid')))
i.update_mainid(key, meta[key])
else:
i.update_meta(meta)
i.modified = datetime.fromtimestamp(float(timestamp))
i.save()
return True

View file

@ -125,12 +125,11 @@ def edit(data):
item.update_mainid(key, data[key])
response = item.json()
elif not item.meta.get('mainid'):
logger.debug('chustom data %s', data)
for key in ('title', 'author', 'date', 'publisher', 'edition'):
if key in data:
item.meta[key] = data[key]
item.update()
logger.debug('FIXME: custom metadata not published to changelog!!!')
logger.debug('setting chustom metadata %s', data)
item.update_meta(data)
response = item.json()
else:
logger.debug('invalid metadata %s', data)
else:
logger.info('can only edit available items')
return response

View file

@ -18,8 +18,6 @@ import ox
import settings
from settings import db, config
from user.models import User
from person import get_sort_name
import media
@ -250,12 +248,17 @@ class Item(db.Model):
db.session.add(f)
def update(self):
for key in ('mediastate', 'coverRatio'):
if key in self.meta:
if key not in self.info:
self.info[key] = self.meta[key]
del self.meta[key]
users = map(str, list(self.users))
self.meta['mediastate'] = 'available' # available, unavailable, transferring
self.info['mediastate'] = 'available' # available, unavailable, transferring
if self.transferadded and self.transferprogress < 1:
self.meta['mediastate'] = 'transferring'
self.info['mediastate'] = 'transferring'
else:
self.meta['mediastate'] = 'available' if settings.USER_ID in users else 'unavailable'
self.info['mediastate'] = 'available' if settings.USER_ID in users else 'unavailable'
self.update_sort()
self.update_find()
self.update_lists()
@ -266,6 +269,15 @@ class Item(db.Model):
db.session.add(self)
db.session.commit()
def update_meta(self, data):
self.meta = data
self.update()
self.modified = datetime.now()
self.save()
user = state.user()
if user in self.users:
Changelog.record(user, 'edititem', self.id, data)
def update_mainid(self, key, id):
record = {}
if id:
@ -317,7 +329,7 @@ class Item(db.Model):
covers[self.id] = cover
if cover:
img = Image.open(StringIO(cover))
self.meta['coverRatio'] = img.size[0]/img.size[1]
self.info['coverRatio'] = img.size[0]/img.size[1]
for p in (':128', ':256', ':512'):
del covers['%s%s' % (self.id, p)]
return cover

View file

@ -73,10 +73,10 @@ def cover(id, size=None):
if size:
data = covers['%s:%s' % (id, size)] = resize_image(data, size=size)
data = str(data)
if not 'coverRatio' in item.meta:
if not 'coverRatio' in item.info:
#img = Image.open(StringIO(str(covers[id])))
img = Image.open(StringIO(data))
item.meta['coverRatio'] = img.size[0]/img.size[1]
item.info['coverRatio'] = img.size[0]/img.size[1]
db.session.add(item)
db.session.commit()
resp = make_response(data)

View file

@ -24,7 +24,11 @@ providers = [
('abebooks', 'isbn10')
]
def find(title, author=None, publisher=None, date=None):
def find(**kargs):
title = kargs.get('title')
author = kargs.get('author')
publisher = kargs.get('publisher')
date = kargs.get('date')
#results = google.find(title=title, author=author, publisher=publisher, date=date)
results = duckduckgo.find(title=title, author=author, publisher=publisher, date=date)
'''

View file

@ -38,7 +38,7 @@ def lookup(id):
title = mods.findall(ns + 'titleInfo')
if not title:
return {}
info['title'] = ''.join([e.text for e in title[0]])
info['title'] = ''.join([': ' + e.text.strip() if e.tag == ns + 'subTitle' else ' ' + e.text.strip() for e in title[0]]).strip()
origin = mods.findall(ns + 'originInfo')
if origin:
info['place'] = []
@ -70,6 +70,9 @@ def lookup(id):
if a.attrib.get('usage') == 'primary':
info['author'].append(' '.join([e.text for e in a.findall(ns + 'namePart') if not e.attrib.get('type') in ('date', )]))
info['author'] = [ox.normalize_name(a) for a in info['author']]
toc = mods.findall(ns + 'tableOfContents')
if toc:
info['description'] = toc[0].text.strip()
for key in info.keys():
if not info[key]:
del info[key]

View file

@ -5,12 +5,13 @@ from __future__ import division, with_statement
import inspect
import sys
import json
import logging
from flask import request, Blueprint
from .shortcuts import render_to_json_response, json_response
import logging
logger = logging.getLogger('oxflask.api')
app = Blueprint('oxflask', __name__)
@app.route('/api/', methods=['POST', 'OPTIONS'])