diff --git a/ctl b/ctl index ff627d7..c25e6aa 100755 --- a/ctl +++ b/ctl @@ -1,5 +1,5 @@ #!/usr/bin/env bash -HOST="127.0.0.1:9842" +HOST="[::1]:9842" NAME="openmedialibrary" PID="/tmp/$NAME.pid" diff --git a/oml/changelog.py b/oml/changelog.py index 6a13f9b..e96d6b7 100644 --- a/oml/changelog.py +++ b/oml/changelog.py @@ -188,7 +188,7 @@ class Changelog(db.Model): l.add_items(ids) return True - def action_removelistitem(self, user, timestamp, name, ids): + def action_removelistitems(self, user, timestamp, name, ids): from user.models import List l = List.get(user.id, name) if l: @@ -205,7 +205,7 @@ class Changelog(db.Model): user.save() return True - def action_adduser(self, user, timestamp, peerid, username): + def action_addpeer(self, user, timestamp, peerid, username): from user.models import User if not 'users' in user.info: user.info['users'] = {} @@ -215,7 +215,7 @@ class Changelog(db.Model): #fixme, add username to user? return True - def action_removeuser(self, user, timestamp, peerid): + def action_removepeer(self, user, timestamp, peerid): if 'users' in user.info and peerid in user.info['users']: del user.info['users'][peerid] user.save() diff --git a/oml/item/api.py b/oml/item/api.py index 5e42e20..c8ca11a 100644 --- a/oml/item/api.py +++ b/oml/item/api.py @@ -172,11 +172,7 @@ def download(request): data = json.loads(request.form['data']) if 'data' in request.form else {} item = models.Item.get(data['id']) if item: - item.transferprogress = 0 - item.transferadded = datetime.now() - p = models.User.get(settings.USER_ID) - if p not in item.users: - item.users.append(p) + item.queue_download() item.update() response = {'status': 'queued'} return response @@ -190,9 +186,11 @@ def cancelDownload(request): if item: item.transferprogress = None item.transferadded = None - p = models.User.get(settings.USER_ID) + p = state.user() if p in item.users: item.users.remove(p) + for l in item.lists.filter_by(user_id=settings.USER_ID): + l.remove(item) item.update() response = {'status': 'cancelled'} return response diff --git a/oml/item/models.py b/oml/item/models.py index a53931f..0febda0 100644 --- a/oml/item/models.py +++ b/oml/item/models.py @@ -22,6 +22,7 @@ from person import get_sort_name import media from meta import scraper +import state import utils from oxflask.db import MutableDict @@ -204,8 +205,8 @@ class Item(db.Model): if key.get('find') or key.get('filter'): value = self.json().get(key['id'], None) if key.get('filterMap') and value: - value = re.compile(key.get('filterMap')).findall(value)[0] - print key['id'], value + value = re.compile(key.get('filterMap')).findall(value) + if value: value = value[0] if value: if isinstance(value, list): Find.query.filter_by(item_id=self.id, key=key['id']).delete() @@ -326,9 +327,20 @@ class Item(db.Model): print 'FIX UPDATE', mainid self.update() + def queue_download(self): + u = state.user() + if not u in self.users: + self.transferprogress = 0 + self.transferadded = datetime.now() + self.users.append(u) + def save_file(self, content): - p = User.get(settings.USER_ID) + u = state.user() f = File.get(self.id) + content_id = media.get_id(data=content) + if content_id != self.id: + print 'INVALID CONTENT', self.id, 'vs', content_id + return False if not f: path = 'Downloads/%s.%s' % (self.id, self.info['extension']) f = File.get_or_create(self.id, self.info, path=path) @@ -337,11 +349,11 @@ class Item(db.Model): ox.makedirs(os.path.dirname(path)) with open(path, 'wb') as fd: fd.write(content) - if p not in self.users: - self.users.append(p) + if u not in self.users: + self.users.append(u) self.transferprogress = 1 self.added = datetime.now() - Changelog.record(p, 'additem', self.id, self.info) + Changelog.record(u, 'additem', self.id, self.info) self.update() trigger_event('transfer', { 'id': self.id, 'progress': 1 diff --git a/oml/localnodes.py b/oml/localnodes.py index 4d7553e..5aabbda 100644 --- a/oml/localnodes.py +++ b/oml/localnodes.py @@ -27,7 +27,7 @@ class LocalNodes(Thread): _BROADCAST = "ff02::1" _PORT = 9851 - TTL = 2 + TTL = 1 def __init__(self, app): self._app = app diff --git a/oml/media/__init__.py b/oml/media/__init__.py index d8b73dd..20fa6a0 100644 --- a/oml/media/__init__.py +++ b/oml/media/__init__.py @@ -1,12 +1,23 @@ +# -*- coding: utf-8 -*- +# vi:si:et:sw=4:sts=4:ts=4 +from __future__ import division + +import base64 +import hashlib +import os + +import ox + import pdf import epub import txt -import os -import base64 -import ox -def get_id(f): - return base64.b32encode(ox.sha1sum(f).decode('hex')) +def get_id(f=None, data=None): + if data: + return base64.b32encode(hashlib.sha1(data).digest()) + else: + return base64.b32encode(ox.sha1sum(f).decode('hex')) + def metadata(f): ext = f.split('.')[-1] diff --git a/oml/node/api.py b/oml/node/api.py index 2b83c95..250d4e3 100644 --- a/oml/node/api.py +++ b/oml/node/api.py @@ -79,9 +79,18 @@ def api_rejectPeering(app, user_id, message): def api_removePeering(app, user_id, message): user = User.get(user_id) if user: - user.peered = False user.info['message'] = message - user.save() - trigger_event('peering', {'id': user.id, 'peered': user.peered}) + user.update_peering(False) + trigger_event('peering', user.json()) + return True + return False + +def api_cancelPeering(app, user_id, message): + user = User.get(user_id) + if user: + user.info['message'] = message + user.update_peering(False) + trigger_event('peering', user.json()) + user.peered = False return True return False diff --git a/oml/nodes.py b/oml/nodes.py index b92d1d6..773a14a 100644 --- a/oml/nodes.py +++ b/oml/nodes.py @@ -169,12 +169,22 @@ class Node(object): r = self.request('rejectPeering', message) p = self.user p.update_peering(False) + self.go_online() return True def removePeering(self, message): + print 'remove peering!!!', self.user r = self.request('removePeering', message) p = self.user p.update_peering(False) + self.go_online() + return True + + def cancelPeering(self, message): + r = self.request('cancelPeering', message) + p = self.user + p.update_peering(False) + self.go_online() return True def download(self, item): diff --git a/oml/user/api.py b/oml/user/api.py index 39049f4..0a9fbd7 100644 --- a/oml/user/api.py +++ b/oml/user/api.py @@ -210,3 +210,12 @@ def removePeering(request): state.nodes.queue(p.id, 'removePeering', data.get('message', '')) return {} actions.register(removePeering, cache=False) + +@returns_json +def cancelPeering(request): + data = json.loads(request.form['data']) if 'data' in request.form else {} + p = models.User.get_or_create(data['id']) + state.nodes.queue('add', p.id) + state.nodes.queue(p.id, 'cancelPeering', data.get('message', '')) + return {} +actions.register(cancelPeering, cache=False) diff --git a/oml/user/models.py b/oml/user/models.py index 9ce7379..4bfb6f8 100644 --- a/oml/user/models.py +++ b/oml/user/models.py @@ -72,9 +72,11 @@ class User(db.Model): self.info['username'] = username self.set_nickname(self.info.get('username', 'anonymous')) + Changelog.record(state.user(), 'addpeer', self.id, self.nickname) else: self.peered = False self.nickname = None + self.save() for i in self.items: i.users.remove(self) if not i.users: @@ -82,6 +84,8 @@ class User(db.Model): db.session.delete(i) else: i.update_lists() + Changelog.query.filter_by(user_id=self.id).delete() + Changelog.record(state.user(), 'removepeer', self.id) self.save() def set_nickname(self, nickname): @@ -159,6 +163,7 @@ class List(db.Model): for item_id in items: i = Item.get(item_id) self.items.append(i) + i.queue_download() i.update() db.session.add(self) db.session.commit() diff --git a/static/js/backButton.js b/static/js/backButton.js index 7960300..fdd7ab3 100644 --- a/static/js/backButton.js +++ b/static/js/backButton.js @@ -7,7 +7,7 @@ oml.ui.backButton = function() { that = Ox.Button({ style: 'squared', title: 'arrowLeft', - tooltip: Ox._('Back to Books'), + tooltip: Ox._('Back to Books {0}', [Ox.UI.symbols.control + 'W']), type: 'image' }) .css({ diff --git a/static/js/deleteListDialog.js b/static/js/deleteListDialog.js new file mode 100644 index 0000000..8dcbf1f --- /dev/null +++ b/static/js/deleteListDialog.js @@ -0,0 +1,38 @@ +'use strict'; + +oml.ui.deleteListDialog = function() { + + var ui = oml.user.ui, + + that = oml.ui.confirmDialog({ + buttons: [ + Ox.Button({ + title: Ox._('No, Keep List') + }), + Ox.Button({ + title: Ox._('Yes, Delete List') + }) + ], + content: Ox._('Are you sure you want to delete this list?'), + title: Ox._('Delete List') + }, function() { + oml.api.removeList({ + id: ui._list + }, function() { + oml.UI.set({ + find: { + conditions: [{ + key: 'list', + operator: '==', + value: ':' + }], + operator: '&' + } + }); + oml.updateLists(); + }); + }); + + return that; + +}; \ No newline at end of file diff --git a/static/js/findElement.js b/static/js/findElement.js index dd400a1..d91f05f 100644 --- a/static/js/findElement.js +++ b/static/js/findElement.js @@ -37,11 +37,11 @@ oml.ui.findElement = function() { .bindEvent({ change: function(data) { if (data.value == 'advanced') { + oml.$ui.mainMenu.checkItem('findMenu_find_' + previousFindKey); that.updateElement(); - //oml.$ui.mainMenu.checkItem('findMenu_find_' + previousFindKey); oml.$ui.filterDialog = oml.ui.filterDialog().open(); } else { - //oml.$ui.mainMenu.checkItem('findMenu_find_' + data.value); + oml.$ui.mainMenu.checkItem('findMenu_find_' + data.value); oml.$ui.findInput.options({ autocomplete: getAutocomplete(), placeholder: '' diff --git a/static/js/folders.js b/static/js/folders.js index 00957c6..afc884e 100644 --- a/static/js/folders.js +++ b/static/js/folders.js @@ -77,7 +77,7 @@ oml.ui.folders = function() { collapsed: false, extras: [ oml.ui.statusIcon( - !oml.user.online ? 'unknown' + !oml.user.online && index ? 'unknown' : user.online ? 'connected' : 'disconnected' ), @@ -179,14 +179,14 @@ oml.ui.folders = function() { oml.$ui.folderList[index] = oml.ui.folderList({ draggable: !!index, items: items, - sortable: true + sortable: !index }) .bindEvent({ add: function() { !index && oml.addList(); }, 'delete': function() { - !index && oml.deleteList(); + !index && oml.ui.deleteListDialog().open(); }, key_control_d: function() { oml.addList(ui._list); @@ -224,11 +224,6 @@ oml.ui.folders = function() { oml.UI.set({find: getFind(libraryId)}); } }) - .bindEvent(function(data, event) { - if (!index) { - Ox.print('LIST EVENT', event, data); - } - }) .css({height: items.length * 16 + 'px'}) .appendTo($content) ); diff --git a/static/js/gridView.js b/static/js/gridView.js index f0fce27..ccb5da7 100644 --- a/static/js/gridView.js +++ b/static/js/gridView.js @@ -20,9 +20,6 @@ oml.ui.gridView = function() { ? (data.author || '') : data[sortKey] ); size = size || 128; - Ox.print('WTF', '-webkit-linear-gradient(top, ' + color.slice(2).map(function(rgba) { - return 'rgba(' + rgba.join(', ') + ')'; - }).join(', ') + ')'); return { extra: ui.showFileInfo ? $('