def remove(self): if not self._query: for i in self.items: self.items.remove(i) if not self._query: if self.user_id == settings.USER_ID and self.name != '': Changelog.record(self.user, 'removelist', self.name) state.db.session.delete(self) state.db.session.commit()
def remove_items(self, items): from item.models import Item for item_id in items: i = Item.get(item_id) if i in self.items: self.items.remove(i) i.update() state.db.session.add(self) state.db.session.commit() if self.user_id == settings.USER_ID and self.name != '': Changelog.record(self.user, 'removelistitems', self.name, items) self.user.clear_smart_list_cache() self.user.clear_list_cache()
def edit(self, data): changed = {} for key in data: if key == 'id': continue if data[key] != self.data.get(key): self.data[key] = data[key] changed[key] = data[key] if changed: self.save() user = state.user() Changelog.record(user, 'editmeta', self.key, self.value, changed) return changed
def add_items(self, items): from item.models import Item for item_id in items: i = Item.get(item_id) if i: self.items.append(i) if self.user_id == settings.USER_ID: i.queue_download() i.update() state.db.session.add(self) state.db.session.commit() if self.user_id == settings.USER_ID and self.name != '': Changelog.record(self.user, 'addlistitems', self.name, items) self.user.clear_smart_list_cache() self.user.clear_list_cache()
def create(cls, user_id, name, query=None): prefix = name n = 2 while cls.get(user_id, name): name = '%s [%s]' % (prefix, n) n += 1 l = cls(user_id=user_id, name=name) l._query = query l.type = 'smart' if l._query else 'static' l.index_ = cls.query.filter_by(user_id=user_id).count() state.db.session.add(l) state.db.session.commit() if user_id == settings.USER_ID: if not l._query and name != '': Changelog.record(state.user(), 'addlist', l.name) return l
def remove_file(self): for f in self.files.all(): path = f.fullpath() if os.path.exists(path): os.unlink(path) remove_empty_folders(os.path.dirname(path)) state.db.session.delete(f) user = state.user() if user in self.users: self.users.remove(user) for l in self.lists.filter_by(user_id=user.id): l.items.remove(self) state.db.session.commit() if not self.users: self.delete() else: self.update() Transfer.query.filter_by(item_id=self.id).delete() Changelog.record(user, 'removeitem', self.id)
def sortLists(data): """ takes { ids } """ n = 0 logger.debug("sortLists %s", data) lists = [] for id in data["ids"]: l = models.List.get(id) l.index_ = n n += 1 if l.type == "static": lists.append(l.name) state.db.session.add(l) state.db.session.commit() if lists: Changelog.record(state.user(), "orderlists", lists) return {}
def update_meta(self, data): update = False record = {} for key in self.meta_keys: if key in data: if self.meta.get(key) != data[key]: record[key] = data[key] self.meta[key] = data[key] update = True for key in list(self.meta): if key not in self.meta_keys: del self.meta[key] update = True if update: self.update() self.modified = datetime.utcnow() self.save() user = state.user() if record and user in self.users: Changelog.record(user, 'edititem', self.id, record)
def sortLists(data): ''' takes { ids } ''' n = 0 logger.debug('sortLists %s', data) lists = [] for id in data['ids']: l = models.List.get(id) l.index_ = n n += 1 if l.type == 'static': lists.append(l.name) state.db.session.add(l) state.db.session.commit() if lists: Changelog.record(state.user(), 'orderlists', lists) return {}
def save_file(self, content): u = state.user() f = File.get(self.id) content_id = media.get_id(data=content) if content_id != self.id: logger.debug('INVALID CONTENT %s vs %s', self.id, content_id) return False if not f: path = 'Downloads/%s.%s' % (self.id, self.info['extension']) info = self.info.copy() for key in ('mediastate', 'coverRatio', 'previewRatio'): if key in info: del info[key] f = File.get_or_create(self.id, info, path=path) path = self.get_path() if not os.path.exists(path): ox.makedirs(os.path.dirname(path)) with open(path, 'wb') as fd: fd.write(content) if u not in self.users: self.add_user(u) t = Transfer.get_or_create(self.id) t.progress = 1 t.save() self.added = datetime.utcnow() Changelog.record(u, 'additem', self.id, f.info) self.update() f.move() self.update_icons() self.save() trigger_event('transfer', { 'id': self.id, 'progress': 1 }) return True else: logger.debug('TRIED TO SAVE EXISTING FILE!!!') t = Transfer.get_or_create(self.id) t.progress = 1 t.save() self.update() return False
def update_peering(self, peered, username=None): was_peering = self.peered if peered: logging.debug('update_peering, pending: %s queued: %s', self.pending, self.queued) self.queued = self.pending != 'sent' self.pending = '' if username: self.info['username'] = username self.update_name() # FIXME: need to set peered to False to not trigger changelog event # before other side receives acceptPeering request self.peered = False self.save() if not was_peering: Changelog.record(state.user(), 'addpeer', self.id, self.nickname) self.peered = True self.save() else: self.pending = '' self.peered = False self.queued = False self.update_name() self.save() List.query.filter_by(user_id=self.id).delete() for i in self.items: i.users.remove(self) 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] self.clear_list_cache() self.save() if was_peering: Changelog.record(state.user(), 'removepeer', self.id) self.save()
def editList(data): ''' takes { id name query } ''' logger.debug('editList %s', data) l = models.List.get_or_create(data['id']) name = l.name if 'name' in data: l.name = data['name'] if 'query' in data and l.type != 'smart': raise Exception('query only for smart lists') if 'query' in data and l.type == 'smart': validate_query(data['query']) l._query = data['query'] if l.type == 'static' and name != l.name: Changelog.record(state.user(), 'editlist', name, {'name': l.name}) l.save() l.user.clear_smart_list_cache() return l.json()
def editList(data): """ takes { id name query } """ logger.debug("editList %s", data) l = models.List.get_or_create(data["id"]) name = l.name if "name" in data: l.name = data["name"] if "query" in data and l.type != "smart": raise Exception("query only for smart lists") if "query" in data and l.type == "smart": validate_query(data["query"]) l._query = data["query"] if l.type == "static" and name != l.name: Changelog.record(state.user(), "editlist", name, {"name": l.name}) l.save() l.user.clear_smart_list_cache() return l.json()
def update_primaryid(self, key=None, id=None, scrape=True): 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() self.modified = datetime.utcnow() 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(user, 'edititem', self.id, record)
def add_file(id, f, prefix, from_=None): user = state.user() path = f[len(prefix) :] 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']])) 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 add_file(id, f, prefix, from_=None): user = state.user() path = f[len(prefix):] 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']])) 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 reset(self): user = state.user() Changelog.record(user, 'resetmeta', self.key, self.value) state.db.session.delete(self) state.db.session.commit() self.update_items()