diff --git a/deluge/core/filtermanager.py b/deluge/core/filtermanager.py index b5a23272d..46eef7450 100644 --- a/deluge/core/filtermanager.py +++ b/deluge/core/filtermanager.py @@ -48,7 +48,6 @@ def filter_keyword(torrent_ids, values): def filter_state_active(self, torrent_ids, value): pass - class FilterManager(component.Component): """FilterManager @@ -60,7 +59,10 @@ class FilterManager(component.Component): self.torrents = core.torrents self.registered_filters = {} self.register_filter("keyword", filter_keyword) - self.filter_tree_fields = ["state","tracker_host"] + self.tree_fields = {} + + self.register_tree_field("state", self._init_state_tree) + self.register_tree_field("tracker_host") def filter_torrent_ids(self, filter_dict): """ @@ -101,30 +103,45 @@ class FilterManager(component.Component): return torrent_ids - def register_filter(self, id, filter_func, filter_value = None): - self.registered_filters[id] = filter_func - - def deregister_filter(self, id): - del self.registered_filters[id] - def get_filter_tree(self): """ returns {field: [(value,count)] } for use in sidebar. """ torrent_ids = self.torrents.get_torrent_list() - items = dict( (field,{}) for field in self.filter_tree_fields) status_func = self.core.export_get_torrent_status #premature optimalisation.. + tree_keys = self.tree_fields.keys() + items = dict( (field, init_func()) for field, init_func in self.tree_fields.iteritems()) - items["state"]["All"] = len(torrent_ids) - + #count status fields. for torrent_id in list(torrent_ids): - status = status_func(torrent_id, self.filter_tree_fields) #status={key:value} - for field in self.filter_tree_fields: + status = status_func(torrent_id, tree_keys) #status={key:value} + for field in tree_keys: value = status[field] items[field][value] = items[field].get(value, 0) + 1 - for field in self.filter_tree_fields: + for field in tree_keys: items[field] = sorted(items[field].iteritems()) return items + + def _init_state_tree(self): + return {"All":len(self.torrents.get_torrent_list()), + "Downloading":0, + "Seeding":0, + "Paused":0, + "Checking":0, + "Queued":0, + "Error":0} + + def register_filter(self, id, filter_func, filter_value = None): + self.registered_filters[id] = filter_func + + def deregister_filter(self, id): + del self.registered_filters[id] + + def register_tree_field(self, field, init_func = lambda : {}): + self.tree_fields[field] = init_func + + def deregister_tree_field(self, field): + del self.tree_fields[field] diff --git a/deluge/plugins/label/label/core.py b/deluge/plugins/label/label/core.py index 4fc9d5228..4eec6af63 100644 --- a/deluge/plugins/label/label/core.py +++ b/deluge/plugins/label/label/core.py @@ -37,7 +37,7 @@ adds a status field for tracker. from deluge.log import LOG as log from deluge.plugins.corepluginbase import CorePluginBase from deluge.configmanager import ConfigManager - +import deluge.component as component from urlparse import urlparse import traceback @@ -111,6 +111,10 @@ class Core(CorePluginBase): #todo: register to torrent_added event. self.plugin.register_hook("post_torrent_add", self.post_torrent_add) self.plugin.register_hook("post_torrent_remove", self.post_torrent_remove) + + #register tree: + component.get("FilterManager").register_tree_field("label") + log.debug("Label plugin enabled..") def disable(self): @@ -168,131 +172,9 @@ class Core(CorePluginBase): if changed: self.config.save() - - ## Filters ## - def filter_state(self, torrents, value): - "in/out: a list of torrent objects." - for t in torrents: - log.debug("s=%s" % t.state) - return [t for t in torrents if t.state == value] - - def filter_tracker(self, torrents, value): - "in/out: a list of torrent objects." - return [t for t in torrents if t.get_tracker_host() == value] - - def filter_label(self, torrents, value): - "in/out: a list of torrent objects." - if value == NO_LABEL: - value = None - log.debug("NO_LABEL") - return [t for t in torrents if self.torrent_labels.get(t.torrent_id) == value] - - def filter_keyword(self, torrents, value): - value = value.lower().strip() - "in/out: a list of torrent objects." - return [t for t in torrents if value in t.filename.lower()] - - ## Items ## - def get_state_filter_items(self): - states = dict([(state, 0) for state in KNOWN_STATES]) - state_order = list(KNOWN_STATES) - - #state-simple: - for t in self.torrents.values(): - if not t.state in state_order: - state_order.append(t.state) - states[t.state] = 0 - states[t.state] +=1 - #specialized-state: - #todo: traffic. - - if self.config["hide_zero_hits"]: - for state in set(KNOWN_STATES): - #log.debug(states.keys()) - if states[state] == 0 : - #del states[state] - state_order.remove(state) - - #return the filters sorted by STATES + add unknown states. - return ([("All",len(self.torrents))] + - [(state, states[state]) for state in state_order] - ) - - def get_tracker_filter_items(self): - #trackers: - trackers = {} - for t in self.torrents.values(): - tracker = t.get_tracker_host() - if not tracker in trackers: - trackers[tracker] = 0 - trackers[tracker] +=1 - - return [(tracker , trackers[tracker]) for tracker in sorted(trackers.keys())] - - def get_label_filter_items(self): - no_label = 0 - labels = dict([(label_id, 0) for label_id in self.labels]) - for torrent_id in self.torrents: - label_id = self.torrent_labels.get(torrent_id) - if label_id: - labels[label_id] +=1 - else: - no_label +=1 - - #show all labels,even if hide-zero-hits is true - """ - if self.config["hide_zero_hits"]: - for label , count in list(labels.iteritems()): - if count == 0: - del labels[label] - """ - - return [(NO_LABEL, no_label)] + [(label_id, labels[label_id]) for label_id in sorted(labels.keys())] - - ## Public ## - def export_filter_items(self): - """ - returns : - { - "CATEGORY" : [("filter_value",count), ...] , ... - } - -- - category's : ["state","tracker","label"] - """ - result = {} - - if self.config.get("show_states"): - result[STATE] = self.get_state_filter_items() - if self.config.get("show_trackers"): - result[TRACKER] = self.get_tracker_filter_items() - if self.config.get("show_labels"): - result[LABEL] = self.get_label_filter_items() - - return result - def export_get_labels(self): return sorted(self.labels.keys()) - def export_get_filtered_ids(self, filter_dict): - """ - input : {"filter_cat":"filter_value",..} - returns : a list of torrent_id's - """ - torrents = self.torrents.values() - if KEYWORD in filter_dict: - torrents = self.filter_keyword(torrents, filter_dict[KEYWORD]) - - if STATE in filter_dict and filter_dict[STATE] <> "": - torrents = self.filter_state(torrents, filter_dict[STATE]) - - if TRACKER in filter_dict: - torrents = self.filter_tracker(torrents, filter_dict[TRACKER]) - - if LABEL in filter_dict: - torrents = self.filter_label(torrents, filter_dict[LABEL]) - return [t.torrent_id for t in torrents] - - #Labels: def export_add(self, label_id): """add a label @@ -410,11 +292,7 @@ class Core(CorePluginBase): return dict ( (k,self.config.get(k) ) for k in CORE_OPTIONS) def export_set_global_options(self, options): - """global_options: - { - "hide_zero":bool() #label_filter_items only returns items with more than 0 hits. - } - """ + """global_options:""" for key in CORE_OPTIONS: if options.has_key(key): self.config.set(key, options[key]) diff --git a/deluge/plugins/label/label/test.py b/deluge/plugins/label/label/test.py index 3863b4492..bd7856e41 100644 --- a/deluge/plugins/label/label/test.py +++ b/deluge/plugins/label/label/test.py @@ -8,35 +8,6 @@ print sclient.get_enabled_plugins() if not "label" in sclient.get_enabled_plugins(): sclient.enable_plugin("label") -#test filter items. -print "# label_filter_items()" -for cat,filters in sclient.label_filter_items().iteritems(): - print "-- %s --" % cat - for filter in filters: - print " * %s (%s)" % (filter[0],filter[1]) - -# test filtering -print "#len(sclient.label_get_filtered_ids({'tracker':'tracker.aelitis.com'} ))" -print len(sclient.label_get_filtered_ids({'tracker':'tracker.aelitis.com'} )) - -print "#len(sclient.label_get_filtered_ids({'state':'Paused'} ))" -print len(sclient.label_get_filtered_ids({'state':'Paused'} )) - - -print "#len(sclient.label_get_filtered_ids({'keyword':'az'} ))" -print len(sclient.label_get_filtered_ids({'keyword':'az'} )) - - -print "#len(sclient.label_get_filtered_ids({'state':'Paused','tracker':'tracker.aelitis.com'} ))" -print len(sclient.label_get_filtered_ids({'state':'Paused','tracker':'tracker.aelitis.com'} )) - -print "#test status-fields:" -ids = sclient.get_session_state() - -torrents = sclient.get_torrents_status({"id":ids},['name', 'tracker_host', 'label']) - -for id,torrent in torrents.iteritems(): - print id, torrent #test labels. print "#init labels" @@ -51,16 +22,7 @@ sclient.label_add("test") print "#set" sclient.label_set_torrent(id,"test") -print "#len(sclient.label_get_filtered_ids({'label':'test'} ))" -print len(sclient.label_get_filtered_ids({'label':'test'} )) - -#test filter items. -print "# label_filter_items()" -for cat,filters in sclient.label_filter_items().iteritems(): - if cat == "label": - print "-- %s --" % cat - for filter in filters: - print " * %s (%s)" % (filter[0],filter[1]) +print scleint.get_torrents_status({"label":test},"name") print "#set options"