filter_tree:add label-plugin and init_func

This commit is contained in:
Martijn Voncken 2008-08-18 20:23:27 +00:00
parent aa4ed4a6c6
commit d8b0fb5885
3 changed files with 38 additions and 181 deletions

View File

@ -48,7 +48,6 @@ def filter_keyword(torrent_ids, values):
def filter_state_active(self, torrent_ids, value): def filter_state_active(self, torrent_ids, value):
pass pass
class FilterManager(component.Component): class FilterManager(component.Component):
"""FilterManager """FilterManager
@ -60,7 +59,10 @@ class FilterManager(component.Component):
self.torrents = core.torrents self.torrents = core.torrents
self.registered_filters = {} self.registered_filters = {}
self.register_filter("keyword", filter_keyword) 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): def filter_torrent_ids(self, filter_dict):
""" """
@ -101,30 +103,45 @@ class FilterManager(component.Component):
return torrent_ids 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): def get_filter_tree(self):
""" """
returns {field: [(value,count)] } returns {field: [(value,count)] }
for use in sidebar. for use in sidebar.
""" """
torrent_ids = self.torrents.get_torrent_list() 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.. 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): for torrent_id in list(torrent_ids):
status = status_func(torrent_id, self.filter_tree_fields) #status={key:value} status = status_func(torrent_id, tree_keys) #status={key:value}
for field in self.filter_tree_fields: for field in tree_keys:
value = status[field] value = status[field]
items[field][value] = items[field].get(value, 0) + 1 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()) items[field] = sorted(items[field].iteritems())
return items 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]

View File

@ -37,7 +37,7 @@ adds a status field for tracker.
from deluge.log import LOG as log from deluge.log import LOG as log
from deluge.plugins.corepluginbase import CorePluginBase from deluge.plugins.corepluginbase import CorePluginBase
from deluge.configmanager import ConfigManager from deluge.configmanager import ConfigManager
import deluge.component as component
from urlparse import urlparse from urlparse import urlparse
import traceback import traceback
@ -111,6 +111,10 @@ class Core(CorePluginBase):
#todo: register to torrent_added event. #todo: register to torrent_added event.
self.plugin.register_hook("post_torrent_add", self.post_torrent_add) self.plugin.register_hook("post_torrent_add", self.post_torrent_add)
self.plugin.register_hook("post_torrent_remove", self.post_torrent_remove) 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..") log.debug("Label plugin enabled..")
def disable(self): def disable(self):
@ -168,131 +172,9 @@ class Core(CorePluginBase):
if changed: if changed:
self.config.save() 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): def export_get_labels(self):
return sorted(self.labels.keys()) 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: #Labels:
def export_add(self, label_id): def export_add(self, label_id):
"""add a label """add a label
@ -410,11 +292,7 @@ class Core(CorePluginBase):
return dict ( (k,self.config.get(k) ) for k in CORE_OPTIONS) return dict ( (k,self.config.get(k) ) for k in CORE_OPTIONS)
def export_set_global_options(self, options): def export_set_global_options(self, options):
"""global_options: """global_options:"""
{
"hide_zero":bool() #label_filter_items only returns items with more than 0 hits.
}
"""
for key in CORE_OPTIONS: for key in CORE_OPTIONS:
if options.has_key(key): if options.has_key(key):
self.config.set(key, options[key]) self.config.set(key, options[key])

View File

@ -8,35 +8,6 @@ print sclient.get_enabled_plugins()
if not "label" in sclient.get_enabled_plugins(): if not "label" in sclient.get_enabled_plugins():
sclient.enable_plugin("label") 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. #test labels.
print "#init labels" print "#init labels"
@ -51,16 +22,7 @@ sclient.label_add("test")
print "#set" print "#set"
sclient.label_set_torrent(id,"test") sclient.label_set_torrent(id,"test")
print "#len(sclient.label_get_filtered_ids({'label':'test'} ))" print scleint.get_torrents_status({"label":test},"name")
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 "#set options" print "#set options"