From 6eae782f13953dd0ba2bbe1b582cf33fd4d7d90a Mon Sep 17 00:00:00 2001 From: RaNaN Date: Mon, 19 Dec 2011 23:10:49 +0100 Subject: configparser v2, warning CONFIG will be DELETED. --- module/web/pyload_app.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index df4a4b3d4..5e6d18584 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -241,17 +241,16 @@ def get_download(path): @route("/settings") @login_required('SETTINGS') def config(): - conf = PYLOAD.getConfig() - plugin = PYLOAD.getPluginConfig() + conf = PYLOAD.getConfigPointer() conf_menu = [] plugin_menu = [] - for entry in sorted(conf.keys()): - conf_menu.append((entry, conf[entry].description)) + for section, data in conf.getBaseSections(): + conf_menu.append((section, data.name)) - for entry in sorted(plugin.keys()): - plugin_menu.append((entry, plugin[entry].description)) + for section, data in conf.getPluginSections(): + plugin_menu.append((section, data.name)) accs = PYLOAD.getAccounts(False) -- cgit v1.2.3 From 958bf611f5d9d117f19f824990ec6fd6b537e967 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Thu, 22 Dec 2011 23:45:38 +0100 Subject: accountmanager v2, delete your accounts.conf and re-enter them in pyload, new nice debug functions, try core.shell() and core.breakpoint() --- module/web/pyload_app.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 5e6d18584..a025f6bcb 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -189,7 +189,7 @@ def collector(): def downloads(): root = PYLOAD.getConfigValue("general", "download_folder") - if not isdir(root): + if not isdir(fs_encode(root)): return base([_('Download directory not found.')]) data = { 'folder': [], @@ -254,31 +254,27 @@ def config(): accs = PYLOAD.getAccounts(False) + # prefix attributes with _, because we would change them directly on the object otherweise for data in accs: if data.trafficleft == -1: - data.trafficleft = _("unlimited") + data._trafficleft = _("unlimited") elif not data.trafficleft: - data.trafficleft = _("not available") + data._trafficleft = _("not available") else: - data.trafficleft = formatSize(data.trafficleft * 1024) + data._trafficleft = formatSize(data.trafficleft * 1024) if data.validuntil == -1: - data.validuntil = _("unlimited") - elif not data.validuntil : - data.validuntil = _("not available") + data._validuntil = _("unlimited") + elif not data.validuntil: + data._validuntil = _("not available") else: t = time.localtime(data.validuntil) - data.validuntil = time.strftime("%d.%m.%Y", t) + data._validuntil = time.strftime("%d.%m.%Y", t) - if "time" in data.options: - try: - data.options["time"] = data.options["time"][0] - except: - data.options["time"] = "0:00-0:00" + if not data.options["time"]: + data.options["time"] = "0:00-0:00" - if "limitDL" in data.options: - data.options["limitdl"] = data.options["limitDL"][0] - else: + if not data.options["limitDL"]: data.options["limitdl"] = "0" return render_to_response('settings.html', -- cgit v1.2.3 From b877847094b0ba03a098dff0fd769eb456b48dd1 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Fri, 6 Jan 2012 17:54:53 +0100 Subject: several improvements, also closes #486, #487 --- module/web/pyload_app.py | 1 + 1 file changed, 1 insertion(+) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index a025f6bcb..f73defb45 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -506,6 +506,7 @@ def setup(): return render_to_response('setup.html', {"user": False, "perms": False}) +@login_required("STATUS") @route("/info") def info(): conf = PYLOAD.getConfigDict() -- cgit v1.2.3 From bac28b7740aae772636d8b90e291d9c17dfd59a7 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Sun, 8 Jan 2012 14:44:59 +0100 Subject: new MultiHoster hook --- module/web/pyload_app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index f73defb45..fffa19b48 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -246,10 +246,10 @@ def config(): conf_menu = [] plugin_menu = [] - for section, data in conf.getBaseSections(): + for section, data in sorted(conf.getBaseSections()): conf_menu.append((section, data.name)) - for section, data in conf.getPluginSections(): + for section, data in sorted(conf.getPluginSections()): plugin_menu.append((section, data.name)) accs = PYLOAD.getAccounts(False) -- cgit v1.2.3 From 1ecdd9f6b53fec45e1d48592e3ff56aa7a576bec Mon Sep 17 00:00:00 2001 From: RaNaN Date: Sun, 8 Jan 2012 16:47:52 +0100 Subject: some cleanups, closed #490 --- module/web/pyload_app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index fffa19b48..a19dce24c 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -22,7 +22,6 @@ from operator import itemgetter, attrgetter import time import os import sys -from os import listdir from os.path import isdir, isfile, join, abspath from sys import getfilesystemencoding from urllib import unquote @@ -36,7 +35,8 @@ from utils import render_to_response, parse_permissions, parse_userdata, \ from filters import relpath, unquotepath -from module.utils import formatSize, save_join, fs_encode, fs_decode +from module.utils import formatSize +from module.utils.fs import save_join, fs_encode, fs_decode, listdir # Helper -- cgit v1.2.3 From cda057e979cbdc8022687e1810b876b371c8c11f Mon Sep 17 00:00:00 2001 From: RaNaN Date: Fri, 13 Jan 2012 10:58:51 +0100 Subject: fix info page, removed icons --- module/web/pyload_app.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index a19dce24c..dcfc3266e 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -36,7 +36,7 @@ from utils import render_to_response, parse_permissions, parse_userdata, \ from filters import relpath, unquotepath from module.utils import formatSize -from module.utils.fs import save_join, fs_encode, fs_decode, listdir +from module.utils.fs import save_join, fs_encode, fs_decode, listdir, free_space # Helper @@ -509,7 +509,7 @@ def setup(): @login_required("STATUS") @route("/info") def info(): - conf = PYLOAD.getConfigDict() + conf = PYLOAD.getConfigPointer() if hasattr(os, "uname"): extra = os.uname() @@ -520,10 +520,10 @@ def info(): "os": " ".join((os.name, sys.platform) + extra), "version": PYLOAD.getServerVersion(), "folder": abspath(PYLOAD_DIR), "config": abspath(""), - "download": abspath(conf["general"]["download_folder"]["value"]), + "download": abspath(conf["general"]["download_folder"]), "freespace": formatSize(PYLOAD.freeSpace()), - "remote": conf["remote"]["port"]["value"], - "webif": conf["webinterface"]["port"]["value"], - "language": conf["general"]["language"]["value"]} + "remote": conf["remote"]["port"], + "webif": conf["webinterface"]["port"], + "language": conf["general"]["language"]} return render_to_response("info.html", data, [pre_processor]) -- cgit v1.2.3 From 4df2b77fdf42046fe19bd371be7c7255986b5980 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Tue, 6 Mar 2012 13:36:39 +0100 Subject: renamed hooks to addons, new filemanager and database, many new api methods you will loose ALL your LINKS, webinterface will NOT work --- module/web/pyload_app.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index dcfc3266e..4edc6e0a5 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -25,6 +25,7 @@ import sys from os.path import isdir, isfile, join, abspath from sys import getfilesystemencoding from urllib import unquote +from traceback import print_exc from bottle import route, static_file, request, response, redirect, HTTPError, error @@ -35,8 +36,8 @@ from utils import render_to_response, parse_permissions, parse_userdata, \ from filters import relpath, unquotepath -from module.utils import formatSize -from module.utils.fs import save_join, fs_encode, fs_decode, listdir, free_space +from module.utils import format_size +from module.utils.fs import save_join, fs_encode, fs_decode, listdir # Helper @@ -79,7 +80,7 @@ def error500(error): if error.traceback: print error.traceback - return base(["An Error occured, please enable debug mode to get more details.", error, + return base(["An error occured while processing the request.", error, error.traceback.replace("\n", "
") if error.traceback else "No Traceback"]) # render js @@ -151,10 +152,11 @@ def logout(): @login_required("LIST") def home(): try: - res = [toDict(x) for x in PYLOAD.statusDownloads()] + res = [toDict(x) for x in PYLOAD.getProgressInfo()] except: s = request.environ.get('beaker.session') s.delete() + print_exc() return redirect("/login") for link in res: @@ -241,7 +243,7 @@ def get_download(path): @route("/settings") @login_required('SETTINGS') def config(): - conf = PYLOAD.getConfigPointer() + conf = PYLOAD.getConfigRef() conf_menu = [] plugin_menu = [] @@ -509,7 +511,7 @@ def setup(): @login_required("STATUS") @route("/info") def info(): - conf = PYLOAD.getConfigPointer() + conf = PYLOAD.getConfigRef() if hasattr(os, "uname"): extra = os.uname() @@ -521,7 +523,7 @@ def info(): "version": PYLOAD.getServerVersion(), "folder": abspath(PYLOAD_DIR), "config": abspath(""), "download": abspath(conf["general"]["download_folder"]), - "freespace": formatSize(PYLOAD.freeSpace()), + "freespace": format_size(PYLOAD.freeSpace()), "remote": conf["remote"]["port"], "webif": conf["webinterface"]["port"], "language": conf["general"]["language"]} -- cgit v1.2.3 From 50d4df8b4d48b855bd18e9922355b7f3f2b4da4e Mon Sep 17 00:00:00 2001 From: RaNaN Date: Tue, 20 Mar 2012 14:57:45 +0100 Subject: captcha decrypting for all plugin types, new interaction manager --- module/web/pyload_app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 4edc6e0a5..4c448d2cd 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -36,6 +36,7 @@ from utils import render_to_response, parse_permissions, parse_userdata, \ from filters import relpath, unquotepath +from module.Api import Output from module.utils import format_size from module.utils.fs import save_join, fs_encode, fs_decode, listdir @@ -52,7 +53,7 @@ def pre_processor(): if user["is_authenticated"]: status = PYLOAD.statusServer() info = PYLOAD.getInfoByPlugin("UpdateManager") - captcha = PYLOAD.isCaptchaWaiting() + captcha = PYLOAD.isInteractionWaiting(Output.Captcha) # check if update check is available if info: -- cgit v1.2.3 From 829244a6140763712d50ed046c33f415f2b04301 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Tue, 15 May 2012 19:22:34 +0200 Subject: some multiuser db changes --- module/web/pyload_app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 4c448d2cd..2234b76c6 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -36,7 +36,7 @@ from utils import render_to_response, parse_permissions, parse_userdata, \ from filters import relpath, unquotepath -from module.Api import Output +from module.Api import Output, Permission from module.utils import format_size from module.utils.fs import save_join, fs_encode, fs_decode, listdir @@ -150,7 +150,7 @@ def logout(): @route("/") @route("/home") -@login_required("LIST") +@login_required("List") def home(): try: res = [toDict(x) for x in PYLOAD.getProgressInfo()] @@ -168,7 +168,7 @@ def home(): @route("/queue") -@login_required("LIST") +@login_required("List") def queue(): queue = PYLOAD.getQueue() -- cgit v1.2.3 From a8f763fb85756f69899f7b3b71c01bb01461ee3c Mon Sep 17 00:00:00 2001 From: RaNaN Date: Fri, 10 Aug 2012 22:12:10 +0200 Subject: beginning new pyload web-ui from scratch --- module/web/pyload_app.py | 431 +++-------------------------------------------- 1 file changed, 24 insertions(+), 407 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 2234b76c6..ba74d7083 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -16,32 +16,23 @@ @author: RaNaN """ -from datetime import datetime -from operator import itemgetter, attrgetter - import time -import os -import sys -from os.path import isdir, isfile, join, abspath -from sys import getfilesystemencoding -from urllib import unquote -from traceback import print_exc +from os.path import join from bottle import route, static_file, request, response, redirect, HTTPError, error -from webinterface import PYLOAD, PYLOAD_DIR, PROJECT_DIR, SETUP, env - -from utils import render_to_response, parse_permissions, parse_userdata, \ - login_required, get_permission, set_permission, permlist, toDict, set_session +from webinterface import PYLOAD, PROJECT_DIR, SETUP, env -from filters import relpath, unquotepath +from utils import render_to_response, parse_permissions, parse_userdata, set_session -from module.Api import Output, Permission -from module.utils import format_size -from module.utils.fs import save_join, fs_encode, fs_decode, listdir +from module.Api import Output +########## # Helper +########## + +# TODO: useful but needs a rewrite, too def pre_processor(): s = request.environ.get('beaker.session') user = parse_userdata(s) @@ -70,11 +61,11 @@ def pre_processor(): 'plugins': plugins} + def base(messages): return render_to_response('base.html', {'messages': messages}, [pre_processor]) -## Views @error(500) def error500(error): print "An error occured while processing the request." @@ -84,8 +75,8 @@ def error500(error): return base(["An error occured while processing the request.", error, error.traceback.replace("\n", "
") if error.traceback else "No Traceback"]) -# render js -@route("/media/js/") +# TODO: not working +# @route("/static/js/") def js_dynamic(path): response.headers['Expires'] = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(time.time() + 60 * 60 * 24 * 2)) @@ -94,24 +85,29 @@ def js_dynamic(path): try: # static files are not rendered - if "static" not in path and "mootools" not in path: + if "static" not in path: t = env.get_template("js/%s" % path) return t.render() else: - return static_file(path, root=join(PROJECT_DIR, "media", "js")) + return static_file(path, root=join(PROJECT_DIR, "static", "js")) except: return HTTPError(404, "Not Found") -@route('/media/') +@route('/static/') def server_static(path): response.headers['Expires'] = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(time.time() + 60 * 60 * 24 * 7)) response.headers['Cache-control'] = "public" - return static_file(path, root=join(PROJECT_DIR, "media")) + return static_file(path, root=join(PROJECT_DIR, "static")) @route('/favicon.ico') def favicon(): - return static_file("favicon.ico", root=join(PROJECT_DIR, "media", "img")) + return static_file("favicon.ico", root=join(PROJECT_DIR, "static", "img")) + + +########## +# Views +########## @route('/login', method="GET") @@ -124,7 +120,7 @@ def login(): @route('/nopermission') def nopermission(): - return base([_("You dont have permission to access this page.")]) + return base([_("You don't have permission to access this page.")]) @route("/login", method="POST") @@ -147,386 +143,7 @@ def logout(): s.delete() return render_to_response("logout.html", proc=[pre_processor]) - @route("/") -@route("/home") -@login_required("List") -def home(): - try: - res = [toDict(x) for x in PYLOAD.getProgressInfo()] - except: - s = request.environ.get('beaker.session') - s.delete() - print_exc() - return redirect("/login") - - for link in res: - if link["status"] == 12: - link["information"] = "%s kB @ %s kB/s" % (link["size"] - link["bleft"], link["speed"]) - - return render_to_response("home.html", {"res": res}, [pre_processor]) - - -@route("/queue") -@login_required("List") -def queue(): - queue = PYLOAD.getQueue() - - queue.sort(key=attrgetter("order")) - - return render_to_response('queue.html', {'content': queue, 'target': 1}, [pre_processor]) - - -@route("/collector") -@login_required('LIST') -def collector(): - queue = PYLOAD.getCollector() - - queue.sort(key=attrgetter("order")) - - return render_to_response('queue.html', {'content': queue, 'target': 0}, [pre_processor]) - - -@route("/downloads") -@login_required('DOWNLOAD') -def downloads(): - root = PYLOAD.getConfigValue("general", "download_folder") - - if not isdir(fs_encode(root)): - return base([_('Download directory not found.')]) - data = { - 'folder': [], - 'files': [] - } - - items = listdir(fs_encode(root)) - - for item in sorted([fs_decode(x) for x in items]): - if isdir(save_join(root, item)): - folder = { - 'name': item, - 'path': item, - 'files': [] - } - files = listdir(save_join(root, item)) - for file in sorted([fs_decode(x) for x in files]): - try: - if isfile(save_join(root, item, file)): - folder['files'].append(file) - except: - pass - - data['folder'].append(folder) - elif isfile(join(root, item)): - data['files'].append(item) - - return render_to_response('downloads.html', {'files': data}, [pre_processor]) - - -@route("/downloads/get/") -@login_required("DOWNLOAD") -def get_download(path): - path = unquote(path).decode("utf8") - #@TODO some files can not be downloaded - - root = PYLOAD.getConfigValue("general", "download_folder") - - path = path.replace("..", "") - try: - return static_file(fs_encode(path), fs_encode(root)) - - except Exception, e: - print e - return HTTPError(404, "File not Found.") - - - -@route("/settings") -@login_required('SETTINGS') -def config(): - conf = PYLOAD.getConfigRef() - - conf_menu = [] - plugin_menu = [] - - for section, data in sorted(conf.getBaseSections()): - conf_menu.append((section, data.name)) - - for section, data in sorted(conf.getPluginSections()): - plugin_menu.append((section, data.name)) - - accs = PYLOAD.getAccounts(False) - - # prefix attributes with _, because we would change them directly on the object otherweise - for data in accs: - if data.trafficleft == -1: - data._trafficleft = _("unlimited") - elif not data.trafficleft: - data._trafficleft = _("not available") - else: - data._trafficleft = formatSize(data.trafficleft * 1024) - - if data.validuntil == -1: - data._validuntil = _("unlimited") - elif not data.validuntil: - data._validuntil = _("not available") - else: - t = time.localtime(data.validuntil) - data._validuntil = time.strftime("%d.%m.%Y", t) - - if not data.options["time"]: - data.options["time"] = "0:00-0:00" - - if not data.options["limitDL"]: - data.options["limitdl"] = "0" - - return render_to_response('settings.html', - {'conf': {'plugin': plugin_menu, 'general': conf_menu, 'accs': accs}, 'types': PYLOAD.getAccountTypes()}, - [pre_processor]) - - -@route("/filechooser") -@route("/pathchooser") -@route("/filechooser/:file#.+#") -@route("/pathchooser/:path#.+#") -@login_required('STATUS') -def path(file="", path=""): - if file: - type = "file" - else: - type = "folder" +def index(): + return base(["It works!"]) - path = os.path.normpath(unquotepath(path)) - - if os.path.isfile(path): - oldfile = path - path = os.path.dirname(path) - else: - oldfile = '' - - abs = False - - if os.path.isdir(path): - if os.path.isabs(path): - cwd = os.path.abspath(path) - abs = True - else: - cwd = relpath(path) - else: - cwd = os.getcwd() - - try: - cwd = cwd.encode("utf8") - except: - pass - - cwd = os.path.normpath(os.path.abspath(cwd)) - parentdir = os.path.dirname(cwd) - if not abs: - if os.path.abspath(cwd) == "/": - cwd = relpath(cwd) - else: - cwd = relpath(cwd) + os.path.sep - parentdir = relpath(parentdir) + os.path.sep - - if os.path.abspath(cwd) == "/": - parentdir = "" - - try: - folders = os.listdir(cwd) - except: - folders = [] - - files = [] - - for f in folders: - try: - f = f.decode(getfilesystemencoding()) - data = {'name': f, 'fullpath': join(cwd, f)} - data['sort'] = data['fullpath'].lower() - data['modified'] = datetime.fromtimestamp(int(os.path.getmtime(join(cwd, f)))) - data['ext'] = os.path.splitext(f)[1] - except: - continue - - if os.path.isdir(join(cwd, f)): - data['type'] = 'dir' - else: - data['type'] = 'file' - - if os.path.isfile(join(cwd, f)): - data['size'] = os.path.getsize(join(cwd, f)) - - power = 0 - while (data['size'] / 1024) > 0.3: - power += 1 - data['size'] /= 1024. - units = ('', 'K', 'M', 'G', 'T') - data['unit'] = units[power] + 'Byte' - else: - data['size'] = '' - - files.append(data) - - files = sorted(files, key=itemgetter('type', 'sort')) - - return render_to_response('pathchooser.html', - {'cwd': cwd, 'files': files, 'parentdir': parentdir, 'type': type, 'oldfile': oldfile, - 'absolute': abs}, []) - - -@route("/logs") -@route("/logs", method="POST") -@route("/logs/:item") -@route("/logs/:item", method="POST") -@login_required('LOGS') -def logs(item=-1): - s = request.environ.get('beaker.session') - - perpage = s.get('perpage', 34) - reversed = s.get('reversed', False) - - warning = "" - conf = PYLOAD.getConfigValue("log","file_log") - if not conf: - warning = "Warning: File log is disabled, see settings page." - - perpage_p = ((20, 20), (34, 34), (40, 40), (100, 100), (0, 'all')) - fro = None - - if request.environ.get('REQUEST_METHOD', "GET") == "POST": - try: - fro = datetime.strptime(request.forms['from'], '%d.%m.%Y %H:%M:%S') - except: - pass - try: - perpage = int(request.forms['perpage']) - s['perpage'] = perpage - - reversed = bool(request.forms.get('reversed', False)) - s['reversed'] = reversed - except: - pass - - s.save() - - try: - item = int(item) - except: - pass - - log = PYLOAD.getLog() - if not perpage: - item = 0 - - if item < 1 or type(item) is not int: - item = 1 if len(log) - perpage + 1 < 1 else len(log) - perpage + 1 - - if type(fro) is datetime: # we will search for datetime - item = -1 - - data = [] - counter = 0 - perpagecheck = 0 - for l in log: - counter += 1 - - if counter >= item: - try: - date, time, level, message = l.decode("utf8", "ignore").split(" ", 3) - dtime = datetime.strptime(date + ' ' + time, '%d.%m.%Y %H:%M:%S') - except: - dtime = None - date = '?' - time = ' ' - level = '?' - message = l - if item == -1 and dtime is not None and fro <= dtime: - item = counter #found our datetime - if item >= 0: - data.append({'line': counter, 'date': date + " " + time, 'level': level, 'message': message}) - perpagecheck += 1 - if fro is None and dtime is not None: #if fro not set set it to first showed line - fro = dtime - if perpagecheck >= perpage > 0: - break - - if fro is None: #still not set, empty log? - fro = datetime.now() - if reversed: - data.reverse() - return render_to_response('logs.html', {'warning': warning, 'log': data, 'from': fro.strftime('%d.%m.%Y %H:%M:%S'), - 'reversed': reversed, 'perpage': perpage, 'perpage_p': sorted(perpage_p), - 'iprev': 1 if item - perpage < 1 else item - perpage, - 'inext': (item + perpage) if item + perpage < len(log) else item}, - [pre_processor]) - - -@route("/admin") -@route("/admin", method="POST") -@login_required("ADMIN") -def admin(): - # convert to dict - user = dict([(name, toDict(y)) for name, y in PYLOAD.getAllUserData().iteritems()]) - perms = permlist() - - for data in user.itervalues(): - data["perms"] = {} - get_permission(data["perms"], data["permission"]) - data["perms"]["admin"] = True if data["role"] is 0 else False - - - s = request.environ.get('beaker.session') - if request.environ.get('REQUEST_METHOD', "GET") == "POST": - for name in user: - if request.POST.get("%s|admin" % name, False): - user[name]["role"] = 0 - user[name]["perms"]["admin"] = True - elif name != s["name"]: - user[name]["role"] = 1 - user[name]["perms"]["admin"] = False - - # set all perms to false - for perm in perms: - user[name]["perms"][perm] = False - - - for perm in request.POST.getall("%s|perms" % name): - user[name]["perms"][perm] = True - - user[name]["permission"] = set_permission(user[name]["perms"]) - - PYLOAD.setUserPermission(name, user[name]["permission"], user[name]["role"]) - - return render_to_response("admin.html", {"users": user, "permlist": perms}, [pre_processor]) - - -@route("/setup") -def setup(): - if PYLOAD or not SETUP: - return base([_("Run pyLoadCore.py -s to access the setup.")]) - - return render_to_response('setup.html', {"user": False, "perms": False}) - - -@login_required("STATUS") -@route("/info") -def info(): - conf = PYLOAD.getConfigRef() - - if hasattr(os, "uname"): - extra = os.uname() - else: - extra = tuple() - - data = {"python": sys.version, - "os": " ".join((os.name, sys.platform) + extra), - "version": PYLOAD.getServerVersion(), - "folder": abspath(PYLOAD_DIR), "config": abspath(""), - "download": abspath(conf["general"]["download_folder"]), - "freespace": format_size(PYLOAD.freeSpace()), - "remote": conf["remote"]["port"], - "webif": conf["webinterface"]["port"], - "language": conf["general"]["language"]} - - return render_to_response("info.html", data, [pre_processor]) -- cgit v1.2.3 From 941e3021000e59020f66419cc2156aee30972121 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Mon, 13 Aug 2012 17:40:10 +0200 Subject: working login --- module/web/pyload_app.py | 50 ++++++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index ba74d7083..afb97b361 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -23,43 +23,27 @@ from bottle import route, static_file, request, response, redirect, HTTPError, e from webinterface import PYLOAD, PROJECT_DIR, SETUP, env -from utils import render_to_response, parse_permissions, parse_userdata, set_session +from utils import render_to_response, login_required, set_session, get_user_api -from module.Api import Output ########## # Helper ########## - # TODO: useful but needs a rewrite, too def pre_processor(): s = request.environ.get('beaker.session') - user = parse_userdata(s) - perms = parse_permissions(s) - status = {} - captcha = False - update = False - plugins = False - if user["is_authenticated"]: - status = PYLOAD.statusServer() - info = PYLOAD.getInfoByPlugin("UpdateManager") - captcha = PYLOAD.isInteractionWaiting(Output.Captcha) - - # check if update check is available - if info: - if info["pyload"] == "True": update = True - if info["plugins"] == "True": plugins = True + api = get_user_api(s) + user = None + status = None + if api is not None: + user = api.user + status = api.statusServer() return {"user": user, - 'status': status, - 'captcha': captcha, - 'perms': perms, - 'url': request.url, - 'update': update, - 'plugins': plugins} - + 'server': status, + 'url': request.url } def base(messages): @@ -68,11 +52,11 @@ def base(messages): @error(500) def error500(error): - print "An error occured while processing the request." + print "An error occurred while processing the request." if error.traceback: print error.traceback - return base(["An error occured while processing the request.", error, + return base(["An error occurred while processing the request.", error, error.traceback.replace("\n", "
") if error.traceback else "No Traceback"]) # TODO: not working @@ -125,15 +109,14 @@ def nopermission(): @route("/login", method="POST") def login_post(): - user = request.forms.get("username") + username = request.forms.get("username") password = request.forms.get("password") - info = PYLOAD.checkAuth(user, password) - - if not info: + user = PYLOAD.checkAuth(username, password) + if not user: return render_to_response("login.html", {"errors": True}, [pre_processor]) - set_session(request, info) + set_session(request, user) return redirect("/") @@ -144,6 +127,7 @@ def logout(): return render_to_response("logout.html", proc=[pre_processor]) @route("/") -def index(): +@login_required() +def index(api): return base(["It works!"]) -- cgit v1.2.3 From 90ba0c9f3adccd02b62ec3ca6b4af849a7253d14 Mon Sep 17 00:00:00 2001 From: godofdream Date: Tue, 14 Aug 2012 22:37:58 +0200 Subject: first Design of Queue and Settings --- module/web/pyload_app.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index afb97b361..843919b85 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -126,6 +126,16 @@ def logout(): s.delete() return render_to_response("logout.html", proc=[pre_processor]) +@route("/queue") +@login_required() +def index(api): + return render_to_response("queue.html", proc=[pre_processor]) + +@route("/settings") +@login_required() +def index(api): + return render_to_response("settings.html", proc=[pre_processor]) + @route("/") @login_required() def index(api): -- cgit v1.2.3 From d8119f648e63a4728433e67e79d2a99296a8c2c1 Mon Sep 17 00:00:00 2001 From: godofdream Date: Thu, 16 Aug 2012 17:48:39 +0200 Subject: Added Mobile WebIf, some Layouting --- module/web/pyload_app.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 843919b85..eaaabd58e 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -23,7 +23,7 @@ from bottle import route, static_file, request, response, redirect, HTTPError, e from webinterface import PYLOAD, PROJECT_DIR, SETUP, env -from utils import render_to_response, login_required, set_session, get_user_api +from utils import render_to_response, login_required, set_session, get_user_api, is_mobile ########## @@ -99,8 +99,10 @@ def login(): if not PYLOAD and SETUP: redirect("/setup") else: - return render_to_response("login.html", proc=[pre_processor]) - + if is_mobile(): + return render_to_response("app_login.html", proc=[pre_processor]) + else: + return render_to_response("login.html", proc=[pre_processor]) @route('/nopermission') def nopermission(): @@ -111,19 +113,30 @@ def nopermission(): def login_post(): username = request.forms.get("username") password = request.forms.get("password") - user = PYLOAD.checkAuth(username, password) - if not user: - return render_to_response("login.html", {"errors": True}, [pre_processor]) - + if is_mobile(): + response.set_cookie("mobile", str(True)) + if not user: + return render_to_response("app_login.html", {"errors": True}, [pre_processor]) + else: + response.set_cookie("mobile", str(False)) + if not user: + return render_to_response("login.html", {"errors": True}, [pre_processor]) + set_session(request, user) return redirect("/") +@route("/toggle_mobile") +def toggle_mobile(): + response.set_cookie("mobile", str(not is_mobile())) + return redirect("/login") @route("/logout") def logout(): s = request.environ.get('beaker.session') s.delete() + if is_mobile(): + return render_to_response("app_login.html", {"logout": True}, [pre_processor]) return render_to_response("logout.html", proc=[pre_processor]) @route("/queue") -- cgit v1.2.3 From 7bc7de7332670f692eda576787e671c2eba0e5bb Mon Sep 17 00:00:00 2001 From: godofdream Date: Fri, 17 Aug 2012 01:29:03 +0200 Subject: added division into default template and mobile template, added Base site --- module/web/pyload_app.py | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index eaaabd58e..92ad88944 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -96,13 +96,12 @@ def favicon(): @route('/login', method="GET") def login(): + # set mobilecookie to reduce is_mobile check-time + response.set_cookie("mobile", str(is_mobile())) if not PYLOAD and SETUP: redirect("/setup") else: - if is_mobile(): - return render_to_response("app_login.html", proc=[pre_processor]) - else: - return render_to_response("login.html", proc=[pre_processor]) + return render_to_response("login.html", proc=[pre_processor]) @route('/nopermission') def nopermission(): @@ -114,30 +113,21 @@ def login_post(): username = request.forms.get("username") password = request.forms.get("password") user = PYLOAD.checkAuth(username, password) - if is_mobile(): - response.set_cookie("mobile", str(True)) - if not user: - return render_to_response("app_login.html", {"errors": True}, [pre_processor]) - else: - response.set_cookie("mobile", str(False)) - if not user: - return render_to_response("login.html", {"errors": True}, [pre_processor]) - + if not user: + return render_to_response("login.html", {"errors": True}, [pre_processor]) set_session(request, user) return redirect("/") @route("/toggle_mobile") def toggle_mobile(): response.set_cookie("mobile", str(not is_mobile())) - return redirect("/login") + return redirect("/") @route("/logout") def logout(): s = request.environ.get('beaker.session') s.delete() - if is_mobile(): - return render_to_response("app_login.html", {"logout": True}, [pre_processor]) - return render_to_response("logout.html", proc=[pre_processor]) + return render_to_response("login.html", {"logout": True}, proc=[pre_processor]) @route("/queue") @login_required() -- cgit v1.2.3 From 89e803a1e8364a3d32dcdb2ff445959723b974b1 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Fri, 17 Aug 2012 16:25:49 +0200 Subject: completed renaming --- module/web/pyload_app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 92ad88944..7be4975a7 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -131,12 +131,12 @@ def logout(): @route("/queue") @login_required() -def index(api): +def queue(api): return render_to_response("queue.html", proc=[pre_processor]) @route("/settings") @login_required() -def index(api): +def settings(api): return render_to_response("settings.html", proc=[pre_processor]) @route("/") -- cgit v1.2.3 From 6a8303b004e1976739371431aa7358c672ad7313 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Sun, 16 Sep 2012 21:45:10 +0200 Subject: added bootstrap --- module/web/pyload_app.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 7be4975a7..04cd07cb2 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -84,6 +84,13 @@ def server_static(path): response.headers['Cache-control'] = "public" return static_file(path, root=join(PROJECT_DIR, "static")) +@route('/templates/') +def serve_template(path): + """ Serve backbone templates """ + args = path.split("/") + args.insert(1, "backbone") + return static_file("/".join(args), root=join(PROJECT_DIR, "templates")) + @route('/favicon.ico') def favicon(): return static_file("favicon.ico", root=join(PROJECT_DIR, "static", "img")) -- cgit v1.2.3 From 68f1510f5a6ab632db19fc63f29c0475de9feb9d Mon Sep 17 00:00:00 2001 From: RaNaN Date: Mon, 17 Sep 2012 15:46:42 +0200 Subject: nav + search bar for dashboard --- module/web/pyload_app.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'module/web/pyload_app.py') diff --git a/module/web/pyload_app.py b/module/web/pyload_app.py index 04cd07cb2..8401e1778 100644 --- a/module/web/pyload_app.py +++ b/module/web/pyload_app.py @@ -136,18 +136,13 @@ def logout(): s.delete() return render_to_response("login.html", {"logout": True}, proc=[pre_processor]) -@route("/queue") +@route("/") @login_required() -def queue(api): - return render_to_response("queue.html", proc=[pre_processor]) +def index(api): + return render_to_response("dashboard.html", proc=[pre_processor]) @route("/settings") @login_required() def settings(api): return render_to_response("settings.html", proc=[pre_processor]) -@route("/") -@login_required() -def index(api): - return base(["It works!"]) - -- cgit v1.2.3