diff --git a/deluge/ui/ui.py b/deluge/ui/ui.py index 01a8db7c3..583c6bffd 100644 --- a/deluge/ui/ui.py +++ b/deluge/ui/ui.py @@ -55,7 +55,7 @@ class UI: ui = GtkUI(args) elif selected_ui == "web": log.info("Starting WebUI..") - from deluge.ui.webui.webui import WebUI + from deluge.ui.web.webui import WebUI ui = WebUI(args) elif selected_ui == "console": log.info("Starting ConsoleUI..") diff --git a/deluge/ui/web/__init__.py b/deluge/ui/web/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/deluge/ui/web/server.py b/deluge/ui/web/server.py index 80e2fe372..45142bf55 100644 --- a/deluge/ui/web/server.py +++ b/deluge/ui/web/server.py @@ -50,14 +50,43 @@ from deluge.ui.client import client from deluge.ui.tracker_icons import TrackerIcons log = logging.getLogger(__name__) +# Initialize gettext +try: + locale.setlocale(locale.LC_ALL, "") + if hasattr(locale, "bindtextdomain"): + locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n")) + if hasattr(locale, "textdomain"): + locale.textdomain("deluge") + gettext.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n")) + gettext.textdomain("deluge") + gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n")) +except Exception, e: + log.error("Unable to initialize gettext/locale: %s", e) + +current_dir = os.path.dirname(__file__) + +def rpath(path): + """ + Convert a relative path into an absolute path relative to the location + of this script. + """ + return os.path.join(current_dir, path) + class Template(MakoTemplate): + builtins = { + "_": gettext.gettext, + "version": common.get_version() + } + def render(self, *args, **data): - data["_"] = gettext.gettext - data["version"] = common.get_version() + data.update(self.builtins) return MakoTemplate.render(self, *args, **data) -class JSONException(Exception): pass +class JSONException(Exception): + def __init__(self, inner_exception): + self.inner_exception = inner_exception + Exception.__init__(self, str(inner_exception)) class JSON(resource.Resource): """ @@ -160,7 +189,7 @@ class JSON(resource.Resource): elif method in self._remote_methods: return self._exec_remote(method, params), request_id except Exception, e: - raise JSONException(str(e)) + raise JSONException(e) def _on_rpc_request_finished(self, result, response, request): """ @@ -173,7 +202,7 @@ class JSON(resource.Resource): """ Handles any failures that occured while making an rpc call. """ - print reason + print type(reason) request.setResponseCode(http.INTERNAL_SERVER_ERROR) return "" @@ -193,7 +222,7 @@ class JSON(resource.Resource): """ Errback handler to return a HTTP code of 500. """ - print reason + raise reason request.setResponseCode(http.INTERNAL_SERVER_ERROR) return "" @@ -301,7 +330,7 @@ class JSON(resource.Resource): class GetText(resource.Resource): def render(self, request): request.setHeader("content-type", "text/javascript") - template = Template(filename="gettext.js") + template = Template(filename=rpath("gettext.js")) return template.render() class Upload(resource.Resource): @@ -345,7 +374,7 @@ class Render(resource.Resource): return "" filename = os.path.join("render", request.render_file) - template = Template(filename=filename) + template = Template(filename=rpath(filename)) request.setHeader("content-type", "text/html") request.setResponseCode(http.OK) return template.render() @@ -378,16 +407,16 @@ class TopLevel(resource.Resource): def __init__(self): resource.Resource.__init__(self) - self.putChild("css", static.File("css")) + self.putChild("css", static.File(rpath("css"))) self.putChild("gettext.js", GetText()) - self.putChild("icons", static.File("icons")) - self.putChild("images", static.File("images")) - self.putChild("js", static.File("js")) + self.putChild("icons", static.File(rpath("icons"))) + self.putChild("images", static.File(rpath("images"))) + self.putChild("js", static.File(rpath("js"))) self.putChild("json", JSON()) self.putChild("upload", Upload()) self.putChild("render", Render()) self.putChild("test", static.File("test.html")) - self.putChild("themes", static.File("themes")) + self.putChild("themes", static.File(rpath("themes"))) self.putChild("tracker", Tracker()) def getChild(self, path, request): @@ -397,27 +426,23 @@ class TopLevel(resource.Resource): return resource.Resource.getChild(self, path, request) def render(self, request): - template = Template(filename="index.html") + template = Template(filename=rpath("index.html")) request.setHeader("content-type", "text/html; charset=utf-8") return template.render() -setupLogger(level="debug") +class DelugeWeb: + def __init__(self): + self.site = server.Site(TopLevel()) + self.port = 8112 -# Initialize gettext -try: - locale.setlocale(locale.LC_ALL, "") - if hasattr(locale, "bindtextdomain"): - locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n")) - if hasattr(locale, "textdomain"): - locale.textdomain("deluge") - gettext.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n")) - gettext.textdomain("deluge") - gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n")) -except Exception, e: - log.error("Unable to initialize gettext/locale: %s", e) - -site = server.Site(TopLevel()) -application = service.Application("DelugeWeb") -sc = service.IServiceCollection(application) -i = internet.TCPServer(8112, site) -i.setServiceParent(sc) +if __name__ == "__builtin__": + deluge_web = DelugeWeb() + application = service.Application("DelugeWeb") + sc = service.IServiceCollection(application) + i = internet.TCPServer(deluge_web.port, deluge_web.site) + i.setServiceParent(sc) +elif __name__ == "__main__": + from twisted.internet import reactor + deluge_web = DelugeWeb() + reactor.listenTCP(deluge_web.port, deluge_web.site) + reactor.run() \ No newline at end of file diff --git a/deluge/ui/web/webui.py b/deluge/ui/web/webui.py new file mode 100644 index 000000000..b2ef58a8c --- /dev/null +++ b/deluge/ui/web/webui.py @@ -0,0 +1,32 @@ +# +# deluge/ui/web/webui.py +# +# Copyright (C) 2009 Damien Churchill +# +# 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. +# + +from twisted.internet import reactor + +class WebUI: + def __init__(self, args): + import server + deluge_web = server.DelugeWeb() + reactor.listenTCP(deluge_web.port, deluge_web.site) + reactor.run() \ No newline at end of file