diff --git a/ChangeLog b/ChangeLog index dc3533db5..a403e5395 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,7 +4,9 @@ Deluge 1.1.0 - "" (In Development) * Implement #296 ability to change peer TOS byte * Add per-torrent move on completed settings * Implement #414 use async save_resume_data method - + * FilterManager with torrent filtering in get_torrents_status , for sidebar and plugins. + + GtkUI: * Add peer progress to the peers tab * Sorting # column will place downloaders above seeds diff --git a/deluge/plugins/webuipluginbase.py b/deluge/plugins/webuipluginbase.py new file mode 100644 index 000000000..414ff2267 --- /dev/null +++ b/deluge/plugins/webuipluginbase.py @@ -0,0 +1,72 @@ +# +# webuipluginbase.py +# +# Copyright (C) 2008 Andrew Resch ('andar') +# +# Deluge is free software. +# +# You may redistribute it and/or modify it under the terms of the +# GNU General Public License, as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) +# any later version. +# +# deluge is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with deluge. If not, write to: +# The Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor +# Boston, MA 02110-1301, USA. +# +# In addition, as a special exception, the copyright holders give +# permission to link the code of portions of this program with the OpenSSL +# library. +# You must obey the GNU General Public License in all respects for all of +# the code used other than OpenSSL. If you modify file(s) with this +# exception, you may extend this exception to your version of the file(s), +# but you are not obligated to do so. If you do not wish to do so, delete +# this exception statement from your version. If you delete this exception +# statement from all source files in the program, then also delete it here. + + +from deluge.log import LOG as log +from deluge import component +import os +api = component.get("WebPluginApi") + + +class WebUIPluginBase: + """ + /data is automatically served on http as as /plugin-name/data + templates /template are added to api.render + """ + def __init__(self, plugin_api, plugin_name): + log.debug("%s plugin initalized.." % plugin_name) + self.plugin = plugin_api + self.plugin_name = plugin_name + clean_plugin_name = plugin_name.lower().replace(" ","_") + + class egg_data_static(api.egg_handler): #serves files in /data from egg + resource = clean_plugin_name + base_path = "data" + + template_dir = os.path.join(os.path.dirname(__file__),"template") + api.render.register_template_path(template_dir) + api.page_manager.register_page("/%s/data/(.*)" % clean_plugin_name , egg_data_static) + + log.debug("%s plugin : end base initalize." % plugin_name) + + + + + + + + + + + + diff --git a/deluge/scripts/wiki_docgen.py b/deluge/scripts/wiki_docgen.py index 6bea74a8c..d505912c8 100644 --- a/deluge/scripts/wiki_docgen.py +++ b/deluge/scripts/wiki_docgen.py @@ -12,7 +12,7 @@ sclient.set_core_uri() print "\n\n" -if False: #aclient non-core +if 0: #aclient non-core methods = sorted([m for m in dir(aclient) if not m.startswith('_') if not m in ['add_torrent_file', 'has_callback', 'get_method', 'methodHelp','methodSignature','list_methods','add_torrent_file_binary']]) @@ -30,7 +30,7 @@ if False: #aclient non-core print("\n'''%s(%s): '''\n" %(method_name, ", ".join(params))) print("%s" % pydoc.getdoc(func)) -if 0: #baseclient/core +if 1: #baseclient/core methods = sorted([m for m in dir(Core) if m.startswith("export")] + ['export_add_torrent_file_binary'] #HACK @@ -52,7 +52,7 @@ if 0: #baseclient/core print("\n'''%s(%s): '''\n" %(method_name, ", ".join(params))) print("{{{\n%s\n}}}" % pydoc.getdoc(func)) -if False: #plugin-manager +if 0: #plugin-manager import WebUi from WebUi.pluginmanager import PluginManager @@ -63,13 +63,13 @@ if False: #plugin-manager print("\n'''%s(%s): '''\n" %(method_name, ", ".join(params))) print("%s" % pydoc.getdoc(func)) -if 1: #possible config-values +if 0: #possible config-values print "=== config-values ===" cfg = sclient.get_config() for key in sorted(cfg.keys()): print "%s:%s()" % (key, type(cfg[key]).__name__) -if False: #keys +if 0: #keys print """== Notes == * The available keys for get_torrent_status(id, keys) {{{ diff --git a/deluge/ui/webui/components.py b/deluge/ui/webui/components.py index 8c7f9482f..e37095df2 100644 --- a/deluge/ui/webui/components.py +++ b/deluge/ui/webui/components.py @@ -47,6 +47,7 @@ manager = component.get("ClassName") """ from deluge import component import lib.newforms_plus as forms +from lib.egg_handler import egg_handler from deluge.ui.client import aclient from deluge import component, pluginmanagerbase from deluge.configmanager import ConfigManager @@ -186,6 +187,7 @@ class PluginApi(component.Component): import utils import lib.newforms_plus as forms + self.egg_handler = egg_handler self.render = render self.web = web self.deco = deco diff --git a/deluge/ui/webui/lib/egg_handler.py b/deluge/ui/webui/lib/egg_handler.py new file mode 100644 index 000000000..83f0246c3 --- /dev/null +++ b/deluge/ui/webui/lib/egg_handler.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +#(c) Martijn Voncken, mvoncken@gmail.com +#Same Licence as python 2.5 +# +""" +static fileserving for web.py +without the need for wsgi wrapper magic. +""" +import web +from web import url + +import posixpath +import urlparse +import urllib +import mimetypes +import os +import datetime +import cgi +from StringIO import StringIO +mimetypes.init() # try to read system mime.types +import pkg_resources + +""" +def get_resource(self, filename): + return pkg_resources.resource_filename("blocklist", os.path.join("data", filename)) + +""" +class egg_handler: + """ + serves files directly from an egg + """ + resource = "label" + base_path = "data" + extensions_map = mimetypes.types_map + + def GET(self, path): + path = os.path.join(self.base_path, path) + ctype = self.guess_type(path) + + data = pkg_resources.resource_string(self.resource,path) + + web.header("Content-type", ctype) + web.header("Cache-Control" , "public, must-revalidate, max-age=86400") + #web.lastmodified(datetime.datetime.fromtimestamp(fs.st_mtime)) + print data + + def guess_type(self, path): + base, ext = posixpath.splitext(path) + if ext in self.extensions_map: + return self.extensions_map[ext] + ext = ext.lower() + if ext in self.extensions_map: + return self.extensions_map[ext] + else: + return 'application/octet-stream' + +if __name__ == '__main__': + #example: + class usr_static(egg_handler): + resource = "label" + base_path = "data" + + base_dir = os.path.expanduser('~') + urls = ('/relative/(.*)','static_handler', + '/(.*)','usr_static') + + web.run(urls,globals())