user per peer library (sqlitedict)

This commit is contained in:
j 2016-02-10 19:32:32 +05:30
commit 0ca89db3cd
11 changed files with 472 additions and 60 deletions

View file

@ -3,7 +3,6 @@
from datetime import datetime
import base64
import hashlib
import json
import os
import re
import shutil
@ -98,6 +97,13 @@ class Item(db.Model):
def find(cls, data):
return Parser(cls, user_items, Find, Sort).find(data)
@classmethod
def remove_many(cls, ids):
Find.query.filter(Find.item_id.in_(ids)).delete(synchronize_session=False)
Sort.query.filter(Sort.item_id.in_(ids)).delete(synchronize_session=False)
cls.query.filter(cls.id.in_(ids)).delete(synchronize_session=False)
state.db.session.expire_all()
def add_user(self, user):
if not user in self.users:
self.users.append(user)
@ -336,7 +342,7 @@ class Item(db.Model):
f.move()
def get_hash(self):
return utils.get_meta_hash(self.meta.copy())
return utils.get_meta_hash(self.meta)
def get_sorttitle(self):
title = self.meta.get('sorttitle')
@ -346,7 +352,6 @@ class Item(db.Model):
return title
def sync_metadata(self):
from user.models import Metadata
if self.meta.get('sharemetadata'):
return
peers = [u for u in self.users if u.id != settings.USER_ID]
@ -355,34 +360,44 @@ class Item(db.Model):
first_peer = None
# get first peer with sharemetadata set
for u in peers:
m = Metadata.get(u.id, self.id)
peer = utils.get_peer(u.id)
if self.id in peer.library:
m = peer.library[self.id].get('meta')
else:
m = None
if m:
if m.data.get('sharemetadata'):
sync_from = m
if m.get('sharemetadata'):
sync_from = u.id
break
if not first_peer:
first_peer = m
first_peer = u.id
# of fall back to first peer that has this item
# in case its not available locally
if not sync_from and self.info.get('mediastate') != 'available' and first_peer:
#logger.debug('syncing from first peer that has item %s', first_peer)
sync_from = first_peer
if sync_from:
if self.get_hash() != sync_from.data_hash:
logger.debug('update %s with metadata from %s', self, sync_from.user_id)
peer = utils.get_peer(sync_from)
data_hash = peer.get_metahash(self.id)
item = peer.library[self.id]
sync_meta = item['meta']
sync_modified = item.get('modified')
if self.get_hash() != data_hash:
logger.debug('update %s with metadata from %s', self, sync_from)
record = {}
for key in sync_from.data:
if key != 'sharemetadata' and self.meta.get(key) != sync_from.data[key]:
record[key] = self.meta[key] = sync_from.data[key]
for key in set(self.meta)-set(sync_from.data):
for key in sync_meta:
if key != 'sharemetadata' and self.meta.get(key) != sync_meta[key]:
record[key] = self.meta[key] = sync_meta[key]
for key in set(self.meta)-set(sync_meta):
record[key] = self.meta[key] = [] if key in self.array_keys else ''
self.update(sync_from.modified)
self.update(sync_modified)
self.save()
user = state.user()
if record and user in self.users:
Changelog.record(user, 'edititem', self.id, record, _ts=self.modified)
if 'cover' in record:
self.update_cover()
if state.tasks:
state.tasks.queue('getcover', self.id)
def extract_preview(self):
path = self.get_path()
@ -450,7 +465,7 @@ class Item(db.Model):
def update_icons(self):
if state.online:
self.update_cover()
else:
elif state.tasks:
state.tasks.queue('getcover', self.id)
self.update_preview()