diff --git a/plugins/WebUi/__init__.py b/plugins/WebUi/__init__.py index 4202d21ba..c0a44655f 100644 --- a/plugins/WebUi/__init__.py +++ b/plugins/WebUi/__init__.py @@ -45,13 +45,20 @@ Other contributors: """ import deluge.common -import deluge.pref -from deluge.dialogs import show_popup_warning +try: + import deluge.pref + from deluge.dialogs import show_popup_warning + import webserver_common +except ImportError: + print 'WebUi:not imported as a plugin' + + + try: from dbus_interface import get_dbus_manager except: pass #for unit-test. -import webserver_common + import time import gtk @@ -117,6 +124,9 @@ class plugin_WebUi(object): else: self.config.set("run_in_thread", False) + if self.config.get("use_https") == None: + self.config.set("use_https", False) + self.dbus_manager = get_dbus_manager(deluge_core, deluge_interface, self.config, self.config_file) @@ -167,8 +177,6 @@ class plugin_WebUi(object): def __del__(self): self.kill_server() - - class ConfigDialog(gtk.Dialog): """ sorry, can't get used to gui builders. @@ -195,6 +203,12 @@ class ConfigDialog(gtk.Dialog): gtk.combo_box_new_text()) self.cache_templates = self.add_widget(_('Cache Templates'), gtk.CheckButton()) + """ + temporary disable for 0.5.7 + self.use_https = self.add_widget(_('Use https://'), + gtk.CheckButton()) + """ + #self.share_downloads = self.add_widget(_('Share Download Directory'), # gtk.CheckButton()) @@ -222,6 +236,7 @@ class ConfigDialog(gtk.Dialog): # bool(self.config.get("share_downloads"))) self.cache_templates.set_active(self.config.get("cache_templates")) + """0.5.7.. self.use_https.set_active(self.config.get("use_https"))""" self.vbox.pack_start(self.vb, True, True, 0) self.vb.show_all() @@ -257,6 +272,7 @@ class ConfigDialog(gtk.Dialog): self.config.set("template", self.template.get_active_text()) self.config.set("button_style", self.button_style.get_active()) self.config.set("cache_templates", self.cache_templates.get_active()) + #0.5.7.. self.config.set("use_https", self.use_https.get_active()) #self.config.set("share_downloads", self.share_downloads.get_active()) self.config.save(self.plugin.config_file) self.plugin.start_server() #restarts server diff --git a/plugins/WebUi/dbus_interface.py b/plugins/WebUi/dbus_interface.py index f14a382e0..9f0f826bc 100644 --- a/plugins/WebUi/dbus_interface.py +++ b/plugins/WebUi/dbus_interface.py @@ -95,7 +95,8 @@ class DbusManager(dbus.service.Object): "total_size": state["total_size"], "num_pieces": state["num_pieces"], "state": state['state'], - "paused": self.core.is_user_paused(torrent_id), + "user_paused": self.core.is_user_paused(torrent_id), + "paused":state['is_paused'], "progress": int(state["progress"] * 100), "next_announce": state["next_announce"], "total_payload_download":state["total_payload_download"], @@ -153,16 +154,22 @@ class DbusManager(dbus.service.Object): self.core.update_tracker(torrent_id) @dbus.service.method(dbus_interface=dbus_interface, - in_signature="sbb", out_signature="") - def remove_torrent(self, torrent_id, data_also, torrent_also): + in_signature="asbb", out_signature="") + def remove_torrent(self, torrent_ids, data_also, torrent_also): """remove a torrent,and optionally data and torrent additions compared to 0.6 interface: (data_also, torrent_also) """ - torrent_id = int(torrent_id) - self.core.remove_torrent(torrent_id, bool(data_also) - ,bool( torrent_also)) - #this should not be needed: - self.interface.torrent_model_remove(torrent_id) + for torrent_id in torrent_ids: + torrent_id = int(torrent_id) + self.core.remove_torrent(torrent_id, bool(data_also) + ,bool( torrent_also)) + + #this should not be needed: + gtk.gdk.threads_enter() + try: + self.interface.torrent_model_remove(torrent_id) + except: + pass @dbus.service.method(dbus_interface=dbus_interface, in_signature="s", out_signature="b") @@ -174,7 +181,6 @@ class DbusManager(dbus.service.Object): @dbus.service.method(dbus_interface=dbus_interface, in_signature="s", out_signature="b") def queue_up(self, torrent_id): - print 'UP!' self.core.queue_up(int(torrent_id)) return True diff --git a/plugins/WebUi/deluge_webserver.py b/plugins/WebUi/deluge_webserver.py index 69ddb495c..d63ae55f9 100644 --- a/plugins/WebUi/deluge_webserver.py +++ b/plugins/WebUi/deluge_webserver.py @@ -46,7 +46,9 @@ urls = ( "/login", "login", "/index", "index", "/torrent/info/(.*)", "torrent_info", - "/torrent/pause", "torrent_pause", + "/torrent/info_inner/(.*)", "torrent_info_inner", + "/torrent/stop/(.*)", "torrent_stop", + "/torrent/start/(.*)", "torrent_start", "/torrent/reannounce/(.*)", "torrent_reannounce", "/torrent/add", "torrent_add", "/torrent/delete/(.*)", "torrent_delete", @@ -115,19 +117,38 @@ class index: class torrent_info: @deluge_page @auto_refreshed - def GET(self, torrent_id): + def GET(self, name): + torrent_id = name.split(',')[0] return ws.render.torrent_info(get_torrent_status(torrent_id)) -class torrent_pause: +class torrent_info_inner: + @deluge_page + def GET(self, torrent_ids): + torrent_ids = torrent_ids.split(',') + info = get_torrent_status(torrent_ids[0]) + if len(torrent_ids) > 1: + #todo : hmm, lots of manual stuff here :( + pass + + + return ws.render.torrent_info_inner(info) + +class torrent_start: @check_session def POST(self, name): - vars = web.input(stop = None, start = None, redir = None) - if vars.stop: - ws.proxy.pause_torrent([vars.stop]) - elif vars.start: - ws.proxy.resume_torrent([vars.start]) + torrent_ids = name.split(',') + ws.proxy.resume_torrent(torrent_ids) do_redirect() +class torrent_stop: + @check_session + def POST(self, name): + torrent_ids = name.split(',') + ws.proxy.pause_torrent(torrent_ids) + do_redirect() + + + class torrent_reannounce: @check_session def POST(self, torrent_id): @@ -175,27 +196,32 @@ class remote_torrent_add: class torrent_delete: @deluge_page - def GET(self, torrent_id): - return ws.render.torrent_delete(get_torrent_status(torrent_id)) + def GET(self, name): + torrent_ids = name.split(',') + torrent_list = [get_torrent_status(id) for id in torrent_ids] + return ws.render.torrent_delete(name, torrent_list) @check_session - def POST(self, torrent_id): + def POST(self, name): + torrent_ids = name.split(',') vars = web.input(data_also = None, torrent_also = None) data_also = bool(vars.data_also) torrent_also = bool(vars.torrent_also) - ws.proxy.remove_torrent(torrent_id, data_also, torrent_also) + ws.proxy.remove_torrent(torrent_ids, data_also, torrent_also) do_redirect() class torrent_queue_up: @check_session - def POST(self, torrent_id): - ws.proxy.queue_up(torrent_id) + def POST(self, name): + for torrent_id in sorted(name.split(',')): + ws.proxy.queue_up(torrent_id) do_redirect() class torrent_queue_down: @check_session - def POST(self, torrent_id): - ws.proxy.queue_down(torrent_id) + def POST(self, name): + for torrent_id in reversed(sorted(name.split(','))): + ws.proxy.queue_down(torrent_id) do_redirect() class pause_all: diff --git a/plugins/WebUi/revno b/plugins/WebUi/revno index c75acbe2f..fba7ed526 100644 --- a/plugins/WebUi/revno +++ b/plugins/WebUi/revno @@ -1 +1 @@ -127 +143 diff --git a/plugins/WebUi/static/images/tango/pause.png b/plugins/WebUi/static/images/tango/pause.png new file mode 100644 index 000000000..c8b4fe225 Binary files /dev/null and b/plugins/WebUi/static/images/tango/pause.png differ diff --git a/plugins/WebUi/static/images/tango/queue-down.png b/plugins/WebUi/static/images/tango/queue-down.png new file mode 100644 index 000000000..3dd7fccdf Binary files /dev/null and b/plugins/WebUi/static/images/tango/queue-down.png differ diff --git a/plugins/WebUi/static/images/tango/queue-up.png b/plugins/WebUi/static/images/tango/queue-up.png new file mode 100644 index 000000000..fa9a7d71b Binary files /dev/null and b/plugins/WebUi/static/images/tango/queue-up.png differ diff --git a/plugins/WebUi/static/images/tango/start.png b/plugins/WebUi/static/images/tango/start.png new file mode 100644 index 000000000..a7de0feb0 Binary files /dev/null and b/plugins/WebUi/static/images/tango/start.png differ diff --git a/plugins/WebUi/static/images/tango/stop.png b/plugins/WebUi/static/images/tango/stop.png new file mode 100644 index 000000000..ede2815e5 Binary files /dev/null and b/plugins/WebUi/static/images/tango/stop.png differ diff --git a/plugins/WebUi/static/simple_site_style.css b/plugins/WebUi/static/simple_site_style.css index 16d65480e..a3ba439d6 100755 --- a/plugins/WebUi/static/simple_site_style.css +++ b/plugins/WebUi/static/simple_site_style.css @@ -26,11 +26,16 @@ form.deluge_button { } button.deluge_button { background-color: #37506f; - border:1px solid #23344b; + border:1px solid #68a; + background: #99acc3; color: #000; + vertical-align:middle; + -moz-border-radius:7px; +} +button.deluge_button:hover { + background-color:#68a; } - div.error { background-color:#FFFFFF; color:#AA0000; @@ -42,4 +47,28 @@ div.error { } +/*tr.torrent_table:hover { + background-color:#68a; +}*/ + +tr.torrent_table_selected { + background-color:#900; +} + +th.torrent_table:hover { + background-color:#68a; +} + +img.button { + margin-bottom:0px; + padding:0px; + position:relative; + top:2px; +} + +body.inner { + background:none; +} + + /* Hides from IE-mac \*/ * html .clearfix {height: 1%;} .clearfix {display: block;} /* End hide from IE-mac */ \ No newline at end of file diff --git a/plugins/WebUi/templates/advanced/header.html b/plugins/WebUi/templates/advanced/header.html new file mode 100644 index 000000000..3d8f4cda3 --- /dev/null +++ b/plugins/WebUi/templates/advanced/header.html @@ -0,0 +1,28 @@ +$def with (title) + + + Deluge:$title + + + + + + + + + + + +
+ + + + +
+ +
+
diff --git a/plugins/WebUi/templates/advanced/index.html b/plugins/WebUi/templates/advanced/index.html new file mode 100644 index 000000000..637aa6bdc --- /dev/null +++ b/plugins/WebUi/templates/advanced/index.html @@ -0,0 +1,105 @@ +$def with (torrent_list) +$:render.header(_('Torrent list')) + + +[Add] +[Up] +[Down] +[Delete] +[Info] +[Pause] +[Start] + + + + + +
+ +
+ + + + $:(sort_head('calc_state_str', 'S')) + $:(sort_head('queue_pos', '#')) + $:(sort_head('name', _('Name'))) + $:(sort_head('total_size', _('Size'))) + $:(sort_head('progress', _('Progress'))) + $:(sort_head('num_seeds', _('Seeders'))) + $:(sort_head('num_peers', _('Peers'))) + $:(sort_head('download_rate', _('Download'))) + $:(sort_head('upload_rate', _('Upload'))) + $:(sort_head('eta', _('Eta'))) + $:(sort_head('distributed_copies', _('Ava'))) + $:(sort_head('ratio', _('Ratio'))) + + + +$#4-space indentation is mandatory for for-loops in templetor! +$for torrent in torrent_list: + + + + + + + + + + + + + + +
+ $torrent.queue_pos + $(crop(torrent.name, 40))$fsize(torrent.total_size) +
+
+ $torrent.message +
+
+
$torrent.num_seeds ($torrent.total_seeds)$torrent.num_peers ($torrent.total_peers)$fspeed(torrent.download_rate)$fspeed(torrent.upload_rate)$torrent.eta$("%.3f" % torrent.distributed_copies)$("%.3f" % torrent.ratio) +
+
+ +
+ +$:part_stats() + +
+ +
+ + + + + +
+ +
+ + +$:render.footer() + diff --git a/plugins/WebUi/templates/advanced/part_stats.html b/plugins/WebUi/templates/advanced/part_stats.html new file mode 100644 index 000000000..6ce594919 --- /dev/null +++ b/plugins/WebUi/templates/advanced/part_stats.html @@ -0,0 +1,36 @@ +$def with (stats) + + +
+ +$_('Auto refresh:') +$if getcookie('auto_refresh') == '1': + ($getcookie('auto_refresh_secs')) $_('seconds')   + $:render.part_button('GET', '/refresh/set', _('Set'), 'tango/preferences-system.png') + $:render.part_button('POST', '/refresh/off', _('Disable'), 'tango/process-stop.png') +$else: + $_('Off')   + $:render.part_button('POST', '/refresh/on', _('Enable'), 'tango/view-refresh.png') +$#end +
+ +
+ + + $_('Connections') : $stats.num_connections ($stats.max_num_connections) + + $_('Down Speed') : $stats.download_rate ($stats.max_download) + + $_('Up Speed') : $stats.upload_rate ($stats.max_upload) + + + + +
+ + + + + diff --git a/plugins/WebUi/templates/advanced/part_tb_button.html b/plugins/WebUi/templates/advanced/part_tb_button.html new file mode 100644 index 000000000..bc5ec9a21 --- /dev/null +++ b/plugins/WebUi/templates/advanced/part_tb_button.html @@ -0,0 +1,35 @@ +$def with (method, func, title, image='') +
+
+ +$if (get_config('button_style') == 0): + + +$if (get_config('button_style') == 1): + $if image: + + $else: + + +$if (get_config('button_style') == 2): + + +
+
+ \ No newline at end of file diff --git a/plugins/WebUi/templates/advanced/static/advanced.css b/plugins/WebUi/templates/advanced/static/advanced.css new file mode 100644 index 000000000..d197ad0fc --- /dev/null +++ b/plugins/WebUi/templates/advanced/static/advanced.css @@ -0,0 +1,136 @@ +/* ----------------------------------------------------------- Theme Name: Simple Theme URI: http://deluge-torrent.org Description: Deluge Theme Version: 1.0 ----------------------------------------------------------- */ BODY { background: #304663 url(../../static/images/simple_bg.jpg) repeat-x; font-family: Bitstream Vera; font-size: 10pt; margin: 0; + padding:0; + border:0; } /* GENERIC STYLES */ a img {border: 0px} hr {color: #627082; margin: 15px 0 15px 0;} +td {font-family: Bitstream Vera;} /* STRUCTURE */ #page { min-width: 800px; margin-left: auto; margin-right: auto; + margin: 0; + padding:0; + font-family: Bitstream Vera; } #main_content { background:url(../../static/images/simple_line.jpg) repeat-x; + margin: 0; + padding:0; } #simple_logo { background:url(../../static/images/simple_logo.jpg) no-repeat; } #main { + margin: 0; + padding:0; padding-top: 20px; color: #fff; } #main form table { border: #2a425c 1px solid; } #main form table tr { border: 0px; } #main form table tr th { background: #1f3044; font-size: 16px; border: 0px; + white-space: nowrap; } #main form table tr td{ border: 0px; color: #fff; font-size: 12px; white-space: nowrap; } #main form table tr th a { color: #8fa6c3; font-size: 16px; white-space: nowrap; } #main form table tr th a, a:active, a:visited { color: #8fa6c3; text-decoration: none; } #main form table tr th a:hover {color: #fff; text-decoration: underline;} #main form table tr td a { color: #fff; font-size: 12px; white-space: nowrap; } #main form table tr td a, a:active, a:visited { color: #fff; text-decoration: none;} #main form table tr td a:hover {color: #fff; text-decoration: underline;} #main a { color: #fff; font-size: 12px; } #main a, a:active, a:visited { color: #fff; text-decoration: none;} #main a:hover {color: #fff; text-decoration: underline;} .info { text-align: right; padding: 0 50px 0 0; color: #8fa6c3; font-size: 16px; letter-spacing: 4px; font-weight: bold; } .title { color: #dce4ee; font-size: 32px; padding: 10px 50px 0 0; text-align: right; } .title a, a:active, a:visited { color: #dce4ee; text-decoration: none;} .title a:hover {color: #fff; text-decoration: underline;} #button { border:1px solid #23344b; background: #99acc3; color: #000; + font-family: Bitstream Vera; font-size:10px; margin-top:5px; } INPUT{ border:1px solid #23344b; background: #99acc3; color: #000; } TEXTAREA{ border:1px solid #23344b; background: #99acc3; width:480px; } .footertext a { color: #c0c0c0; text-decoration:none;} .footertext a:visited { color: #c0c0c0; text-decoration:none;} .footertext a:active { color: #c0c0c0; text-decoration:none;} .footertext a:hover {color: #fff; text-decoration: underline;} .footertext { text-align: center; padding: 60px 0 0 0; font-size: 8pt; left: -100px; font-family: Bitstream Vera; color: #fff; position: relative; } .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } div.progress_bar{ background-color:#4573a5; /*color:blue;*/ -moz-border-radius:5px; /*ff only setting*/ } + +div.progress_bar_outer { /*used in table-view*/ + width:150px; +} + td.progress_bar { white-space: nowrap; } td.info_label { font-weight: bold; } td { font-size: 10pt; color: #d1dae5; white-space: nowrap; } tr { font-size: 10pt; color: #d1dae5; } + +div.panel { + padding:10px; + width:750px; + background-color: #37506f; + -moz-border-radius:10px; /*ff-only!*/ + margin-top:10px; + margin-bottom:10px; +} + + +/*New styles:*/ + +div.deluge_button { + display:inline; +} +form.deluge_button { + display:inline; +} +button.deluge_button { + background-color: #37506f; + border:1px solid #68a; + + background: #99acc3; + color: #000; + vertical-align:middle; + -moz-border-radius:7px; +} +button.deluge_button:hover { + background-color:#68a; +} +div.error { + background-color:#FFFFFF; + color:#AA0000; + font-weight:bold; + -moz-border-radius:10px; + width:200px; + margin-bottom:20px; + padding:10px; + +} + +tr.torrent_table:hover { + background-color:#68a; +} + +tr.torrent_table_selected { + background-color:#900; +} + +th.torrent_table:hover { + background-color:#68a; +} + +img.button { + margin-bottom:0px; + padding:0px; + position:relative; + top:2px; +} + +body.inner { + background:none; +} + +#stats_panel { + -moz-border-radius:0px; + width:100%; + position:fixed; + bottom:0px; + left:0px; + background-color:#304663; + margin: 0; + padding:0; + text-align:left; + height:20px; +} + +#about { + position:fixed; + bottom:0px; + right:10px; +} + +#info_panel_div2 { + position:fixed; + bottom:10px; + right:0px; + width:100%; + background-color:#304663; +} + +#refresh_panel { + -moz-border-radius:0px; + width:100%; + position:fixed; + bottom:20px; + left:0px; + background-color:#304663; + margin: 0; + padding:0; + text-align:right; + height:20px; +} + +#refresh_panel button { + background-color:#304663; + color:#FFFFFF; + border:0; + position:relative; + top:0px; + height:20px; +} +#refresh_panel button:hover { + text-decoration: underline; +} + + /* Hides from IE-mac \*/ * html .clearfix {height: 1%;} .clearfix {display: block;} /* End hide from IE-mac */ \ No newline at end of file diff --git a/plugins/WebUi/templates/advanced/static/deluge.js b/plugins/WebUi/templates/advanced/static/deluge.js new file mode 100644 index 000000000..33e7cbdc4 --- /dev/null +++ b/plugins/WebUi/templates/advanced/static/deluge.js @@ -0,0 +1,122 @@ +/* +all javascript is optional, everything should work web 1.0 +but javascript may/will enhance the experience. +i'm not a full time web-dev so don't expect beautifull patterns. +There's so much crap out there,i can't find good examples. +so i'd rather start from scratch, +Probably broken in an unexpected way , but worksforme. +*/ +state = { + 'row_js_continue':true + ,'selected_rows': new Array() +}; + +function $(el_id){ + return document.getElementById(el_id) +} +function get_row(id){ + return $('torrent_' + id); +} + +function on_click_row(e,id) { + /*filter out web 1.0 events for detail-link and pause*/ + if (state.row_js_continue) { + on_click_action(e,id); + } + state.row_js_continue = true; +} + +function on_click_row_js(e, id) { + /*real onClick event*/ + if (!e.ctrlKey) { + deselect_rows(); + } + select_row(id); + open_inner_details(id); +} + +function select_row(id){ + var row = get_row(id); + if (row) { + row.className = 'torrent_table_selected'; + state.selected_rows[state.selected_rows.length] = id; + setCookie('selected_rows',state.selected_rows); + } +} +function deselect_rows(){ + for (i in state.selected_rows) { + deselect_row(state.selected_rows[i]); + } + state.selected_rows = new Array(); +} +function deselect_row(id){ + var row = get_row(id); + if (row) { + row.className = 'torrent_table' + /*TODO : remove from state.selected_rows*/ + } +} +function reselect_rows(){ + var selected_rows = getCookie('selected_rows').split(','); + for (i in getCookie('selected_rows')) { + select_row(selected_rows[i]); + } +} + +function open_details(e, id){ + alert(id); + window.location.href = '/torrent/info/' + id; +} + +function open_inner_details(id){ + /*probably broken for IE, use FF!*/ + $('torrent_info').src = '/torrent/info_inner/' + id; +} + +function on_click_do_nothing(e, id){ +} + +on_click_action = on_click_do_nothing; + +/*toobar buttons, */ +function toolbar_post(url) { + /*this feels hacky, but it's the only way i know of*/ + var ids = state.selected_rows.join(','); + var form = $('toolbar_form'); + form.action = url +ids; + form.submit(); + return false; +} + +function toolbar_get(url) { + /*this feels hacky, but it's the only way i know of*/ + var ids = state.selected_rows.join(','); + window.location.href = url +ids; + return false; +} + +/*stuff copied from various places:*/ +/*http://www.w3schools.com/js/js_cookies.asp*/ +function setCookie(c_name,value,expiredays) +{ + var exdate=new Date() + exdate.setDate(exdate.getDate()+expiredays) + document.cookie=c_name+ "=" +escape(value)+ + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString()) +} + +function getCookie(c_name) +{ +if (document.cookie.length>0) + { + c_start=document.cookie.indexOf(c_name + "=") + if (c_start!=-1) + { + c_start=c_start + c_name.length+1 + c_end=document.cookie.indexOf(";",c_start) + if (c_end==-1) c_end=document.cookie.length + return unescape(document.cookie.substring(c_start,c_end)) + } + } +return "" +} \ No newline at end of file diff --git a/plugins/WebUi/templates/advanced/static/scrolling_table.css b/plugins/WebUi/templates/advanced/static/scrolling_table.css new file mode 100644 index 000000000..b046bd9c4 --- /dev/null +++ b/plugins/WebUi/templates/advanced/static/scrolling_table.css @@ -0,0 +1,106 @@ +/*Taken from: +http://www.imaputz.com/cssStuff/bigFourVersion.html +*/ + +/* define height and width of scrollable area. Add 16px to width for scrollbar */ +div.tableContainer { + clear: both; + /*border: 1px solid #963;*/ + height: 285px; + overflow: auto; + width: 756px; +} + +/* Reset overflow value to hidden for all non-IE browsers. */ +html>body div.tableContainer { + overflow: hidden; + width: 756px +} + +/* define width of table. IE browsers only */ +div.tableContainer table { + float: left; + width: 740px; +} + +/* define width of table. Add 16px to width for scrollbar. */ +/* All other non-IE browsers. */ +html>body div.tableContainer table { + width: 756px +} + +/* set table header to a fixed position. WinIE 6.x only */ +/* In WinIE 6.x, any element with a position property set to relative and is a child of */ +/* an element that has an overflow property set, the relative value translates into fixed. */ +/* Ex: parent element DIV with a class of tableContainer has an overflow property set to auto */ +thead.fixedHeader tr { + position: relative +} + +/* set THEAD element to have block level attributes. All other non-IE browsers */ +/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */ +html>body thead.fixedHeader tr { + display: block +} + +/* define the table content to be scrollable */ +/* set TBODY element to have block level attributes. All other non-IE browsers */ +/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */ +/* induced side effect is that child TDs no longer accept width: auto */ +html>body tbody.scrollContent { + display: block; + height: 262px; + overflow: auto; + width: 100% +} + +/* make TD elements pretty. Provide alternating classes for striping the table */ +/* http://www.alistapart.com/articles/zebratables/ */ +tbody.scrollContent td, tbody.scrollContent tr.normalRow td { + /*background: #FFF;*/ + + border-bottom: none; + border-left: none; + /*border-right: 1px solid #CCC; + border-top: 1px solid #DDD;*/ + padding: 2px 3px 3px 4px +} + +tbody.scrollContent tr.alternateRow td { + /*background: #EEE;*/ + border-bottom: none; + border-left: none; + /*border-right: 1px solid #CCC; + border-top: 1px solid #DDD;*/ + padding: 2px 3px 3px 4px +} + +/* define width of TH elements: 1st, 2nd, and 3rd respectively. */ +/* Add 16px to last TH for scrollbar padding. All other non-IE browsers. */ +/* http://www.w3.org/TR/REC-CSS2/selector.html#adjacent-selectors */ +html>body thead.fixedHeader th { + width: 200px +} + +html>body thead.fixedHeader th + th { + width: 240px +} + +html>body thead.fixedHeader th + th + th { + width: 316px +} + +/* define width of TD elements: 1st, 2nd, and 3rd respectively. */ +/* All other non-IE browsers. */ +/* http://www.w3.org/TR/REC-CSS2/selector.html#adjacent-selectors */ +html>body tbody.scrollContent td { + width: 200px +} + +html>body tbody.scrollContent td + td { + width: 240px +} + +html>body tbody.scrollContent td + td + td { + width: 300px +} \ No newline at end of file diff --git a/plugins/WebUi/templates/advanced/torrent_info_inner.html b/plugins/WebUi/templates/advanced/torrent_info_inner.html new file mode 100644 index 000000000..907bfcf55 --- /dev/null +++ b/plugins/WebUi/templates/advanced/torrent_info_inner.html @@ -0,0 +1,15 @@ +$def with (torrent) + + + + + Deluge:$torrent.name + + + + + + +$:render.tab_meta(torrent) + +$:render.footer() diff --git a/plugins/WebUi/templates/deluge/index.html b/plugins/WebUi/templates/deluge/index.html index b177c7b8c..1dad40b9b 100644 --- a/plugins/WebUi/templates/deluge/index.html +++ b/plugins/WebUi/templates/deluge/index.html @@ -1,7 +1,6 @@ $def with (torrent_list) $:render.header(_('Torrent list')) -
$:(sort_head('calc_state_str', 'S')) @@ -19,14 +18,19 @@ $:render.header(_('Torrent list')) $#4-space indentation is mandatory for for-loops in templetor! $for torrent in torrent_list: - - + + + + $(crop(torrent.name, 40))
+
+ + + $torrent.queue_pos - $(crop(torrent.name, 40)) $fsize(torrent.total_size)
@@ -45,7 +49,7 @@ $for torrent in torrent_list:
- +
$:render.part_button('GET', '/torrent/add', _('Add torrent'), 'tango/list-add.png') diff --git a/plugins/WebUi/templates/deluge/part_stats.html b/plugins/WebUi/templates/deluge/part_stats.html index 55a2a74b5..342b8049f 100644 --- a/plugins/WebUi/templates/deluge/part_stats.html +++ b/plugins/WebUi/templates/deluge/part_stats.html @@ -14,7 +14,7 @@ $else: $#end
-
+
$_('Connections') : $stats.num_connections ($stats.max_num_connections) @@ -26,8 +26,9 @@ $#end - - ($_('About')) + + ($_('About')) +
diff --git a/plugins/WebUi/templates/deluge/sort_column_head.html b/plugins/WebUi/templates/deluge/sort_column_head.html index 1de008a79..c18a50004 100644 --- a/plugins/WebUi/templates/deluge/sort_column_head.html +++ b/plugins/WebUi/templates/deluge/sort_column_head.html @@ -1,5 +1,5 @@ $def with (column_id, column_name, order, active_up, active_down) - + $column_name\ $if active_up: diff --git a/plugins/WebUi/templates/deluge/tab_meta.html b/plugins/WebUi/templates/deluge/tab_meta.html new file mode 100644 index 000000000..6a1de18de --- /dev/null +++ b/plugins/WebUi/templates/deluge/tab_meta.html @@ -0,0 +1,85 @@ +$def with (torrent) + + +
+ +
+ + $torrent.progress %
+
+ + + + + + + + + + + + + + + + + + + + + + + +
$_('Downloaded'):$torrent.calc_total_downloaded
$_('Uploaded'):$torrent.calc_total_uploaded
$_('Seeders'):$torrent.num_seeds ($torrent.total_seeds )
$_('Share Ratio'):$("%.3f" % torrent.ratio)
$_('Pieces'):$torrent.num_pieces x $fsize(torrent.piece_length)
  
+
+ + + + + + + + + + + + + + + + + + + + + +
$_('Speed'): +$fspeed(torrent.download_rate)
$_('Speed'):$fspeed(torrent.upload_rate)
$_('Peers'):$torrent.num_peers ($torrent.total_peers )
$_('ETA'):$torrent.eta
$_('Availability'):$("%.3f" % torrent.distributed_copies)
  
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
$_('Total Size'):$fspeed(torrent.total_size)
$_('# Of Files'):$torrent.num_files
$_('Tracker'):$(crop(torrent.tracker, 30))
$_('Tracker Status'):$torrent.tracker_status
$_('Next Announce'):$torrent.next_announce
$_('Queue Position'):$torrent.queue_pos
+ +
diff --git a/plugins/WebUi/templates/deluge/torrent_delete.html b/plugins/WebUi/templates/deluge/torrent_delete.html index 77f32949a..a9aceb551 100644 --- a/plugins/WebUi/templates/deluge/torrent_delete.html +++ b/plugins/WebUi/templates/deluge/torrent_delete.html @@ -1,10 +1,15 @@ -$def with (torrent) -$:render.header(_("Remove %s ") % torrent.name) +$def with (torrent_ids, torrent_list) +$:render.header(_("Remove torrent"))
-
+
-$(_("Remove %s?") % torrent.name) +

$_("Remove torrent")

+
    +$for torrent in torrent_list: +
  • $torrent.name
  • +
+

$_('Details')

- - -
-
+$:render.tab_meta(torrent) - $torrent.progress %
-
- +$if (torrent.action == 'start'): + $:render.part_button('POST', '/torrent/start/' + str(torrent.id), _('Resume'), 'tango/start.png') +$else: + $:render.part_button('POST', '/torrent/stop/' + str(torrent.id), _('Pause'), 'tango/pause.png') - - - - - - - - - - - - - - - - - -
$_('Downloaded'):$torrent.calc_total_downloaded
$_('Uploaded'):$torrent.calc_total_uploaded
$_('Seeders'):$torrent.num_seeds ($torrent.total_seeds )
$_('Share Ratio'):$("%.3f" % torrent.ratio)
$_('Pieces'):$torrent.num_pieces x $fsize(torrent.piece_length)
-
- - - - - - - - - - - - - - - - -
$_('Speed'): -$fspeed(torrent.download_rate)
$_('Speed'):$fspeed(torrent.upload_rate)
$_('Peers'):$torrent.num_peers ($torrent.total_peers )
$_('ETA'):$torrent.eta
$_('Availability'):$("%.3f" % torrent.distributed_copies)
- -
- - - - - - - - - - - - - - - - - - -
$_('Total Size'):$fspeed(torrent.total_size)
$_('# Of Files'):$torrent.num_files
$_('Tracker'):$(crop(torrent.tracker, 30))
$_('Tracker Status'):$torrent.tracker_status
$_('Next Announce'):$torrent.next_announce
- -
- - - - $:render.part_button('GET', '/torrent/delete/' + str(torrent.id), _('Remove'), 'tango/user-trash.png') $:render.part_button('POST', '/torrent/reannounce/' + str(torrent.id), _('Reannounce'), 'tango/view-refresh.png') +$:render.part_button('POST', '/torrent/queue/up/' + str(torrent.id), _('Queue Up'), 'tango/queue-up.png') +$:render.part_button('POST', '/torrent/queue/down/' + str(torrent.id), _('Queue Down'), 'tango/queue-down.png') +
disable + """ + torrent_id = self.first_torrent_id + self.assert_303( + '/torrent/recheck/%(id)s?redir=/torrent/info/%(id)s' + % {'id':torrent_id} + ,'/torrent/info/' + torrent_id, post = 1) + """ + + + # if False: diff --git a/plugins/WebUi/version b/plugins/WebUi/version index a7debb432..36b3caf3a 100644 --- a/plugins/WebUi/version +++ b/plugins/WebUi/version @@ -1,5 +1,5 @@ revision-id: mvoncken@gmail.com-20070930083408-sv8mo0mi1rbjnfvk -date: 2007-11-06 15:10:08 +0200 -build-date: 2007-11-06 15:34:50 +0200 -revno: 127 +date: 2007-11-21 15:10:08 +0200 +build-date: 2007-11-21 15:34:50 +0200 +revno: 143 branch-nick: WebUi diff --git a/plugins/WebUi/webserver_common.py b/plugins/WebUi/webserver_common.py index 1e209ea56..d433908f2 100644 --- a/plugins/WebUi/webserver_common.py +++ b/plugins/WebUi/webserver_common.py @@ -44,6 +44,8 @@ from webpy022 import template random.seed() path = os.path.dirname(__file__) +ENV = 'UNKNOWN' + try: _('translate something') except: @@ -90,6 +92,7 @@ def init_06(): init_process() globals()['proxy'] = proxy + globals()['ENV'] = '0.6' def init_05(): import dbus @@ -98,6 +101,7 @@ def init_05(): proxy = bus.get_object("org.deluge_torrent.dbusplugin" , "/org/deluge_torrent/DelugeDbusPlugin") globals()['proxy'] = proxy + globals()['ENV'] = '0.5_process' def init_gtk_05(): #appy possibly changed config-vars, only called in when runing inside gtk. @@ -106,12 +110,16 @@ def init_gtk_05(): globals()['config'] = deluge.pref.Preferences(config_file, False) globals()['render'] = subclassed_render(config.get('template'), config.get('cache_templates')) + globals()['ENV'] = '0.5_gtk' + #hacks to determine environment, TODO: clean up. if 'env=0.5' in sys.argv: init_05() -elif not hasattr(deluge, 'common'): +elif 'env=0.6' in sys.argv: + init_06() +elif hasattr(deluge, 'ui'): init_06() elif not hasattr(deluge,'pref'): init_05() @@ -128,7 +136,7 @@ TORRENT_KEYS = ['distributed_copies', 'download_payload_rate', 'total_payload_download', 'total_payload_upload', 'total_peers', 'total_seeds', 'total_size', 'total_upload', 'total_wanted', 'tracker_status', 'upload_payload_rate', 'upload_rate', - 'uploaded_memory','tracker','state','queue_pos'] + 'uploaded_memory','tracker','state','queue_pos','user_paused'] STATE_MESSAGES = (_("Queued"), _("Checking"), diff --git a/plugins/WebUi/webserver_framework.py b/plugins/WebUi/webserver_framework.py index 6735802d1..faea87b0f 100644 --- a/plugins/WebUi/webserver_framework.py +++ b/plugins/WebUi/webserver_framework.py @@ -224,8 +224,10 @@ def get_torrent_status(torrent_id): else: status.action = "stop" - if status.paused: + if status.user_paused: status.message = _("Paused %s%%") % status.progress + elif status.paused: + status.message = _("Queued %s%%") % status.progress else: status.message = "%s %i%%" % (ws.STATE_MESSAGES[status.state] , status.progress) @@ -293,6 +295,7 @@ template.Template.globals.update({ 'rev': 'rev.%s' % (REVNO, ), 'version': VERSION, 'getcookie':getcookie, + 'js_enabled': lambda : ws.config.get('use_javascript'), 'get': lambda (var): getattr(web.input(**{var:None}), var) # unreadable :-( }) #/template-defs @@ -304,7 +307,12 @@ def create_webserver(urls, methods): func = webapi.wsgifunc(webpyfunc(urls, methods, False)) server_address=("0.0.0.0", int(ws.config.get('port'))) + server = CherryPyWSGIServer(server_address, func, server_name="localhost") + if ws.config.get('use_https'): + server.ssl_certificate = ws.config.get('ssl_certificate') + server.ssl_private_key = ws.config.get('ssl_private_key') + print "http://%s:%d/" % server_address return server