diff --git a/oml/db.py b/oml/db.py index 01f2574..c2b19ad 100644 --- a/oml/db.py +++ b/oml/db.py @@ -116,7 +116,7 @@ def drop_columns(table, columns): } create_table = get_create_table(table) for column in columns: - create_table = re.sub('(%s .*?,)'%column, '', create_table) + create_table = re.sub('(%s .*?,)' % column, '', create_table) create_table = create_table.replace('\n', '').replace(',', ',\n') create_table = re.sub('\n *', '\n ', create_table).replace('( ', '(\n ') sql = [ diff --git a/oml/item/api.py b/oml/item/api.py index 6bd441c..0fd7a6a 100644 --- a/oml/item/api.py +++ b/oml/item/api.py @@ -9,7 +9,7 @@ from sqlalchemy.sql.expression import text from sqlalchemy import func from oxtornado import actions -import utils #utils must be imported before websocket to avoid loop +import utils # utils must be imported before websocket to avoid loop from websocket import trigger_event import meta from . import models diff --git a/oml/item/scan.py b/oml/item/scan.py index 632da9c..950c2fd 100644 --- a/oml/item/scan.py +++ b/oml/item/scan.py @@ -132,21 +132,57 @@ def run_scan(): prefix = get_prefix() books = collect_books(prefix) remove_missing(books) + ids = set() added = 0 + with db.session(): + user = state.user() for f in ox.sorted_strings(books): if state.shutdown: break if os.path.exists(f): id = media.get_id(f) file = File.get(id) + if id in ids: + logger.debug('file exists in multiple locations %s', id) + if file: + f1 = file.fullpath() + f2 = os.path.join(prefix, f) + if f1 != f2 and os.path.exists(f1) and os.path.exists(f2): + logger.debug('"%s" vs "%s"', f1, f2) + else: + ids.add(id) + if not file: file = add_file(id, f, prefix, f) added += 1 + elif user not in file.item.users: + item = file.item + item.add_user(user) + logger.debug('add %s to local user', id) + add_record('additem', item.id, file.info) + add_record('edititem', item.id, item.meta) + item.update() + added += 1 + library_items = len(user.library.items) if added: trigger_event('change', {}) logger.debug('imported %s unknown books', added) + if len(ids) != len(books): + logger.debug('number of books %s vs number of ids %s', len(books), len(ids)) + if library_items != len(books): + logger.debug('number of books %s vs number of items in library %s', len(books), library_items) + library_items = set([str(i) for i in user.library.items]) + gone = library_items - ids + if gone: + logger.debug('cleaning up %s deleted records', len(gone)) + for id in gone: + i = Item.get(id) + i.remove_file() + missing = ids - library_items + if missing: + logger.debug('%s items in library without a record', len(missing)) def change_path(old, new): new_books = os.path.join(new, 'Books') diff --git a/oml/library.py b/oml/library.py index 5590944..d61398f 100644 --- a/oml/library.py +++ b/oml/library.py @@ -93,7 +93,7 @@ class Peer(object): elif action == 'edititem': itemid, meta = args item = self.library.get(itemid, {}) - if not 'meta' in item: + if 'meta' not in item: item['meta'] = meta else: item['meta'].update(meta) @@ -111,7 +111,7 @@ class Peer(object): name = args[0] if len(args) > 1: query = args[1] - if not name in self.info['lists']: + if name not in self.info['lists']: self.info['lists'][name] = [] elif action == 'editlist': name, new = args @@ -127,7 +127,7 @@ class Peer(object): del self.info['lists'][name] elif action == 'addlistitems': name, ids = args - if not name in self.info['lists']: + if name not in self.info['lists']: self.info['lists'][name] = [] self.info['lists'][name] = list(set(self.info['lists'][name]) | set(ids)) elif action == 'removelistitems': @@ -141,14 +141,14 @@ class Peer(object): # fixme, just trigger peer update here from user.models import User peer = User.get_or_create(peerid) - if not 'username' in peer.info: + if 'username' not in peer.info: peer.info['username'] = username peer.update_name() peer.save() elif action == 'editpeer': peerid, data = args if len(peerid) == 16: - if not peerid in self.info['peers']: + if peerid not in self.info['peers']: self.info['peers'][peerid] = {} for key in ('username', 'contact'): if key in data: diff --git a/oml/nodes.py b/oml/nodes.py index ab6fc46..d16b402 100644 --- a/oml/nodes.py +++ b/oml/nodes.py @@ -567,7 +567,7 @@ class Nodes(Thread): node.join() if self.local: self.local.close() - return Thread.join(self) + return super().join(1) def publish_node(): update_online() diff --git a/oml/pdict.py b/oml/pdict.py index bd20b3e..a648d24 100644 --- a/oml/pdict.py +++ b/oml/pdict.py @@ -21,7 +21,7 @@ class pdict(dict): json.dump(self, fd, indent=4, sort_keys=True, ensure_ascii=False) def get(self, key, default=None): - if default == None and self._defaults: + if default is None and self._defaults: default = self._defaults.get(key) return dict.get(self, key, default)