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):
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]

View File

@ -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])

View File

@ -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"