make the new twisted webui runnable via deluge -u web

This commit is contained in:
Damien Churchill 2009-02-11 00:17:31 +00:00
parent ef5790fefe
commit 06bb660a10
4 changed files with 91 additions and 34 deletions

View File

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

View File

View File

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

32
deluge/ui/web/webui.py Normal file
View File

@ -0,0 +1,32 @@
#
# deluge/ui/web/webui.py
#
# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
#
# 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()