# -*- coding: utf-8 -*- # Create your views here. import mimetypes from os import listdir from os import stat from os.path import isdir from os.path import isfile from os.path import join from urllib import unquote from itertools import chain from django.conf import settings from django.contrib.auth.decorators import login_required from django.http import HttpResponse from django.http import HttpResponseNotFound from django.shortcuts import render_to_response from django.template import RequestContext from django.utils.translation import ugettext as _ def check_server(function): def _dec(view_func): def _view(request, * args, ** kwargs): try: version = settings.PYLOAD.get_server_version() except Exception, e: return base(request, messages=[_('Can\'t connect to pyLoad. Please check your configuration and make sure pyLoad is running.'), str(e)]) return view_func(request, * args, ** kwargs) _view.__name__ = view_func.__name__ _view.__dict__ = view_func.__dict__ _view.__doc__ = view_func.__doc__ return _view if function is None: return _dec else: return _dec(function) def permission(perm): def _dec(view_func): def _view(request, * args, ** kwargs): if request.user.has_perm(perm) and request.user.is_authenticated(): return view_func(request, * args, ** kwargs) else: return base(request, messages=[_('You don\'t have permission to view this page.')]) _view.__name__ = view_func.__name__ _view.__dict__ = view_func.__dict__ _view.__doc__ = view_func.__doc__ return _view return _dec def status_proc(request): return {'status': settings.PYLOAD.status_server(), 'captcha': settings.PYLOAD.is_captcha_waiting()} def base(request, messages): return render_to_response(join(settings.TEMPLATE, 'base.html'), {'messages': messages}, RequestContext(request)) @login_required @permission('pyload.can_see_dl') @check_server def home(request): res = settings.PYLOAD.status_downloads() for link in res: if link["status"] == 12: link["information"] = "%s kB @ %s kB/s" % (link["size"] - link["kbleft"], link["speed"]) return render_to_response(join(settings.TEMPLATE, 'home.html'), RequestContext(request, {'content': res}, [status_proc])) @login_required @permission('pyload.can_see_dl') @check_server def queue(request): queue = settings.PYLOAD.get_queue() for package in queue.itervalues(): for pyfile in package["links"].itervalues(): if pyfile["status"] == 0: pyfile["icon"] = "status_finished.png" elif pyfile["status"] in (2,3): pyfile["icon"] = "status_queue.png" elif pyfile["status"] in (9,1): pyfile["icon"] = "status_offline.png" elif pyfile["status"] == 5: pyfile["icon"] = "status_waiting.png" elif pyfile["status"] == 8: pyfile["icon"] = "status_failed.png" elif pyfile["status"] in (11,13): pyfile["icon"] = "status_proc.png" else: pyfile["icon"] = "status_downloading.png" return render_to_response(join(settings.TEMPLATE, 'queue.html'), RequestContext(request, {'content': queue}, [status_proc])) @login_required @permission('pyload.can_download') @check_server def downloads(request): root = settings.PYLOAD.get_conf_val("general", "download_folder") if not isdir(root): return base(request, [_('Download directory not found.')]) data = { 'folder': [], 'files': [] } for item in listdir(root): if isdir(join(root, item)): folder = { 'name': item, 'path': item, 'files': [] } for file in listdir(join(root, item)): if isfile(join(root, item, file)): folder['files'].append(file) data['folder'].append(folder) elif isfile(join(root, item)): data['files'].append(item) return render_to_response(join(settings.TEMPLATE, 'downloads.html'), RequestContext(request, {'files': data}, [status_proc])) @login_required @permission('pyload.can_download') @check_server def download(request, path): path = unquote(path) path = path.split("/") root = settings.PYLOAD.get_conf_val("general", "download_folder") dir = join(root, path[1].replace('..', '')) if isdir(dir) or isfile(dir): if isdir(dir): filepath = join(dir, path[2]) elif isfile(dir): filepath = dir if isfile(filepath): try: type, encoding = mimetypes.guess_type(filepath) if type is None: type = 'application/octet-stream' response = HttpResponse(mimetype=type) response['Content-Length'] = str(stat(filepath).st_size) if encoding is not None: response['Content-Encoding'] = encoding response.write(file(filepath, "rb").read()) return response except Exception, e: return HttpResponseNotFound("File not Found. %s" % str(e)) return HttpResponseNotFound("File not Found.") @login_required @permission('pyload.can_see_logs') @check_server def logs(request, page=0): page = int(page) log = settings.PYLOAD.get_log(page) data = [] try: for i in range(0, 20): data.append({'line': i + 1+page, 'content':log[i]}) except: pass return render_to_response(join(settings.TEMPLATE, 'logs.html'), RequestContext(request, {'log': data, 'next': str(page + 20), 'prev': 0 if page-20 < 0 else page-20}, [status_proc])) @login_required @permission('pyload.can_add_dl') @check_server def collector(request): queue = settings.PYLOAD.get_collector() for package in queue.itervalues(): for pyfile in package["links"].itervalues(): if pyfile["status"] == 0: pyfile["icon"] = "status_finished.png" elif pyfile["status"] in (2,3): pyfile["icon"] = "status_queue.png" elif pyfile["status"] in (9,1): pyfile["icon"] = "status_offline.png" elif pyfile["status"] == 5: pyfile["icon"] = "status_waiting.png" elif pyfile["status"] == 8: pyfile["icon"] = "status_failed.png" elif pyfile["status"] in (11,13): pyfile["icon"] = "status_proc.png" else: pyfile["icon"] = "status_downloading.png" return render_to_response(join(settings.TEMPLATE, 'collector.html'), RequestContext(request, {'content': queue}, [status_proc])) @login_required @permission('pyload.can_change_status') @check_server def config(request): conf = settings.PYLOAD.get_config() plugin = settings.PYLOAD.get_plugin_config() messages = [] for section in chain(conf.itervalues(), plugin.itervalues()): for key, option in section.iteritems(): if key == "desc": continue if ";" in option["type"]: option["list"] = option["type"].split(";") if request.META.get('REQUEST_METHOD', "GET") == "POST": errors = [] for key, value in request.POST.iteritems(): if not "|" in key: continue sec, skey, okey = key.split("|")[:] if sec == "General": if conf.has_key(skey): if conf[skey].has_key(okey): try: if str(conf[skey][okey]['value']) != value: settings.PYLOAD.set_conf_val(skey, okey, value) except Exception, e: errors.append("%s | %s : %s" % (skey, okey, e)) else: continue else: continue elif sec == "Plugin": if plugin.has_key(skey): if plugin[skey].has_key(okey): try: if str(plugin[skey][okey]['value']) != value: settings.PYLOAD.set_conf_val(skey, okey, value, "plugin") except Exception, e: errors.append("%s | %s : %s" % (skey, okey, e)) else: continue else: continue if errors: messages.append(_("Error occured when setting the following options:")) messages.append("") messages += errors else: messages.append(_("All options were set correctly.")) return render_to_response(join(settings.TEMPLATE, 'settings.html'), RequestContext(request, {'conf': {'Plugin':plugin, 'General':conf}, 'errors': messages}, [status_proc]))