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
|
|
@ -1,7 +1,8 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
|
||||
from datetime import datetime
|
||||
import json
|
||||
import hashlib
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
|
@ -11,6 +12,7 @@ import db
|
|||
import json_pickler
|
||||
import settings
|
||||
import state
|
||||
import utils
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
@ -118,8 +120,10 @@ class User(db.Model):
|
|||
if not i.users:
|
||||
i.delete()
|
||||
Changelog.query.filter_by(user_id=self.id).delete()
|
||||
if self.id in settings.ui['showFolder']:
|
||||
del settings.ui['showFolder'][self.id]
|
||||
Metadata.query.filter_by(user_id=self.id).delete()
|
||||
if self.name in settings.ui['showFolder']:
|
||||
del settings.ui['showFolder'][self.name]
|
||||
settings.ui._save()
|
||||
self.save()
|
||||
if was_peering:
|
||||
Changelog.record(state.user(), 'removepeer', self.id)
|
||||
|
|
@ -318,3 +322,71 @@ class List(db.Model):
|
|||
def save(self):
|
||||
state.db.session.add(self)
|
||||
state.db.session.commit()
|
||||
|
||||
class Metadata(db.Model):
|
||||
__tablename__ = 'user_metadata'
|
||||
|
||||
created = sa.Column(sa.DateTime())
|
||||
modified = sa.Column(sa.DateTime())
|
||||
|
||||
id = sa.Column(sa.Integer(), primary_key=True)
|
||||
item_id = sa.Column(sa.String(32))
|
||||
user_id = sa.Column(sa.String(43), sa.ForeignKey('user.id'))
|
||||
data_hash = sa.Column(sa.String(40), index=True)
|
||||
data = sa.Column(MutableDict.as_mutable(sa.PickleType(pickler=json_pickler)))
|
||||
|
||||
def __repr__(self):
|
||||
return '{item}/{user}'.format(item=self.item_id, user=self.user_id)
|
||||
|
||||
@property
|
||||
def timestamp(self):
|
||||
return utils.datetime2ts(self.modified)
|
||||
|
||||
@classmethod
|
||||
def get(cls, user_id, item_id):
|
||||
return cls.query.filter_by(user_id=user_id,item_id=item_id).first()
|
||||
|
||||
@classmethod
|
||||
def get_or_create(cls, user_id, item_id, data=None, commit=True):
|
||||
m = cls.get(user_id=user_id, item_id=item_id)
|
||||
if not m:
|
||||
m = cls(user_id=user_id, item_id=item_id)
|
||||
m.created = datetime.utcnow()
|
||||
if data:
|
||||
m.data = data
|
||||
else:
|
||||
m.data = {}
|
||||
m.save(commit)
|
||||
elif data:
|
||||
m.edit(data, commit)
|
||||
return m
|
||||
|
||||
def save(self, commit=True):
|
||||
self.modified = datetime.utcnow()
|
||||
self.data_hash = hashlib.sha1(json.dumps(self.data, ensure_ascii=False, sort_keys=True).encode()).hexdigest()
|
||||
state.db.session.add(self)
|
||||
if commit:
|
||||
state.db.session.commit()
|
||||
|
||||
def edit(self, data, commit=True):
|
||||
changes = {}
|
||||
if 'isbn' in data and isinstance(data['isbn'], list):
|
||||
isbns = [utils.to_isbn13(isbn) for isbn in data['isbn']]
|
||||
isbns = [isbn for isbn in isbns if isbn]
|
||||
if isbn:
|
||||
data['isbn'] = isbn
|
||||
else:
|
||||
del data['isbn']
|
||||
for key in data:
|
||||
if key == 'id':
|
||||
continue
|
||||
if data[key] != self.data.get(key):
|
||||
self.data[key] = data[key]
|
||||
changes[key] = data[key]
|
||||
if changes:
|
||||
self.save(commit)
|
||||
return changes
|
||||
|
||||
def delete(self):
|
||||
state.db.session.delete(self)
|
||||
state.db.session.commit()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue