store metadata per user. remove primaryid. only store isbn13
This commit is contained in:
parent
90648f9e65
commit
02e040d9f5
16 changed files with 245 additions and 192 deletions
|
|
@ -132,18 +132,8 @@ def edit(data):
|
|||
for id in ids:
|
||||
item = models.Item.get(id)
|
||||
if item and item.json()['mediastate'] == 'available':
|
||||
if 'primaryid' in data:
|
||||
if data['primaryid']:
|
||||
key, value = data['primaryid']
|
||||
logger.debug('update primaryid %s %s', key, value)
|
||||
value = cleanup_id(key, value)
|
||||
item.update_primaryid(key, value)
|
||||
else:
|
||||
item.update_primaryid()
|
||||
response = item.json()
|
||||
else:
|
||||
item.edit_metadata(data)
|
||||
response = item.json()
|
||||
item.edit(data)
|
||||
response = item.json()
|
||||
edited.append(id)
|
||||
else:
|
||||
logger.info('can only edit available items %s', id)
|
||||
|
|
@ -264,8 +254,6 @@ def getMetadata(data):
|
|||
for key in [k['id'] for k in settings.config['itemKeys'] if isinstance(k['type'], list)]:
|
||||
if key in response and not isinstance(response[key], list):
|
||||
response[key] = [response[key]]
|
||||
if response:
|
||||
response['primaryid'] = [key, value]
|
||||
return response
|
||||
actions.register(getMetadata)
|
||||
|
||||
|
|
|
|||
|
|
@ -121,11 +121,14 @@ class Item(db.Model):
|
|||
#j['users'] = list(map(str, list(self.users)))
|
||||
|
||||
if self.info:
|
||||
j.update(self.info)
|
||||
for key in self.info:
|
||||
if (not keys or key in keys) and key not in self.meta_keys:
|
||||
j[key] = self.info[key]
|
||||
|
||||
if self.meta:
|
||||
j.update(self.meta)
|
||||
|
||||
for key in self.id_keys + ['primaryid']:
|
||||
for key in self.id_keys:
|
||||
if key not in self.meta and key in j:
|
||||
del j[key]
|
||||
if keys:
|
||||
|
|
@ -220,7 +223,7 @@ class Item(db.Model):
|
|||
for f in Find.query.filter_by(item_id=self.id).filter(Find.key.notin_(keys)):
|
||||
state.db.session.delete(f)
|
||||
|
||||
def update(self):
|
||||
def update(self, modified=None):
|
||||
for key in ('mediastate', 'coverRatio', 'previewRatio'):
|
||||
if key in self.meta:
|
||||
if key not in self.info:
|
||||
|
|
@ -233,17 +236,12 @@ class Item(db.Model):
|
|||
self.info['mediastate'] = 'transferring'
|
||||
else:
|
||||
self.info['mediastate'] = 'available' if settings.USER_ID in users else 'unavailable'
|
||||
if 'primaryid' in self.meta:
|
||||
# self.meta.update does not trigger db update!
|
||||
m = Metadata.load(*self.meta['primaryid'])
|
||||
for key in m:
|
||||
if key == 'id':
|
||||
continue
|
||||
self.meta[key] = m[key]
|
||||
self.modified = datetime.utcnow()
|
||||
if modified:
|
||||
self.modified = modified
|
||||
else:
|
||||
self.modified = datetime.utcnow()
|
||||
self.update_sort()
|
||||
self.update_find()
|
||||
#self.modified = datetime.utcnow()
|
||||
self.save()
|
||||
|
||||
def save(self):
|
||||
|
|
@ -260,14 +258,18 @@ class Item(db.Model):
|
|||
|
||||
meta_keys = (
|
||||
'author',
|
||||
'classification',
|
||||
'categories',
|
||||
'cover',
|
||||
'date',
|
||||
'description',
|
||||
'edition',
|
||||
'isbn',
|
||||
'language',
|
||||
'pages',
|
||||
'place',
|
||||
'publisher',
|
||||
'series',
|
||||
'tableofcontents',
|
||||
'title'
|
||||
)
|
||||
|
||||
|
|
@ -285,64 +287,17 @@ class Item(db.Model):
|
|||
del self.meta[key]
|
||||
update = True
|
||||
if update:
|
||||
self.update()
|
||||
if not modified:
|
||||
modified = datetime.utcnow()
|
||||
self.modified = modified
|
||||
self.update(modified)
|
||||
self.save()
|
||||
if 'cover' in record:
|
||||
self.update_icons()
|
||||
user = state.user()
|
||||
if record and user in self.users:
|
||||
Changelog.record_ts(user, modified, 'edititem', self.id, record)
|
||||
|
||||
def update_primaryid(self, key=None, id=None, scrape=True, modified=None):
|
||||
if key is None and id is None:
|
||||
if 'primaryid' not in self.meta:
|
||||
return
|
||||
else:
|
||||
key = self.meta['primaryid'][0]
|
||||
record = {}
|
||||
if id:
|
||||
if not key in self.meta or not key in self.meta[key]:
|
||||
self.meta[key] = list(set([id] + self.meta.get(key, [])))
|
||||
self.meta['primaryid'] = [key, id]
|
||||
record[key] = id
|
||||
else:
|
||||
if key in self.meta:
|
||||
del self.meta[key]
|
||||
if 'primaryid' in self.meta:
|
||||
del self.meta['primaryid']
|
||||
record[key] = ''
|
||||
for k in self.id_keys:
|
||||
if k != key:
|
||||
if k in self.meta:
|
||||
del self.meta[k]
|
||||
logger.debug('set primaryid %s %s', key, id)
|
||||
|
||||
# get metadata from external resources
|
||||
if scrape:
|
||||
self.scrape()
|
||||
self.update_icons()
|
||||
if not modified:
|
||||
modified = datetime.utcnow()
|
||||
self.modified = modified
|
||||
self.save()
|
||||
#if not scrape:
|
||||
# Scrape.get_or_create(self.id)
|
||||
for f in self.files.all():
|
||||
f.move()
|
||||
user = state.user()
|
||||
if user in self.users:
|
||||
Changelog.record_ts(user, modified, 'edititem', self.id, record)
|
||||
|
||||
def edit_metadata(self, data):
|
||||
def edit(self, data, modified=None):
|
||||
Scrape.query.filter_by(item_id=self.id).delete()
|
||||
if 'primaryid' in self.meta:
|
||||
logger.debug('m: %s', self.meta['primaryid'])
|
||||
m = Metadata.get_or_create(*self.meta['primaryid'])
|
||||
if m.edit(data):
|
||||
self.update()
|
||||
else:
|
||||
self.update_meta(data)
|
||||
self.update_meta(data, modified)
|
||||
for f in self.files.all():
|
||||
f.move()
|
||||
|
||||
|
|
@ -388,23 +343,19 @@ class Item(db.Model):
|
|||
for resolution in (128, 256, 512):
|
||||
del icons['%s:%s' % (key, resolution)]
|
||||
|
||||
def scrape(self):
|
||||
primaryid = self.meta.get('primaryid')
|
||||
logger.debug('scrape %s', primaryid)
|
||||
if primaryid:
|
||||
try:
|
||||
m = meta.lookup(*primaryid)
|
||||
except:
|
||||
logger.debug('meta.lookup %s failed:', primaryid, exc_info=True)
|
||||
m = None
|
||||
if m:
|
||||
m['primaryid'] = primaryid
|
||||
self.meta = m
|
||||
self.modified = datetime.utcnow()
|
||||
self.update()
|
||||
return True
|
||||
return False
|
||||
return True
|
||||
def load_metadata(self):
|
||||
'''
|
||||
load metadata from user_metadata or get via isbn?
|
||||
'''
|
||||
for key in self.meta_keys:
|
||||
if key not in self.meta and key in self.info:
|
||||
self.meta[key] = self.info[key]
|
||||
#FIXME get from user_meta
|
||||
if state.online:
|
||||
if 'isbn' in self.meta:
|
||||
data = meta.lookup('isbn', self.meta['isbn'])
|
||||
if data:
|
||||
self.meta.update(data)
|
||||
|
||||
def queue_download(self):
|
||||
u = state.user()
|
||||
|
|
|
|||
|
|
@ -46,23 +46,14 @@ def add_file(id, f, prefix, from_=None):
|
|||
data = media.metadata(f, from_)
|
||||
file = File.get_or_create(id, data, path)
|
||||
item = file.item
|
||||
if 'primaryid' in file.info:
|
||||
del file.info['primaryid']
|
||||
state.db.session.add(file)
|
||||
if 'primaryid' in item.info:
|
||||
item.meta['primaryid'] = item.info.pop('primaryid')
|
||||
state.db.session.add(item)
|
||||
item.add_user(user)
|
||||
Changelog.record(user, 'additem', item.id, file.info)
|
||||
item.added = datetime.utcnow()
|
||||
if state.online:
|
||||
item.scrape()
|
||||
#Changelog.record(user, 'edititem', item.id, dict([item.meta['primaryid']]))
|
||||
item.load_metadata()
|
||||
Changelog.record(user, 'additem', item.id, file.info)
|
||||
Changelog.record(user, 'edititem', item.id, item.meta)
|
||||
item.update_icons()
|
||||
item.modified = datetime.utcnow()
|
||||
item.update()
|
||||
#Scrape.get_or_create(item.id)
|
||||
return file
|
||||
|
||||
def run_scan():
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue