Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (dp1
- S'output'
- p2
- S"<type 'exceptions.ImportError'> cannot import name Config"
- p3
- sS'layer'
- p4
- S'/home/mattspence/web2py/applications/admin/controllers/default.py'
- p5
- sS'code'
- p6
- S'# coding: utf8\n\nEXPERIMENTAL_STUFF = True\n\nif EXPERIMENTAL_STUFF:\n if is_mobile:\n response.view = response.view.replace(\'default/\', \'default.mobile/\')\n response.menu = []\n\nimport re\nfrom gluon.admin import *\nfrom gluon.fileutils import abspath, read_file, write_file\nfrom gluon.utils import web2py_uuid\nfrom gluon.tools import Config\nfrom glob import glob\nimport shutil\nimport platform\n\ntry:\n import git\n if git.__version__ < \'0.3.1\':\n raise ImportError("Your version of git is %s. Upgrade to 0.3.1 or better." % git.__version__)\n have_git = True\nexcept ImportError, e:\n have_git = False\n GIT_MISSING = \'Requires gitpython module, but not installed or incompatible version: %s\' % e\n\nfrom gluon.languages import (read_possible_languages, read_dict, write_dict,\n read_plural_dict, write_plural_dict)\n\n\nif DEMO_MODE and request.function in [\'change_password\', \'pack\', \'pack_custom\',\'pack_plugin\', \'upgrade_web2py\', \'uninstall\', \'cleanup\', \'compile_app\', \'remove_compiled_app\', \'delete\', \'delete_plugin\', \'create_file\', \'upload_file\', \'update_languages\', \'reload_routes\', \'git_push\', \'git_pull\']:\n session.flash = T(\'disabled in demo mode\')\n redirect(URL(\'site\'))\n\n\nif not is_manager() and request.function in [\'change_password\', \'upgrade_web2py\']:\n session.flash = T(\'disabled in multi user mode\')\n redirect(URL(\'site\'))\n\nif FILTER_APPS and request.args(0) and not request.args(0) in FILTER_APPS:\n session.flash = T(\'disabled in demo mode\')\n redirect(URL(\'site\'))\n\n\nif not session.token:\n session.token = web2py_uuid()\n\n\ndef count_lines(data):\n return len([line for line in data.split(\'\\n\') if line.strip() and not line.startswith(\'#\')])\n\n\ndef log_progress(app, mode=\'EDIT\', filename=None, progress=0):\n progress_file = os.path.join(apath(app, r=request), \'progress.log\')\n now = str(request.now)[:19]\n if not os.path.exists(progress_file):\n safe_open(progress_file, \'w\').write(\'[%s] START\\n\' % now)\n if filename:\n safe_open(progress_file, \'a\').write(\n \'[%s] %s %s: %s\\n\' % (now, mode, filename, progress))\n\n\ndef safe_open(a, b):\n if DEMO_MODE and (\'w\' in b or \'a\' in b):\n class tmp:\n def write(self, data):\n pass\n return tmp()\n return open(a, b)\n\n\ndef safe_read(a, b=\'r\'):\n safe_file = safe_open(a, b)\n try:\n return safe_file.read()\n finally:\n safe_file.close()\n\n\ndef safe_write(a, value, b=\'w\'):\n safe_file = safe_open(a, b)\n try:\n safe_file.write(value)\n finally:\n safe_file.close()\n\n\ndef get_app(name=None):\n app = name or request.args(0)\n if (app and os.path.exists(apath(app, r=request)) and\n (not MULTI_USER_MODE or is_manager() or\n db(db.app.name == app)(db.app.owner == auth.user.id).count())):\n return app\n session.flash = T(\'App does not exist or you are not authorized\')\n redirect(URL(\'site\'))\n\n\ndef index():\n """ Index handler """\n\n send = request.vars.send\n if DEMO_MODE:\n session.authorized = True\n session.last_time = t0\n if not send:\n send = URL(\'site\')\n if session.authorized:\n redirect(send)\n elif request.vars.password:\n if verify_password(request.vars.password):\n session.authorized = True\n login_record(True)\n\n if CHECK_VERSION:\n session.check_version = True\n else:\n session.check_version = False\n\n session.last_time = t0\n if isinstance(send, list): # ## why does this happen?\n send = str(send[0])\n\n redirect(send)\n else:\n times_denied = login_record(False)\n if times_denied >= allowed_number_of_attempts:\n response.flash = \\\n T(\'admin disabled because too many invalid login attempts\')\n elif times_denied == allowed_number_of_attempts - 1:\n response.flash = \\\n T(\'You have one more login attempt before you are locked out\')\n else:\n response.flash = T(\'invalid password.\')\n return dict(send=send)\n\n\ndef check_version():\n """ Checks if web2py is up to date """\n\n session.forget()\n session._unlock(response)\n\n new_version, version = check_new_version(request.env.web2py_version,\n WEB2PY_VERSION_URL)\n\n if new_version == -1:\n return A(T(\'Unable to check for upgrades\'), _href=WEB2PY_URL)\n elif new_version != True:\n return A(T(\'web2py is up to date\'), _href=WEB2PY_URL)\n elif platform.system().lower() in (\'windows\', \'win32\', \'win64\') and os.path.exists("web2py.exe"):\n return SPAN(\'You should upgrade to %s\' % version.split(\'(\')[0])\n else:\n return sp_button(URL(\'upgrade_web2py\'), T(\'upgrade now to %s\') % version.split(\'(\')[0])\n\n\ndef logout():\n """ Logout handler """\n session.authorized = None\n if MULTI_USER_MODE:\n redirect(URL(\'user/logout\'))\n redirect(URL(\'index\'))\n\n\ndef change_password():\n\n if session.pam_user:\n session.flash = T(\n \'PAM authenticated user, cannot change password here\')\n redirect(URL(\'site\'))\n form = SQLFORM.factory(Field(\'current_admin_password\', \'password\'),\n Field(\'new_admin_password\',\n \'password\', requires=IS_STRONG()),\n Field(\'new_admin_password_again\', \'password\'),\n _class="span4 well")\n if form.accepts(request.vars):\n if not verify_password(request.vars.current_admin_password):\n form.errors.current_admin_password = T(\'invalid password\')\n elif form.vars.new_admin_password != form.vars.new_admin_password_again:\n form.errors.new_admin_password_again = T(\'no match\')\n else:\n path = abspath(\'parameters_%s.py\' % request.env.server_port)\n safe_write(path, \'password="%s"\' % CRYPT()(\n request.vars.new_admin_password)[0])\n session.flash = T(\'password changed\')\n redirect(URL(\'site\'))\n return dict(form=form)\n\n\ndef site():\n """ Site handler """\n\n myversion = request.env.web2py_version\n\n # Shortcut to make the elif statements more legible\n file_or_appurl = \'file\' in request.vars or \'appurl\' in request.vars\n\n class IS_VALID_APPNAME(object):\n def __call__(self, value):\n if not re.compile(\'\\w+\').match(value):\n return (value, T(\'Invalid application name\'))\n if not request.vars.overwrite and \\\n os.path.exists(os.path.join(apath(r=request), value)):\n return (value, T(\'Application exists already\'))\n return (value, None)\n\n is_appname = IS_VALID_APPNAME()\n form_create = SQLFORM.factory(Field(\'name\', requires=is_appname),\n table_name=\'appcreate\')\n form_update = SQLFORM.factory(Field(\'name\', requires=is_appname),\n Field(\'file\', \'upload\', uploadfield=False),\n Field(\'url\'),\n Field(\'overwrite\', \'boolean\'),\n table_name=\'appupdate\')\n form_create.process()\n form_update.process()\n\n if DEMO_MODE:\n pass\n\n elif form_create.accepted:\n # create a new application\n appname = cleanpath(form_create.vars.name)\n created, error = app_create(appname, request, info=True)\n if created:\n if MULTI_USER_MODE:\n db.app.insert(name=appname, owner=auth.user.id)\n log_progress(appname)\n session.flash = T(\'new application "%s" created\', appname)\n redirect(URL(\'design\', args=appname))\n else:\n session.flash = \\\n DIV(T(\'unable to create application "%s"\' % appname),\n PRE(error))\n redirect(URL(r=request))\n\n elif form_update.accepted:\n if (form_update.vars.url or \'\').endswith(\'.git\'):\n if not have_git:\n session.flash = GIT_MISSING\n redirect(URL(r=request))\n target = os.path.join(apath(r=request), form_update.vars.name)\n try:\n new_repo = git.Repo.clone_from(form_update.vars.url, target)\n session.flash = T(\'new application "%s" imported\',\n form_update.vars.name)\n except git.GitCommandError, err:\n session.flash = T(\'Invalid git repository specified.\')\n redirect(URL(r=request))\n\n elif form_update.vars.url:\n # fetch an application via URL or file upload\n try:\n f = urllib.urlopen(form_update.vars.url)\n if f.code == 404:\n raise Exception("404 file not found")\n except Exception, e:\n session.flash = \\\n DIV(T(\'Unable to download app because:\'), PRE(str(e)))\n redirect(URL(r=request))\n fname = form_update.vars.url\n\n elif form_update.accepted and form_update.vars.file:\n fname = request.vars.file.filename\n f = request.vars.file.file\n\n else:\n session.flash = \'No file uploaded and no URL specified\'\n redirect(URL(r=request))\n\n if f:\n appname = cleanpath(form_update.vars.name)\n installed = app_install(appname, f,\n request, fname,\n overwrite=form_update.vars.overwrite)\n if f and installed:\n msg = \'application %(appname)s installed with md5sum: %(digest)s\'\n if MULTI_USER_MODE:\n db.app.insert(name=appname, owner=auth.user.id)\n log_progress(appname)\n session.flash = T(msg, dict(appname=appname,\n digest=md5_hash(installed)))\n elif f and form_update.vars.overwrite:\n msg = \'unable to install application "%(appname)s"\'\n session.flash = T(msg, dict(appname=form_update.vars.name))\n else:\n msg = \'unable to install application "%(appname)s"\'\n session.flash = T(msg, dict(appname=form_update.vars.name))\n redirect(URL(r=request))\n\n regex = re.compile(\'^\\w+$\')\n\n if is_manager():\n apps = [f for f in os.listdir(apath(r=request)) if regex.match(f)]\n else:\n apps = [f.name for f in db(db.app.owner == auth.user_id).select()]\n\n if FILTER_APPS:\n apps = [f for f in apps if f in FILTER_APPS]\n\n apps = sorted(apps, lambda a, b: cmp(a.upper(), b.upper()))\n myplatform = platform.python_version()\n return dict(app=None, apps=apps, myversion=myversion, myplatform=myplatform,\n form_create=form_create, form_update=form_update)\n\n\ndef report_progress(app):\n import datetime\n progress_file = os.path.join(apath(app, r=request), \'progress.log\')\n regex = re.compile(\'\\[(.*?)\\][^\\:]+\\:\\s+(\\-?\\d+)\')\n if not os.path.exists(progress_file):\n return []\n matches = regex.findall(open(progress_file, \'r\').read())\n events, counter = [], 0\n for m in matches:\n if not m:\n continue\n days = -(request.now - datetime.datetime.strptime(m[0],\n \'%Y-%m-%d %H:%M:%S\')).days\n counter += int(m[1])\n events.append([days, counter])\n return events\n\n\ndef pack():\n app = get_app()\n\n try:\n if len(request.args) == 1:\n fname = \'web2py.app.%s.w2p\' % app\n filename = app_pack(app, request, raise_ex=True)\n else:\n fname = \'web2py.app.%s.compiled.w2p\' % app\n filename = app_pack_compiled(app, request, raise_ex=True)\n except Exception, e:\n filename = None\n\n if filename:\n response.headers[\'Content-Type\'] = \'application/w2p\'\n disposition = \'attachment; filename=%s\' % fname\n response.headers[\'Content-Disposition\'] = disposition\n return safe_read(filename, \'rb\')\n else:\n session.flash = T(\'internal error: %s\' % e)\n redirect(URL(\'site\'))\n\ndef pack_plugin():\n app = get_app()\n if len(request.args) == 2:\n fname = \'web2py.plugin.%s.w2p\' % request.args[1]\n filename = plugin_pack(app, request.args[1], request)\n if filename:\n response.headers[\'Content-Type\'] = \'application/w2p\'\n disposition = \'attachment; filename=%s\' % fname\n response.headers[\'Content-Disposition\'] = disposition\n return safe_read(filename, \'rb\')\n else:\n session.flash = T(\'internal error\')\n redirect(URL(\'plugin\', args=request.args))\n\ndef pack_custom():\n app = get_app()\n base = apath(app, r=request)\n if request.post_vars.file:\n files = request.post_vars.file\n files = [files] if not isinstance(files,list) else files\n fname = \'web2py.app.%s.w2p\' % app\n try:\n filename = app_pack(app, request, raise_ex=True, filenames=files)\n except Exception, e:\n filename = None\n if filename:\n response.headers[\'Content-Type\'] = \'application/w2p\'\n disposition = \'attachment; filename=%s\' % fname\n response.headers[\'Content-Disposition\'] = disposition\n return safe_read(filename, \'rb\')\n else:\n session.flash = T(\'internal error: %s\' % e)\n redirect(URL(args=request.args))\n def ignore(fs):\n return [f for f in fs if not (\n f[:1] in \'#\' or f.endswith(\'~\') or f.endswith(\'.bak\'))]\n files = {}\n for (r,d,f) in os.walk(base):\n files[r] = {\'folders\':ignore(d),\'files\':ignore(f)}\n return locals()\n\n\ndef upgrade_web2py():\n dialog = FORM.confirm(T(\'Upgrade\'),\n {T(\'Cancel\'): URL(\'site\')})\n if dialog.accepted:\n (success, error) = upgrade(request)\n if success:\n session.flash = T(\'web2py upgraded; please restart it\')\n else:\n session.flash = T(\'unable to upgrade because "%s"\', error)\n redirect(URL(\'site\'))\n return dict(dialog=dialog)\n\n\ndef uninstall():\n app = get_app()\n\n dialog = FORM.confirm(T(\'Uninstall\'),\n {T(\'Cancel\'): URL(\'site\')})\n dialog[\'_id\'] = \'confirm_form\'\n dialog[\'_class\'] = \'well\'\n for component in dialog.components:\n component[\'_class\'] = \'btn\'\n\n if dialog.accepted:\n if MULTI_USER_MODE:\n if is_manager() and db(db.app.name == app).delete():\n pass\n elif db(db.app.name == app)(db.app.owner == auth.user.id).delete():\n pass\n else:\n session.flash = T(\'no permission to uninstall "%s"\', app)\n redirect(URL(\'site\'))\n try:\n filename = app_pack(app, request, raise_ex=True)\n except:\n session.flash = T(\'unable to uninstall "%s"\', app)\n else:\n if app_uninstall(app, request):\n session.flash = T(\'application "%s" uninstalled\', app)\n else:\n session.flash = T(\'unable to uninstall "%s"\', app)\n redirect(URL(\'site\'))\n return dict(app=app, dialog=dialog)\n\n\ndef cleanup():\n app = get_app()\n clean = app_cleanup(app, request)\n if not clean:\n session.flash = T("some files could not be removed")\n else:\n session.flash = T(\'cache, errors and sessions cleaned\')\n\n redirect(URL(\'site\'))\n\n\ndef compile_app():\n app = get_app()\n c = app_compile(app, request)\n if not c:\n session.flash = T(\'application compiled\')\n else:\n session.flash = DIV(T(\'Cannot compile: there are errors in your app:\'),\n CODE(c))\n redirect(URL(\'site\'))\n\n\ndef remove_compiled_app():\n """ Remove the compiled application """\n app = get_app()\n remove_compiled_application(apath(app, r=request))\n session.flash = T(\'compiled application removed\')\n redirect(URL(\'site\'))\n\n\ndef delete():\n """ Object delete handler """\n app = get_app()\n filename = \'/\'.join(request.args)\n sender = request.vars.sender\n\n if isinstance(sender, list): # ## fix a problem with Vista\n sender = sender[0]\n\n dialog = FORM.confirm(T(\'Delete\'),\n {T(\'Cancel\'): URL(sender, anchor=request.vars.id)})\n\n if dialog.accepted:\n try:\n full_path = apath(filename, r=request)\n lineno = count_lines(open(full_path, \'r\').read())\n os.unlink(full_path)\n log_progress(app, \'DELETE\', filename, progress=-lineno)\n session.flash = T(\'file "%(filename)s" deleted\',\n dict(filename=filename))\n except Exception:\n session.flash = T(\'unable to delete file "%(filename)s"\',\n dict(filename=filename))\n redirect(URL(sender, anchor=request.vars.id2))\n return dict(dialog=dialog, filename=filename)\n\n\ndef enable():\n app = get_app()\n filename = os.path.join(apath(app, r=request), \'DISABLED\')\n if is_gae:\n return SPAN(T(\'Not supported\'), _style=\'color:yellow\')\n elif os.path.exists(filename):\n return SPAN(T(\'Disable\'), _style=\'color:green\')\n else:\n safe_open(filename, \'wb\').write(\'disabled: True\\ntime-disabled: %s\' % request.now)\n return SPAN(T(\'Enable\'), _style=\'color:red\')\n\ndef peek():\n """ Visualize object code """\n app = get_app(request.vars.app)\n filename = \'/\'.join(request.args)\n if request.vars.app:\n path = abspath(filename)\n else:\n path = apath(filename, r=request)\n try:\n data = safe_read(path).replace(\'\\r\', \'\')\n except IOError:\n session.flash = T(\'file does not exist\')\n redirect(URL(\'site\'))\n\n extension = filename[filename.rfind(\'.\') + 1:].lower()\n\n return dict(app=app,\n filename=filename,\n data=data,\n extension=extension)\n\n\ndef test():\n """ Execute controller tests """\n app = get_app()\n if len(request.args) > 1:\n file = request.args[1]\n else:\n file = \'.*\\.py\'\n\n controllers = listdir(\n apath(\'%s/controllers/\' % app, r=request), file + \'$\')\n\n return dict(app=app, controllers=controllers)\n\n\ndef keepalive():\n return \'\'\n\n\ndef search():\n keywords = request.vars.keywords or \'\'\n app = get_app()\n\n def match(filename, keywords):\n filename = os.path.join(apath(app, r=request), filename)\n if keywords in read_file(filename, \'rb\'):\n return True\n return False\n path = apath(request.args[0], r=request)\n files1 = glob(os.path.join(path, \'*/*.py\'))\n files2 = glob(os.path.join(path, \'*/*.html\'))\n files3 = glob(os.path.join(path, \'*/*/*.html\'))\n files = [x[len(path) + 1:].replace(\n \'\\\\\', \'/\') for x in files1 + files2 + files3 if match(x, keywords)]\n return response.json(dict(files=files, message=T.M(\'Searching: **%s** %%{file}\', len(files))))\n\n\ndef edit():\n """ File edit handler """\n # Load json only if it is ajax edited...\n app = get_app(request.vars.app)\n app_path = apath(app, r=request)\n editor_defaults={\'theme\':\'web2py\'}\n config = Config(os.path.join(request.folder, \'settings.cfg\'),\n section=\'editor\', default_values=editor_defaults)\n preferences = config.read()\n\n if not(request.ajax):\n # return the scaffolding, the rest will be through ajax requests\n response.title = T(\'Editing %s\' % app)\n editarea_preferences = {}\n editarea_preferences[\'FONT_SIZE\'] = \'10\'\n editarea_preferences[\'FULL_SCREEN\'] = \'false\'\n editarea_preferences[\'ALLOW_TOGGLE\'] = \'true\'\n editarea_preferences[\'REPLACE_TAB_BY_SPACES\'] = \'4\'\n editarea_preferences[\'DISPLAY\'] = \'onload\'\n for key in editarea_preferences:\n if key in globals():\n editarea_preferences[key] = globals()[key]\n return response.render (\'default/edit.html\', dict(app=request.args[0], editor_settings=preferences, editarea_preferences=editarea_preferences))\n\n # show settings tab and save prefernces\n if \'settings\' in request.vars:\n if request.post_vars: #save new preferences\n if config.save(request.post_vars.items()):\n response.headers["web2py-component-flash"] = T(\'Preferences saved correctly\')\n else:\n response.headers["web2py-component-flash"] = T(\'Preferences saved on session only\')\n response.headers["web2py-component-command"] = "update_theme(\'%s\'); jQuery(\'a[href=#editor_settings] button.close\').click();" % config.read()[\'theme\']\n return\n else:\n details = {\'filename\':\'settings\', \'id\':\'editor_settings\', \'force\': False}\n details[\'plain_html\'] = response.render(\'default/editor_settings.html\', {\'editor_settings\':preferences})\n return response.json(details)\n\n """ File edit handler """\n # Load json only if it is ajax edited...\n app = get_app(request.vars.app)\n filename = \'/\'.join(request.args)\n response.title = request.args[-1]\n if request.vars.app:\n path = abspath(filename)\n else:\n path = apath(filename, r=request)\n # Try to discover the file type\n if filename[-3:] == \'.py\':\n filetype = \'python\'\n elif filename[-5:] == \'.html\':\n filetype = \'html\'\n elif filename[-5:] == \'.load\':\n filetype = \'html\'\n elif filename[-4:] == \'.css\':\n filetype = \'css\'\n elif filename[-3:] == \'.js\':\n filetype = \'js\'\n else:\n filetype = \'html\'\n\n # ## check if file is not there\n if (\'revert\' in request.vars) and os.path.exists(path + \'.bak\'):\n try:\n data = safe_read(path + \'.bak\')\n data1 = safe_read(path)\n except IOError:\n session.flash = T(\'Invalid action\')\n if \'from_ajax\' in request.vars:\n return response.json({\'error\': str(T(\'Invalid action\'))})\n else:\n redirect(URL(\'site\'))\n\n safe_write(path, data)\n file_hash = md5_hash(data)\n saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])\n safe_write(path + \'.bak\', data1)\n response.flash = T(\'file "%s" of %s restored\', (filename, saved_on))\n else:\n try:\n data = safe_read(path)\n except IOError:\n session.flash = T(\'Invalid action\')\n if \'from_ajax\' in request.vars:\n return response.json({\'error\': str(T(\'Invalid action\'))})\n else:\n redirect(URL(\'site\'))\n\n lineno_old = count_lines(data)\n file_hash = md5_hash(data)\n saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])\n\n if request.vars.file_hash and request.vars.file_hash != file_hash:\n session.flash = T(\'file changed on disk\')\n data = request.vars.data.replace(\'\\r\\n\', \'\\n\').strip() + \'\\n\'\n safe_write(path + \'.1\', data)\n if \'from_ajax\' in request.vars:\n return response.json({\'error\': str(T(\'file changed on disk\')),\n \'redirect\': URL(\'resolve\',\n args=request.args)})\n else:\n redirect(URL(\'resolve\', args=request.args))\n elif request.vars.data:\n safe_write(path + \'.bak\', data)\n data = request.vars.data.replace(\'\\r\\n\', \'\\n\').strip() + \'\\n\'\n safe_write(path, data)\n lineno_new = count_lines(data)\n log_progress(\n app, \'EDIT\', filename, progress=lineno_new - lineno_old)\n file_hash = md5_hash(data)\n saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])\n response.flash = T(\'file saved on %s\', saved_on)\n\n data_or_revert = (request.vars.data or request.vars.revert)\n\n # Check compile errors\n highlight = None\n if filetype == \'python\' and request.vars.data:\n import _ast\n try:\n code = request.vars.data.rstrip().replace(\'\\r\\n\', \'\\n\') + \'\\n\'\n compile(code, path, "exec", _ast.PyCF_ONLY_AST)\n except Exception, e:\n # offset calculation is only used for textarea (start/stop)\n start = sum([len(line) + 1 for l, line\n in enumerate(request.vars.data.split("\\n"))\n if l < e.lineno - 1])\n if e.text and e.offset:\n offset = e.offset - (len(e.text) - len(\n e.text.splitlines()[-1]))\n else:\n offset = 0\n highlight = {\'start\': start, \'end\': start +\n offset + 1, \'lineno\': e.lineno, \'offset\': offset}\n try:\n ex_name = e.__class__.__name__\n except:\n ex_name = \'unknown exception!\'\n response.flash = DIV(T(\'failed to compile file because:\'), BR(),\n B(ex_name), \' \' + T(\'at line %s\', e.lineno),\n offset and \' \' +\n T(\'at char %s\', offset) or \'\',\n PRE(str(e)))\n\n if data_or_revert and request.args[1] == \'modules\':\n # Lets try to reload the modules\n try:\n mopath = \'.\'.join(request.args[2:])[:-3]\n exec \'import applications.%s.modules.%s\' % (\n request.args[0], mopath)\n reload(sys.modules[\'applications.%s.modules.%s\'\n % (request.args[0], mopath)])\n except Exception, e:\n response.flash = DIV(\n T(\'failed to reload module because:\'), PRE(str(e)))\n\n edit_controller = None\n editviewlinks = None\n view_link = None\n if filetype == \'html\' and len(request.args) >= 3:\n cfilename = os.path.join(request.args[0], \'controllers\',\n request.args[2] + \'.py\')\n if os.path.exists(apath(cfilename, r=request)):\n edit_controller = URL(\'edit\', args=[cfilename.replace(os.sep, "/")])\n view = request.args[3].replace(\'.html\', \'\')\n view_link = URL(request.args[0], request.args[2], view)\n elif filetype == \'python\' and request.args[1] == \'controllers\':\n ## it\'s a controller file.\n ## Create links to all of the associated view files.\n app = get_app()\n viewname = os.path.splitext(request.args[2])[0]\n viewpath = os.path.join(app, \'views\', viewname)\n aviewpath = apath(viewpath, r=request)\n viewlist = []\n if os.path.exists(aviewpath):\n if os.path.isdir(aviewpath):\n viewlist = glob(os.path.join(aviewpath, \'*.html\'))\n elif os.path.exists(aviewpath + \'.html\'):\n viewlist.append(aviewpath + \'.html\')\n if len(viewlist):\n editviewlinks = []\n for v in viewlist:\n vf = os.path.split(v)[-1]\n vargs = "/".join([viewpath.replace(os.sep, "/"), vf])\n editviewlinks.append(A(vf.split(".")[0],\n _class="editor_filelink",\n _href=URL(\'edit\', args=[vargs])))\n\n if len(request.args) > 2 and request.args[1] == \'controllers\':\n controller = (request.args[2])[:-3]\n functions = regex_expose.findall(data)\n else:\n (controller, functions) = (None, None)\n\n if \'from_ajax\' in request.vars:\n return response.json({\'file_hash\': file_hash, \'saved_on\': saved_on, \'functions\': functions, \'controller\': controller, \'application\': request.args[0], \'highlight\': highlight})\n else:\n file_details = dict(app=request.args[0],\n filename=filename,\n filetype=filetype,\n data=data,\n edit_controller=edit_controller,\n file_hash=file_hash,\n saved_on=saved_on,\n controller=controller,\n functions=functions,\n view_link=view_link,\n editviewlinks=editviewlinks,\n id=IS_SLUG()(filename)[0],\n force= True if (request.vars.restore or request.vars.revert) else False)\n plain_html = response.render(\'default/edit_js.html\', file_details)\n file_details[\'plain_html\'] = plain_html\n return response.json(file_details)\n\n\ndef resolve():\n """\n """\n\n filename = \'/\'.join(request.args)\n # ## check if file is not there\n path = apath(filename, r=request)\n a = safe_read(path).split(\'\\n\')\n try:\n b = safe_read(path + \'.1\').split(\'\\n\')\n except IOError:\n session.flash = \'Other file, no longer there\'\n redirect(URL(\'edit\', args=request.args))\n\n d = difflib.ndiff(a, b)\n\n def leading(line):\n """ """\n\n # TODO: we really need to comment this\n z = \'\'\n for (k, c) in enumerate(line):\n if c == \' \':\n z += \' \'\n elif c == \' \\t\':\n z += \' \'\n elif k == 0 and c == \'?\':\n pass\n else:\n break\n\n return XML(z)\n\n def getclass(item):\n """ Determine item class """\n\n if item[0] == \' \':\n return \'normal\'\n if item[0] == \'+\':\n return \'plus\'\n if item[0] == \'-\':\n return \'minus\'\n\n if request.vars:\n c = \'\\n\'.join([item[2:].rstrip() for (i, item) in enumerate(d) if item[0]\n == \' \' or \'line%i\' % i in request.vars])\n safe_write(path, c)\n session.flash = \'files merged\'\n redirect(URL(\'edit\', args=request.args))\n else:\n # Making the short circuit compatible with <= python2.4\n gen_data = lambda index, item: not item[:1] in [\'+\', \'-\'] and "" \\\n or INPUT(_type=\'checkbox\',\n _name=\'line%i\' % index,\n value=item[0] == \'+\')\n\n diff = TABLE(*[TR(TD(gen_data(i, item)),\n TD(item[0]),\n TD(leading(item[2:]),\n TT(item[2:].rstrip())),\n _class=getclass(item))\n for (i, item) in enumerate(d) if item[0] != \'?\'])\n\n return dict(diff=diff, filename=filename)\n\n\ndef edit_language():\n """ Edit language file """\n app = get_app()\n filename = \'/\'.join(request.args)\n response.title = request.args[-1]\n strings = read_dict(apath(filename, r=request))\n\n if \'__corrupted__\' in strings:\n form = SPAN(strings[\'__corrupted__\'], _class=\'error\')\n return dict(filename=filename, form=form)\n\n keys = sorted(strings.keys(), lambda x, y: cmp(\n unicode(x, \'utf-8\').lower(), unicode(y, \'utf-8\').lower()))\n rows = []\n rows.append(H2(T(\'Original/Translation\')))\n\n for key in keys:\n name = md5_hash(key)\n s = strings[key]\n (prefix, sep, key) = key.partition(\'\\x01\')\n if sep:\n prefix = SPAN(prefix + \': \', _class=\'tm_ftag\')\n k = key\n else:\n (k, prefix) = (prefix, \'\')\n\n _class = \'untranslated\' if k == s else \'translated\'\n\n if len(s) <= 40:\n elem = INPUT(_type=\'text\', _name=name, value=s,\n _size=70, _class=_class)\n else:\n elem = TEXTAREA(_name=name, value=s, _cols=70,\n _rows=5, _class=_class)\n\n # Making the short circuit compatible with <= python2.4\n k = (s != k) and k or B(k)\n\n new_row = DIV(LABEL(prefix, k, _style="font-weight:normal;"),\n CAT(elem, \'\\n\', TAG.BUTTON(\n T(\'delete\'),\n _onclick=\'return delkey("%s")\' % name,\n _class=\'btn\')), _id=name, _class=\'span6 well well-small\')\n\n rows.append(DIV(new_row,_class="row-fluid"))\n rows.append(DIV(INPUT(_type=\'submit\', _value=T(\'update\'), _class="btn btn-primary"), _class=\'controls\'))\n form = FORM(*rows)\n if form.accepts(request.vars, keepvalues=True):\n strs = dict()\n for key in keys:\n name = md5_hash(key)\n if form.vars[name] == chr(127):\n continue\n strs[key] = form.vars[name]\n write_dict(apath(filename, r=request), strs)\n session.flash = T(\'file saved on %(time)s\', dict(time=time.ctime()))\n redirect(URL(r=request, args=request.args))\n return dict(app=request.args[0], filename=filename, form=form)\n\n\ndef edit_plurals():\n """ Edit plurals file """\n app = get_app()\n filename = \'/\'.join(request.args)\n plurals = read_plural_dict(\n apath(filename, r=request)) # plural forms dictionary\n nplurals = int(request.vars.nplurals) - 1 # plural forms quantity\n xnplurals = xrange(nplurals)\n\n if \'__corrupted__\' in plurals:\n # show error message and exit\n form = SPAN(plurals[\'__corrupted__\'], _class=\'error\')\n return dict(filename=filename, form=form)\n\n keys = sorted(plurals.keys(), lambda x, y: cmp(\n unicode(x, \'utf-8\').lower(), unicode(y, \'utf-8\').lower()))\n tab_rows = []\n for key in keys:\n name = md5_hash(key)\n forms = plurals[key]\n\n if len(forms) < nplurals:\n forms.extend(None for i in xrange(nplurals - len(forms)))\n tab_col1 = DIV(CAT(LABEL(T("Singular Form")), B(key,\n _class=\'fake-input\')))\n tab_inputs = [SPAN(LABEL(T("Plural Form #%s", n + 1)), INPUT(_type=\'text\', _name=name + \'_\' + str(n), value=forms[n], _size=20), _class=\'span6\') for n in xnplurals]\n tab_col2 = DIV(CAT(*tab_inputs))\n tab_col3 = DIV(CAT(LABEL(XML(\' \')), TAG.BUTTON(T(\'delete\'), _onclick=\'return delkey("%s")\' % name, _class=\'btn\'), _class=\'span6\'))\n tab_row = DIV(DIV(tab_col1, \'\\n\', tab_col2, \'\\n\', tab_col3, _class=\'well well-small\'), _id=name, _class=\'row-fluid tab_row\')\n tab_rows.append(tab_row)\n\n tab_rows.append(DIV(TAG[\'button\'](T(\'update\'), _type=\'submit\',\n _class=\'btn btn-primary\'),\n _class=\'controls\'))\n tab_container = DIV(*tab_rows, **dict(_class="row-fluid"))\n\n form = FORM(tab_container)\n if form.accepts(request.vars, keepvalues=True):\n new_plurals = dict()\n for key in keys:\n name = md5_hash(key)\n if form.vars[name + \'_0\'] == chr(127):\n continue\n new_plurals[key] = [form.vars[name + \'_\' + str(n)]\n for n in xnplurals]\n write_plural_dict(apath(filename, r=request), new_plurals)\n session.flash = T(\'file saved on %(time)s\', dict(time=time.ctime()))\n redirect(URL(r=request, args=request.args, vars=dict(\n nplurals=request.vars.nplurals)))\n return dict(app=request.args[0], filename=filename, form=form)\n\n\ndef about():\n """ Read about info """\n app = get_app()\n # ## check if file is not there\n about = safe_read(apath(\'%s/ABOUT\' % app, r=request))\n license = safe_read(apath(\'%s/LICENSE\' % app, r=request))\n return dict(app=app, about=MARKMIN(about), license=MARKMIN(license), progress=report_progress(app))\n\n\ndef design():\n """ Application design handler """\n app = get_app()\n\n if not response.flash and app == request.application:\n msg = T(\'ATTENTION: you cannot edit the running application!\')\n response.flash = msg\n\n if request.vars and not request.vars.token == session.token:\n redirect(URL(\'logout\'))\n\n if request.vars.pluginfile is not None and not isinstance(request.vars.pluginfile, str):\n filename = os.path.basename(request.vars.pluginfile.filename)\n if plugin_install(app, request.vars.pluginfile.file,\n request, filename):\n session.flash = T(\'new plugin installed\')\n redirect(URL(\'design\', args=app))\n else:\n session.flash = \\\n T(\'unable to create application "%s"\', request.vars.filename)\n redirect(URL(r=request))\n elif isinstance(request.vars.pluginfile, str):\n session.flash = T(\'plugin not specified\')\n redirect(URL(r=request))\n\n # If we have only pyc files it means that\n # we cannot design\n if os.path.exists(apath(\'%s/compiled\' % app, r=request)):\n session.flash = \\\n T(\'application is compiled and cannot be designed\')\n redirect(URL(\'site\'))\n\n # Get all models\n models = listdir(apath(\'%s/models/\' % app, r=request), \'.*\\.py$\')\n models = [x.replace(\'\\\\\', \'/\') for x in models]\n defines = {}\n for m in models:\n data = safe_read(apath(\'%s/models/%s\' % (app, m), r=request))\n defines[m] = regex_tables.findall(data)\n defines[m].sort()\n\n # Get all controllers\n controllers = sorted(\n listdir(apath(\'%s/controllers/\' % app, r=request), \'.*\\.py$\'))\n controllers = [x.replace(\'\\\\\', \'/\') for x in controllers]\n functions = {}\n for c in controllers:\n data = safe_read(apath(\'%s/controllers/%s\' % (app, c), r=request))\n items = regex_expose.findall(data)\n functions[c] = items\n\n # Get all views\n views = sorted(\n listdir(apath(\'%s/views/\' % app, r=request), \'[\\w/\\-]+(\\.\\w+)+$\'))\n views = [x.replace(\'\\\\\', \'/\') for x in views if not x.endswith(\'.bak\')]\n extend = {}\n include = {}\n for c in views:\n data = safe_read(apath(\'%s/views/%s\' % (app, c), r=request))\n items = regex_extend.findall(data)\n\n if items:\n extend[c] = items[0][1]\n\n items = regex_include.findall(data)\n include[c] = [i[1] for i in items]\n\n # Get all modules\n modules = listdir(apath(\'%s/modules/\' % app, r=request), \'.*\\.py$\')\n modules = modules = [x.replace(\'\\\\\', \'/\') for x in modules]\n modules.sort()\n\n # Get all private files\n privates = listdir(apath(\'%s/private/\' % app, r=request), \'[^\\.#].*\')\n privates = [x.replace(\'\\\\\', \'/\') for x in privates]\n privates.sort()\n\n # Get all static files\n MAXNFILES = 1000\n statics = listdir(apath(\'%s/static/\' % app, r=request), \'[^\\.#].*\')\n statics = [x.replace(\'\\\\\', \'/\') for x in statics[:MAXNFILES]]\n statics.sort()\n\n # Get all languages\n langpath = os.path.join(apath(app, r=request),\'languages\')\n languages = dict([(lang, info) for lang, info\n in read_possible_languages(langpath).iteritems()\n if info[2] != 0]) # info[2] is langfile_mtime:\n # get only existed files\n\n #Get crontab\n cronfolder = apath(\'%s/cron\' % app, r=request)\n if not os.path.exists(cronfolder):\n os.mkdir(cronfolder)\n crontab = apath(\'%s/cron/crontab\' % app, r=request)\n if not os.path.exists(crontab):\n safe_write(crontab, \'#crontab\')\n\n plugins = []\n\n def filter_plugins(items, plugins):\n plugins += [item[7:].split(\'/\')[0].split(\n \'.\')[0] for item in items if item.startswith(\'plugin_\')]\n plugins[:] = list(set(plugins))\n plugins.sort()\n return [item for item in items if not item.startswith(\'plugin_\')]\n\n return dict(app=app,\n models=filter_plugins(models, plugins),\n defines=defines,\n controllers=filter_plugins(controllers, plugins),\n functions=functions,\n views=filter_plugins(views, plugins),\n modules=filter_plugins(modules, plugins),\n extend=extend,\n include=include,\n privates=filter_plugins(privates, plugins),\n statics=filter_plugins(statics, plugins),\n languages=languages,\n crontab=crontab,\n plugins=plugins)\n\n\ndef delete_plugin():\n """ Object delete handler """\n app = request.args(0)\n plugin = request.args(1)\n plugin_name = \'plugin_\' + plugin\n\n dialog = FORM.confirm(\n T(\'Delete\'),\n {T(\'Cancel\'): URL(\'design\', args=app)})\n\n if dialog.accepted:\n try:\n for folder in [\'models\', \'views\', \'controllers\', \'static\', \'modules\', \'private\']:\n path = os.path.join(apath(app, r=request), folder)\n for item in os.listdir(path):\n if item.rsplit(\'.\', 1)[0] == plugin_name:\n filename = os.path.join(path, item)\n if os.path.isdir(filename):\n shutil.rmtree(filename)\n else:\n os.unlink(filename)\n session.flash = T(\'plugin "%(plugin)s" deleted\',\n dict(plugin=plugin))\n except Exception:\n session.flash = T(\'unable to delete file plugin "%(plugin)s"\',\n dict(plugin=plugin))\n redirect(URL(\'design\', args=request.args(0), anchor=request.vars.id2))\n return dict(dialog=dialog, plugin=plugin)\n\n\ndef plugin():\n """ Application design handler """\n app = get_app()\n plugin = request.args(1)\n\n if not response.flash and app == request.application:\n msg = T(\'ATTENTION: you cannot edit the running application!\')\n response.flash = msg\n\n # If we have only pyc files it means that\n # we cannot design\n if os.path.exists(apath(\'%s/compiled\' % app, r=request)):\n session.flash = \\\n T(\'application is compiled and cannot be designed\')\n redirect(URL(\'site\'))\n\n # Get all models\n models = listdir(apath(\'%s/models/\' % app, r=request), \'.*\\.py$\')\n models = [x.replace(\'\\\\\', \'/\') for x in models]\n defines = {}\n for m in models:\n data = safe_read(apath(\'%s/models/%s\' % (app, m), r=request))\n defines[m] = regex_tables.findall(data)\n defines[m].sort()\n\n # Get all controllers\n controllers = sorted(\n listdir(apath(\'%s/controllers/\' % app, r=request), \'.*\\.py$\'))\n controllers = [x.replace(\'\\\\\', \'/\') for x in controllers]\n functions = {}\n for c in controllers:\n data = safe_read(apath(\'%s/controllers/%s\' % (app, c), r=request))\n items = regex_expose.findall(data)\n functions[c] = items\n\n # Get all views\n views = sorted(\n listdir(apath(\'%s/views/\' % app, r=request), \'[\\w/\\-]+\\.\\w+$\'))\n views = [x.replace(\'\\\\\', \'/\') for x in views]\n extend = {}\n include = {}\n for c in views:\n data = safe_read(apath(\'%s/views/%s\' % (app, c), r=request))\n items = regex_extend.findall(data)\n if items:\n extend[c] = items[0][1]\n\n items = regex_include.findall(data)\n include[c] = [i[1] for i in items]\n\n # Get all modules\n modules = listdir(apath(\'%s/modules/\' % app, r=request), \'.*\\.py$\')\n modules = modules = [x.replace(\'\\\\\', \'/\') for x in modules]\n modules.sort()\n\n # Get all private files\n privates = listdir(apath(\'%s/private/\' % app, r=request), \'[^\\.#].*\')\n privates = [x.replace(\'\\\\\', \'/\') for x in privates]\n privates.sort()\n\n # Get all static files\n statics = listdir(apath(\'%s/static/\' % app, r=request), \'[^\\.#].*\')\n statics = [x.replace(\'\\\\\', \'/\') for x in statics]\n statics.sort()\n\n # Get all languages\n languages = sorted([lang + \'.py\' for lang, info in\n T.get_possible_languages_info().iteritems()\n if info[2] != 0]) # info[2] is langfile_mtime:\n # get only existed files\n\n #Get crontab\n crontab = apath(\'%s/cron/crontab\' % app, r=request)\n if not os.path.exists(crontab):\n safe_write(crontab, \'#crontab\')\n\n def filter_plugins(items):\n regex = re.compile(\'^plugin_\' + plugin + \'(/.*|\\..*)?$\')\n return [item for item in items if item and regex.match(item)]\n\n return dict(app=app,\n models=filter_plugins(models),\n defines=defines,\n controllers=filter_plugins(controllers),\n functions=functions,\n views=filter_plugins(views),\n modules=filter_plugins(modules),\n extend=extend,\n include=include,\n privates=filter_plugins(privates),\n statics=filter_plugins(statics),\n languages=languages,\n crontab=crontab)\n\n\ndef create_file():\n """ Create files handler """\n if request.vars and not request.vars.token == session.token:\n redirect(URL(\'logout\'))\n try:\n anchor = \'#\' + request.vars.id if request.vars.id else \'\'\n if request.vars.app:\n app = get_app(request.vars.app)\n path = abspath(request.vars.location)\n else:\n app = get_app(name=request.vars.location.split(\'/\')[0])\n path = apath(request.vars.location, r=request)\n filename = re.sub(\'[^\\w./-]+\', \'_\', request.vars.filename)\n if path[-7:] == \'/rules/\':\n # Handle plural rules files\n if len(filename) == 0:\n raise SyntaxError\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n lang = re.match(\'^plural_rules-(.*)\\.py$\', filename).group(1)\n langinfo = read_possible_languages(apath(app, r=request))[lang]\n text = dedent("""\n #!/usr/bin/env python\n # -*- coding: utf8 -*-\n # Plural-Forms for %(lang)s (%(langname)s)\n\n nplurals=2 # for example, English language has 2 forms:\n # 1 singular and 1 plural\n\n # Determine plural_id for number *n* as sequence of positive\n # integers: 0,1,...\n # NOTE! For singular form ALWAYS return plural_id = 0\n get_plural_id = lambda n: int(n != 1)\n\n # Construct and return plural form of *word* using\n # *plural_id* (which ALWAYS>0). This function will be executed\n # for words (or phrases) not found in plural_dict dictionary.\n # By default this function simply returns word in singular:\n construct_plural_form = lambda word, plural_id: word\n """)[1:] % dict(lang=langinfo[0], langname=langinfo[1])\n\n elif path[-11:] == \'/languages/\':\n # Handle language files\n if len(filename) == 0:\n raise SyntaxError\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n path = os.path.join(apath(app, r=request), \'languages\', filename)\n if not os.path.exists(path):\n safe_write(path, \'\')\n # create language xx[-yy].py file:\n findT(apath(app, r=request), filename[:-3])\n session.flash = T(\'language file "%(filename)s" created/updated\',\n dict(filename=filename))\n redirect(request.vars.sender + anchor)\n\n elif path[-8:] == \'/models/\':\n # Handle python models\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if len(filename) == 3:\n raise SyntaxError\n\n text = \'# coding: utf8\\n\'\n\n elif path[-13:] == \'/controllers/\':\n # Handle python controllers\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if len(filename) == 3:\n raise SyntaxError\n\n text = \'# coding: utf8\\n# %s\\ndef index(): return dict(message="hello from %s")\'\n text = text % (T(\'try something like\'), filename)\n\n elif path[-7:] == \'/views/\':\n if request.vars.plugin and not filename.startswith(\'plugin_%s/\' % request.vars.plugin):\n filename = \'plugin_%s/%s\' % (request.vars.plugin, filename)\n # Handle template (html) views\n if filename.find(\'.\') < 0:\n filename += \'.html\'\n extension = filename.split(\'.\')[-1].lower()\n\n if len(filename) == 5:\n raise SyntaxError\n\n msg = T(\n \'This is the %(filename)s template\', dict(filename=filename))\n if extension == \'html\':\n text = dedent("""\n {{extend \'layout.html\'}}\n <h1>%s</h1>\n {{=BEAUTIFY(response._vars)}}""" % msg)[1:]\n else:\n generic = os.path.join(path, \'generic.\' + extension)\n if os.path.exists(generic):\n text = read_file(generic)\n else:\n text = \'\'\n\n elif path[-9:] == \'/modules/\':\n if request.vars.plugin and not filename.startswith(\'plugin_%s/\' % request.vars.plugin):\n filename = \'plugin_%s/%s\' % (request.vars.plugin, filename)\n # Handle python module files\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if len(filename) == 3:\n raise SyntaxError\n\n text = dedent("""\n #!/usr/bin/env python\n # coding: utf8\n from gluon import *\\n""")[1:]\n\n elif (path[-8:] == \'/static/\') or (path[-9:] == \'/private/\'):\n if request.vars.plugin and not filename.startswith(\'plugin_%s/\' % request.vars.plugin):\n filename = \'plugin_%s/%s\' % (request.vars.plugin, filename)\n text = \'\'\n\n else:\n redirect(request.vars.sender + anchor)\n\n full_filename = os.path.join(path, filename)\n dirpath = os.path.dirname(full_filename)\n\n if not os.path.exists(dirpath):\n os.makedirs(dirpath)\n\n if os.path.exists(full_filename):\n raise SyntaxError\n\n safe_write(full_filename, text)\n log_progress(app, \'CREATE\', filename)\n session.flash = T(\'file "%(filename)s" created\',\n dict(filename=full_filename[len(path):]))\n vars = {}\n if request.vars.id:\n vars[\'id\'] = request.vars.id\n if request.vars.app:\n vars[\'app\'] = request.vars.app\n redirect(URL(\'edit\',\n args=[os.path.join(request.vars.location, filename)], vars=vars))\n except Exception, e:\n if not isinstance(e, HTTP):\n session.flash = T(\'cannot create file\')\n\n redirect(request.vars.sender + anchor)\n\n\ndef upload_file():\n """ File uploading handler """\n if request.vars and not request.vars.token == session.token:\n redirect(URL(\'logout\'))\n try:\n filename = None\n app = get_app(name=request.vars.location.split(\'/\')[0])\n path = apath(request.vars.location, r=request)\n\n if request.vars.filename:\n filename = re.sub(\'[^\\w\\./]+\', \'_\', request.vars.filename)\n else:\n filename = os.path.split(request.vars.file.filename)[-1]\n\n if path[-8:] == \'/models/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if path[-9:] == \'/modules/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if path[-13:] == \'/controllers/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if path[-7:] == \'/views/\' and not filename[-5:] == \'.html\':\n filename += \'.html\'\n\n if path[-11:] == \'/languages/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n filename = os.path.join(path, filename)\n dirpath = os.path.dirname(filename)\n\n if not os.path.exists(dirpath):\n os.makedirs(dirpath)\n\n data = request.vars.file.file.read()\n lineno = count_lines(data)\n safe_write(filename, data, \'wb\')\n log_progress(app, \'UPLOAD\', filename, lineno)\n session.flash = T(\'file "%(filename)s" uploaded\',\n dict(filename=filename[len(path):]))\n except Exception:\n if filename:\n d = dict(filename=filename[len(path):])\n else:\n d = dict(filename=\'unkown\')\n session.flash = T(\'cannot upload file "%(filename)s"\', d)\n\n redirect(request.vars.sender)\n\n\ndef errors():\n """ Error handler """\n import operator\n import os\n import pickle\n import hashlib\n\n app = get_app()\n\n method = request.args(1) or \'new\'\n db_ready = {}\n db_ready[\'status\'] = get_ticket_storage(app)\n db_ready[\'errmessage\'] = T(\n "No ticket_storage.txt found under /private folder")\n db_ready[\'errlink\'] = "http://web2py.com/books/default/chapter/29/13#Collecting-tickets"\n\n if method == \'new\':\n errors_path = apath(\'%s/errors\' % app, r=request)\n\n delete_hashes = []\n for item in request.vars:\n if item[:7] == \'delete_\':\n delete_hashes.append(item[7:])\n\n hash2error = dict()\n\n for fn in listdir(errors_path, \'^[a-fA-F0-9.\\-]+$\'):\n fullpath = os.path.join(errors_path, fn)\n if not os.path.isfile(fullpath):\n continue\n try:\n fullpath_file = open(fullpath, \'r\')\n try:\n error = pickle.load(fullpath_file)\n finally:\n fullpath_file.close()\n except IOError:\n continue\n except EOFError:\n continue\n\n hash = hashlib.md5(error[\'traceback\']).hexdigest()\n\n if hash in delete_hashes:\n os.unlink(fullpath)\n else:\n try:\n hash2error[hash][\'count\'] += 1\n except KeyError:\n error_lines = error[\'traceback\'].split("\\n")\n last_line = error_lines[-2] if len(error_lines)>1 else \'unknown\'\n error_causer = os.path.split(error[\'layer\'])[1]\n hash2error[hash] = dict(count=1, pickel=error,\n causer=error_causer,\n last_line=last_line,\n hash=hash, ticket=fn)\n\n decorated = [(x[\'count\'], x) for x in hash2error.values()]\n decorated.sort(key=operator.itemgetter(0), reverse=True)\n\n return dict(errors=[x[1] for x in decorated], app=app, method=method, db_ready=db_ready)\n\n elif method == \'dbnew\':\n errors_path = apath(\'%s/errors\' % app, r=request)\n tk_db, tk_table = get_ticket_storage(app)\n\n delete_hashes = []\n for item in request.vars:\n if item[:7] == \'delete_\':\n delete_hashes.append(item[7:])\n\n hash2error = dict()\n\n for fn in tk_db(tk_table.id > 0).select():\n try:\n error = pickle.loads(fn.ticket_data)\n except AttributeError:\n tk_db(tk_table.id == fn.id).delete()\n tk_db.commit()\n\n hash = hashlib.md5(error[\'traceback\']).hexdigest()\n\n if hash in delete_hashes:\n tk_db(tk_table.id == fn.id).delete()\n tk_db.commit()\n else:\n try:\n hash2error[\'hash\'][\'count\'] += 1\n except KeyError:\n error_lines = error[\'traceback\'].split("\\n")\n last_line = error_lines[-2]\n error_causer = os.path.split(error[\'layer\'])[1]\n hash2error[hash] = dict(count=1, pickel=error,\n causer=error_causer,\n last_line=last_line,\n hash=hash, ticket=fn.ticket_id)\n\n decorated = [(x[\'count\'], x) for x in hash2error.values()]\n\n decorated.sort(key=operator.itemgetter(0), reverse=True)\n\n return dict(errors=[x[1] for x in decorated], app=app, method=method)\n\n elif method == \'dbold\':\n tk_db, tk_table = get_ticket_storage(app)\n for item in request.vars:\n if item[:7] == \'delete_\':\n tk_db(tk_table.ticket_id == item[7:]).delete()\n tk_db.commit()\n tickets_ = tk_db(tk_table.id > 0).select(tk_table.ticket_id, tk_table.created_datetime, orderby=~tk_table.created_datetime)\n tickets = [row.ticket_id for row in tickets_]\n times = dict(\n [(row.ticket_id, row.created_datetime) for row in tickets_])\n\n return dict(app=app, tickets=tickets, method=method, times=times)\n\n else:\n for item in request.vars:\n # delete_all} rows doesn\'t contain any ticket\n # Remove anything else as requested\n if item[:7] == \'delete_\' and (not item == "delete_all}"):\n os.unlink(apath(\'%s/errors/%s\' % (app, item[7:]), r=request))\n func = lambda p: os.stat(apath(\'%s/errors/%s\' %\n (app, p), r=request)).st_mtime\n tickets = sorted(\n listdir(apath(\'%s/errors/\' % app, r=request), \'^\\w.*\'),\n key=func,\n reverse=True)\n\n return dict(app=app, tickets=tickets, method=method, db_ready=db_ready)\n\n\ndef get_ticket_storage(app):\n private_folder = apath(\'%s/private\' % app, r=request)\n ticket_file = os.path.join(private_folder, \'ticket_storage.txt\')\n if os.path.exists(ticket_file):\n db_string = open(ticket_file).read()\n db_string = db_string.strip().replace(\'\\r\', \'\').replace(\'\\n\', \'\')\n else:\n return False\n tickets_table = \'web2py_ticket\'\n tablename = tickets_table + \'_\' + app\n db_path = apath(\'%s/databases\' % app, r=request)\n ticketsdb = DAL(db_string, folder=db_path, auto_import=True)\n if not ticketsdb.get(tablename):\n table = ticketsdb.define_table(\n tablename,\n Field(\'ticket_id\', length=100),\n Field(\'ticket_data\', \'text\'),\n Field(\'created_datetime\', \'datetime\'),\n )\n return ticketsdb, ticketsdb.get(tablename)\n\n\ndef make_link(path):\n """ Create a link from a path """\n tryFile = path.replace(\'\\\\\', \'/\')\n\n if os.path.isabs(tryFile) and os.path.isfile(tryFile):\n (folder, filename) = os.path.split(tryFile)\n (base, ext) = os.path.splitext(filename)\n app = get_app()\n\n editable = {\'controllers\': \'.py\', \'models\': \'.py\', \'views\': \'.html\'}\n for key in editable.keys():\n check_extension = folder.endswith("%s/%s" % (app, key))\n if ext.lower() == editable[key] and check_extension:\n return A(\'"\' + tryFile + \'"\',\n _href=URL(r=request,\n f=\'edit/%s/%s/%s\' % (app, key, filename))).xml()\n return \'\'\n\n\ndef make_links(traceback):\n """ Make links using the given traceback """\n\n lwords = traceback.split(\'"\')\n\n # Making the short circuit compatible with <= python2.4\n result = (len(lwords) != 0) and lwords[0] or \'\'\n\n i = 1\n\n while i < len(lwords):\n link = make_link(lwords[i])\n\n if link == \'\':\n result += \'"\' + lwords[i]\n else:\n result += link\n\n if i + 1 < len(lwords):\n result += lwords[i + 1]\n i = i + 1\n\n i = i + 1\n\n return result\n\n\nclass TRACEBACK(object):\n """ Generate the traceback """\n\n def __init__(self, text):\n """ TRACEBACK constructor """\n\n self.s = make_links(CODE(text).xml())\n\n def xml(self):\n """ Returns the xml """\n\n return self.s\n\n\ndef ticket():\n """ Ticket handler """\n\n if len(request.args) != 2:\n session.flash = T(\'invalid ticket\')\n redirect(URL(\'site\'))\n\n app = get_app()\n myversion = request.env.web2py_version\n ticket = request.args[1]\n e = RestrictedError()\n e.load(request, app, ticket)\n\n return dict(app=app,\n ticket=ticket,\n output=e.output,\n traceback=(e.traceback and TRACEBACK(e.traceback)),\n snapshot=e.snapshot,\n code=e.code,\n layer=e.layer,\n myversion=myversion)\n\n\ndef ticketdb():\n """ Ticket handler """\n\n if len(request.args) != 2:\n session.flash = T(\'invalid ticket\')\n redirect(URL(\'site\'))\n\n app = get_app()\n myversion = request.env.web2py_version\n ticket = request.args[1]\n e = RestrictedError()\n request.tickets_db = get_ticket_storage(app)[0]\n e.load(request, app, ticket)\n response.view = \'default/ticket.html\'\n return dict(app=app,\n ticket=ticket,\n output=e.output,\n traceback=(e.traceback and TRACEBACK(e.traceback)),\n snapshot=e.snapshot,\n code=e.code,\n layer=e.layer,\n myversion=myversion)\n\n\ndef error():\n """ Generate a ticket (for testing) """\n raise RuntimeError(\'admin ticket generator at your service\')\n\n\ndef update_languages():\n """ Update available languages """\n\n app = get_app()\n update_all_languages(apath(app, r=request))\n session.flash = T(\'Language files (static strings) updated\')\n redirect(URL(\'design\', args=app, anchor=\'languages\'))\n\n\ndef user():\n if MULTI_USER_MODE:\n if not db(db.auth_user).count():\n auth.settings.registration_requires_approval = False\n return dict(form=auth())\n else:\n return dict(form=T("Disabled"))\n\n\ndef reload_routes():\n """ Reload routes.py """\n import gluon.rewrite\n gluon.rewrite.load()\n redirect(URL(\'site\'))\n\n\ndef manage_students():\n if not (MULTI_USER_MODE and is_manager()):\n session.flash = T(\'Not Authorized\')\n redirect(URL(\'site\'))\n db.auth_user.registration_key.writable = True\n grid = SQLFORM.grid(db.auth_user)\n return locals()\n\n\ndef bulk_register():\n if not (MULTI_USER_MODE and is_manager()):\n session.flash = T(\'Not Authorized\')\n redirect(URL(\'site\'))\n form = SQLFORM.factory(Field(\'emails\', \'text\'))\n if form.process().accepted:\n emails = [x.strip() for x in form.vars.emails.split(\'\\n\') if x.strip()]\n n = 0\n for email in emails:\n if not db.auth_user(email=email):\n n += db.auth_user.insert(email=email) and 1 or 0\n session.flash = T(\'%s students registered\', n)\n redirect(URL(\'site\'))\n return locals()\n\n### Begin experimental stuff need fixes:\n# 1) should run in its own process - cannot os.chdir\n# 2) should not prompt user at console\n# 3) should give option to force commit and not reuqire manual merge\n\n\ndef git_pull():\n """ Git Pull handler """\n app = get_app()\n if not have_git:\n session.flash = GIT_MISSING\n redirect(URL(\'site\'))\n dialog = FORM.confirm(T(\'Pull\'),\n {T(\'Cancel\'): URL(\'site\')})\n if dialog.accepted:\n try:\n repo = git.Repo(os.path.join(apath(r=request), app))\n origin = repo.remotes.origin\n origin.fetch()\n origin.pull()\n session.flash = T("Application updated via git pull")\n redirect(URL(\'site\'))\n\n except git.CheckoutError:\n session.flash = T("Pull failed, certain files could not be checked out. Check logs for details.")\n redirect(URL(\'site\'))\n except git.UnmergedEntriesError:\n session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")\n redirect(URL(\'site\'))\n except git.GitCommandError:\n session.flash = T(\n "Pull failed, git exited abnormally. See logs for details.")\n redirect(URL(\'site\'))\n except AssertionError:\n session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")\n redirect(URL(\'site\'))\n elif \'cancel\' in request.vars:\n redirect(URL(\'site\'))\n return dict(app=app, dialog=dialog)\n\n\ndef git_push():\n """ Git Push handler """\n app = get_app()\n if not have_git:\n session.flash = GIT_MISSING\n redirect(URL(\'site\'))\n form = SQLFORM.factory(Field(\'changelog\', requires=IS_NOT_EMPTY()))\n form.element(\'input[type=submit]\')[\'_value\'] = T(\'Push\')\n form.add_button(T(\'Cancel\'), URL(\'site\'))\n form.process()\n if form.accepted:\n try:\n repo = git.Repo(os.path.join(apath(r=request), app))\n index = repo.index\n index.add([apath(r=request) + app + \'/*\'])\n new_commit = index.commit(form.vars.changelog)\n origin = repo.remotes.origin\n origin.push()\n session.flash = T(\n "Git repo updated with latest application changes.")\n redirect(URL(\'site\'))\n except git.UnmergedEntriesError:\n session.flash = T("Push failed, there are unmerged entries in the cache. Resolve merge issues manually and try again.")\n redirect(URL(\'site\'))\n return dict(app=app, form=form)\n\nresponse._vars=response._caller(site)\n'
- p7
- sS'snapshot'
- p8
- (dp9
- S'exception'
- p10
- (dp11
- S'__hash__'
- p12
- S"<method-wrapper '__hash__' of exceptions.ImportError object>"
- p13
- sS'__setattr__'
- p14
- S"<method-wrapper '__setattr__' of exceptions.ImportError object>"
- p15
- sS'__reduce_ex__'
- p16
- S'<built-in method __reduce_ex__ of exceptions.ImportError object>'
- p17
- sS'__getslice__'
- p18
- S"<method-wrapper '__getslice__' of exceptions.ImportError object>"
- p19
- sS'__getitem__'
- p20
- S"<method-wrapper '__getitem__' of exceptions.ImportError object>"
- p21
- sS'__setstate__'
- p22
- S'<built-in method __setstate__ of exceptions.ImportError object>'
- p23
- sS'args'
- p24
- S"('cannot import name Config',)"
- p25
- sS'__reduce__'
- p26
- S'<built-in method __reduce__ of exceptions.ImportError object>'
- p27
- sS'__str__'
- p28
- S"<method-wrapper '__str__' of exceptions.ImportError object>"
- p29
- sS'__format__'
- p30
- S'<built-in method __format__ of exceptions.ImportError object>'
- p31
- sS'__getattribute__'
- p32
- S"<method-wrapper '__getattribute__' of exceptions.ImportError object>"
- p33
- sS'__class__'
- p34
- S"<type 'exceptions.ImportError'>"
- p35
- sS'__unicode__'
- p36
- S'<built-in method __unicode__ of exceptions.ImportError object>'
- p37
- sS'__delattr__'
- p38
- S"<method-wrapper '__delattr__' of exceptions.ImportError object>"
- p39
- sS'__subclasshook__'
- p40
- S'<built-in method __subclasshook__ of type object>'
- p41
- sS'__repr__'
- p42
- S"<method-wrapper '__repr__' of exceptions.ImportError object>"
- p43
- sS'__dict__'
- p44
- S'{}'
- p45
- sS'__sizeof__'
- p46
- S'<built-in method __sizeof__ of exceptions.ImportError object>'
- p47
- sS'__doc__'
- p48
- S'"Import can\'t find module, or can\'t find name in module."'
- p49
- sS'__init__'
- p50
- S"<method-wrapper '__init__' of exceptions.ImportError object>"
- p51
- sS'__new__'
- p52
- S'<built-in method __new__ of type object>'
- p53
- ssS'evalue'
- p54
- S'cannot import name Config'
- p55
- sS'request'
- p56
- cgluon.html
- XML_unpickle
- p57
- (S's\xceP\x00\x00<div><table><tr><td style="font-weight:bold;vertical-align:top">ajax</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">application</td><td valign="top">:</td><td><div>admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">args</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">body</td><td valign="top">:</td><td><div><cStringIO.StringO object at 0x2c51228></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">cid</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">client</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">controller</td><td valign="top">:</td><td><div>default</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">cookies</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">session_id_admin</td><td valign="top">:</td><td><div>108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_id_welcome</td><td valign="top">:</td><td><div>108.18.133.177-fec60924-a09a-4214-9b4c-d54b080b9520<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">sessionid</td><td valign="top">:</td><td><div>410b040fc52e3b7354b87ed162f67030<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">env</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">app_folders</td><td valign="top">:</td><td><div>set(['/home/mattspence/web2py/applications/admin/'])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">applications_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">content_length</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">content_type</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">db_sessions</td><td valign="top">:</td><td><div>set([])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">debugging</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">document_root</td><td valign="top">:</td><td><div>/var/log/nginx/user_logs</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">gluon_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_accept</td><td valign="top">:</td><td><div>text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_accept_encoding</td><td valign="top">:</td><td><div>gzip, deflate</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_accept_language</td><td valign="top">:</td><td><div>en-us</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_connection</td><td valign="top">:</td><td><div>close</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_cookie</td><td valign="top">:</td><td><div>session_id_admin=108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8; session_id_welcome=108.18.133.177-fec60924-a09a-4214-9b4c-d54b080b9520; sessionid=410b040fc52e3b7354b87ed162f67030; __utma=133430031.689296413.1370357862.1377877431.1379201088.14; __utmb=133430031.35.10.1379201088; __utmc=133430031; __utmz=133430031.1370378347.2.2.utmcsr=blog.pythonanywhere.com|utmccn=(referral)|utmcmd=referral|utmcct=/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_dnt</td><td valign="top">:</td><td><div>1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_host</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_origin</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_referer</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com/admin/default/upgrade_web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_user_agent</td><td valign="top">:</td><td><div>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_x_forwarded_for</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_x_real_ip</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">https</td><td valign="top">:</td><td><div>on</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_jython</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_pypy</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">local_hosts</td><td valign="top">:</td><td><div><table><tr><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td><div>::1</div></td></tr><tr><td><div>::ffff:127.0.0.1</div></td></tr><tr><td><div>glenn-liveweb1</div></td></tr><tr><td><div>localhost</div></td></tr><tr><td><div>50.19.109.98</div></td></tr><tr><td><div>127.0.0.1</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path_info</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">query_string</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">remote_addr</td><td valign="top">:</td><td><div>10.87.22.48</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">remote_port</td><td valign="top">:</td><td><div>34558</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">request_method</td><td valign="top">:</td><td><div>GET</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">request_uri</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">script_name</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">server_name</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">server_port</td><td valign="top">:</td><td><div>443</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">server_protocol</td><td valign="top">:</td><td><div>HTTP/1.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi_node</td><td valign="top">:</td><td><div>glenn-liveweb1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi_version</td><td valign="top">:</td><td><div>1.9.12</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">web2py_path</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">web2py_version</td><td valign="top">:</td><td><div>2.5.1-stable+timestamp.2013.06.06.15.39.19</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_errors</td><td valign="top">:</td><td><div><uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_file_wrapper</td><td valign="top">:</td><td><div><built-in function uwsgi_sendfile></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_input</td><td valign="top">:</td><td><div><uwsgi._Input object at 0x7f6453906600></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_multiprocess</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_multithread</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_run_once</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_url_scheme</td><td valign="top">:</td><td><div>https</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_version</td><td valign="top">:</td><td><div><table><tr><td><div>1</div></td></tr><tr><td><div>0</div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">extension</td><td valign="top">:</td><td><div>html</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">folder</td><td valign="top">:</td><td><div>/home/mattspence/web2py/applications/admin/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">function</td><td valign="top">:</td><td><div>site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">get_vars</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">global_settings</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">app_folders</td><td valign="top">:</td><td><div>set(['/home/mattspence/web2py/applications/admin/'])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">applications_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">db_sessions</td><td valign="top">:</td><td><div>set([])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">debugging</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">gluon_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_jython</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_pypy</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">local_hosts</td><td valign="top">:</td><td><div><table><tr><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td><div>::1</div></td></tr><tr><td><div>::ffff:127.0.0.1</div></td></tr><tr><td><div>glenn-liveweb1</div></td></tr><tr><td><div>localhost</div></td></tr><tr><td><div>50.19.109.98</div></td></tr><tr><td><div>127.0.0.1</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">web2py_version</td><td valign="top">:</td><td><div>2.5.1-stable+timestamp.2013.06.06.15.39.19</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_https</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_local</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_restful</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">now</td><td valign="top">:</td><td><div>datetime.datetime(2013, 9, 14, 23, 44, 12, 309319)</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">post_vars</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">raw_args</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">raw_extension</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">url</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">utcnow</td><td valign="top">:</td><td><div>datetime.datetime(2013, 9, 14, 23, 44, 12, 309349)</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uuid</td><td valign="top">:</td><td><div>admin/108.18.133.177.2013-09-14.23-44-12.1b1d1afe-9202-4b6d-b6a9-bc793509db41</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">vars</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">environ</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">CONTENT_LENGTH</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">CONTENT_TYPE</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">DOCUMENT_ROOT</td><td valign="top">:</td><td><div>/var/log/nginx/user_logs</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTPS</td><td valign="top">:</td><td><div>on</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ACCEPT</td><td valign="top">:</td><td><div>text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ACCEPT_ENCODING</td><td valign="top">:</td><td><div>gzip, deflate</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ACCEPT_LANGUAGE</td><td valign="top">:</td><td><div>en-us</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_CONNECTION</td><td valign="top">:</td><td><div>close</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_COOKIE</td><td valign="top">:</td><td><div>session_id_admin=108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8; session_id_welcome=108.18.133.177-fec60924-a09a-4214-9b4c-d54b080b9520; sessionid=410b040fc52e3b7354b87ed162f67030; __utma=133430031.689296413.1370357862.1377877431.1379201088.14; __utmb=133430031.35.10.1379201088; __utmc=133430031; __utmz=133430031.1370378347.2.2.utmcsr=blog.pythonanywhere.com|utmccn=(referral)|utmcmd=referral|utmcct=/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_DNT</td><td valign="top">:</td><td><div>1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_HOST</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ORIGIN</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_REFERER</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com/admin/default/upgrade_web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_USER_AGENT</td><td valign="top">:</td><td><div>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_X_FORWARDED_FOR</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_X_REAL_IP</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">PATH_INFO</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">QUERY_STRING</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REMOTE_ADDR</td><td valign="top">:</td><td><div>10.87.22.48</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REMOTE_PORT</td><td valign="top">:</td><td><div>34558</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REQUEST_METHOD</td><td valign="top">:</td><td><div>GET</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REQUEST_URI</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SCRIPT_NAME</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SERVER_NAME</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SERVER_PORT</td><td valign="top">:</td><td><div>443</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SERVER_PROTOCOL</td><td valign="top">:</td><td><div>HTTP/1.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi.node</td><td valign="top">:</td><td><div>glenn-liveweb1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi.version</td><td valign="top">:</td><td><div>1.9.12</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.errors</td><td valign="top">:</td><td><div><uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.file_wrapper</td><td valign="top">:</td><td><div><built-in function uwsgi_sendfile></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.input</td><td valign="top">:</td><td><div><cStringIO.StringO object at 0x2c51228></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.multiprocess</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.multithread</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.run_once</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.url_scheme</td><td valign="top">:</td><td><div>https</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.version</td><td valign="top">:</td><td><div>1</div></td></tr></table></div></td></tr></table></div></td></tr></table></div>'
- tRp58
- sS'frames'
- p59
- (lp60
- (dp61
- S'file'
- p62
- S'/home/mattspence/web2py/gluon/restricted.py'
- p63
- sS'dump'
- p64
- (dp65
- S'environment'
- p66
- S"{'A': <class 'gluon.html.A'>, 'ALLOW_TOGGLE': 'true', 'ANY_OF': <class 'gluon.validators.ANY_OF'>, 'A_button': <function A_button>, 'B': <class 'gluon.html.B'>, 'BEAUTIFY': <class 'gluon.html.BEAUTIFY'>, 'BODY': <class 'gluon.html.BODY'>, 'BR': <class 'gluon.html.BR'>, 'BUTTON': <class 'gluon.html.BUTTON'>, 'CAT': <class 'gluon.html.CAT'>, ...}"
- p67
- sS'ccode'
- p68
- S'<code object <module> at 0x148f230, file "/home/...plications/admin/controllers/default.py", line 3>'
- p69
- ssS'lnum'
- p70
- I212
- sS'lines'
- p71
- (dp72
- I207
- S' try:'
- p73
- sI208
- S' if isinstance(code, types.CodeType):'
- p74
- sI209
- S' ccode = code'
- p75
- sI210
- S' else:'
- p76
- sI211
- S' ccode = compile2(code, layer)'
- p77
- sI212
- S' exec ccode in environment'
- p78
- sI213
- S' except HTTP:'
- p79
- sI214
- S' raise'
- p80
- sI215
- S' except RestrictedError:'
- p81
- sI216
- S' # do not encapsulate (obfuscate) the original RestrictedError'
- p82
- ssS'call'
- p83
- S"(code='# coding: utf8\\n\\nEXPERIMENTAL_STUFF = True\\n\\nif EX...orm=form)\\n\\nresponse._vars=response._caller(site)\\n', environment={'A': <class 'gluon.html.A'>, 'ALLOW_TOGGLE': 'true', 'ANY_OF': <class 'gluon.validators.ANY_OF'>, 'A_button': <function A_button>, 'B': <class 'gluon.html.B'>, 'BEAUTIFY': <class 'gluon.html.BEAUTIFY'>, 'BODY': <class 'gluon.html.BODY'>, 'BR': <class 'gluon.html.BR'>, 'BUTTON': <class 'gluon.html.BUTTON'>, 'CAT': <class 'gluon.html.CAT'>, ...}, layer='/home/mattspence/web2py/applications/admin/controllers/default.py')"
- p84
- sS'func'
- p85
- S'restricted'
- p86
- sa(dp87
- g62
- S'/home/mattspence/web2py/applications/admin/controllers/default.py'
- p88
- sg64
- (dp89
- S'Config'
- p90
- S'undefined'
- p91
- sS'gluon'
- p92
- g91
- ssg70
- I14
- sg71
- (dp93
- I9
- S''
- sI10
- S'import re'
- p94
- sI11
- S'from gluon.admin import *'
- p95
- sI12
- S'from gluon.fileutils import abspath, read_file, write_file'
- p96
- sI13
- S'from gluon.utils import web2py_uuid'
- p97
- sI14
- S'from gluon.tools import Config'
- p98
- sI15
- S'from glob import glob'
- p99
- sI16
- S'import shutil'
- p100
- sI17
- S'import platform'
- p101
- sI18
- S''
- ssg83
- S'()'
- p102
- sg85
- S'<module>'
- p103
- sasS'pyver'
- p104
- S'Python 2.7.4: /usr/local/bin/uwsgi (prefix: /usr)'
- p105
- sS'session'
- p106
- g57
- (S's~\x03\x00\x00<div><table><tr><td style="font-weight:bold;vertical-align:top">authorized</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">check_version</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">flash</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_mobile</td><td valign="top">:</td><td><div>auto</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">last_time</td><td valign="top">:</td><td><div>1379202252.335307</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">pam_user</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">token</td><td valign="top">:</td><td><div>c0c92bd0-a6e3-486f-84c2-cce8421ce960</div></td></tr></table></div>'
- tRp107
- sS'etype'
- p108
- S"<type 'exceptions.ImportError'>"
- p109
- sS'date'
- p110
- S'Sat Sep 14 23:44:12 2013'
- p111
- sS'response'
- p112
- g57
- (S's\x9e\x16\x00\x00<div><table><tr><td style="font-weight:bold;vertical-align:top">body</td><td valign="top">:</td><td><div><cStringIO.StringO object at 0x2c4f068></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">cookies</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">session_id_admin</td><td valign="top">:</td><td><div>108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div>/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">delimiters</td><td valign="top">:</td><td><div><table><tr><td><div>{{</div></td></tr><tr><td><div>}}</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">files</td><td valign="top">:</td><td><div><table><tr><td><div>/admin/static/plugin_multiselect/jquery.multi-select.js</div></td></tr><tr><td><div>/admin/static/plugin_multiselect/multi-select.css</div></td></tr><tr><td><div>/admin/static/plugin_multiselect/start.js</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">flash</td><td valign="top">:</td><td><div>unable to upgrade because "[Errno 2] No such file or directory: '/home/mattspence/web2py/examples/README'"</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">generic_patterns</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">headers</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">X-Powered-By</td><td valign="top">:</td><td><div>web2py</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">menu</td><td valign="top">:</td><td><div><table><tr><td><div><table><tr><td><div>Site</div></td></tr><tr><td><div>True</div></td></tr><tr><td><div>/admin/default/site</div></td></tr></table></div></td></tr><tr><td><div><table><tr><td><div>Help</div></td></tr><tr><td><div>False</div></td></tr><tr><td><div>/examples/default/documentation</div></td></tr></table></div></td></tr><tr><td><div><table><tr><td><div>Logout</div></td></tr><tr><td><div>False</div></td></tr><tr><td><div>/admin/default/logout</div></td></tr></table></div></td></tr><tr><td><div><table><tr><td><div>Debug</div></td></tr><tr><td><div>False</div></td></tr><tr><td><div>/admin/debug/interact</div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">meta</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">models_to_run</td><td valign="top">:</td><td><div><table><tr><td><div>^\\w+\\.py$</div></td></tr><tr><td><div>^default/\\w+\\.py$</div></td></tr><tr><td><div>^default/site/\\w+\\.py$</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">postprocessing</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_cookie_expires</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_data_name</td><td valign="top">:</td><td><div>session_data_admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_file</td><td valign="top">:</td><td><div><open file '/home/mattspence/web2py/applications/admin/sessions/108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8', mode 'rb+' at 0x2bdadb0></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_filename</td><td valign="top">:</td><td><div>/home/mattspence/web2py/applications/admin/sessions/108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_id</td><td valign="top">:</td><td><div>108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_id_name</td><td valign="top">:</td><td><div>session_id_admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_locked</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_new</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_storage_type</td><td valign="top">:</td><td><div>file</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">status</td><td valign="top">:</td><td><div>200</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">subtitle</td><td valign="top">:</td><td><div>admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">title</td><td valign="top">:</td><td><div>site </div></td></tr><tr><td style="font-weight:bold;vertical-align:top">view</td><td valign="top">:</td><td><div>default/site.html</div></td></tr></table></div>'
- tRp113
- sS'locals'
- p114
- (dp115
- S'IS_SLUG'
- p116
- S"<class 'gluon.validators.IS_SLUG'>"
- p117
- sS'OBJECT'
- p118
- S"<class 'gluon.html.OBJECT'>"
- p119
- sS'plugin_pack'
- p120
- S'<function plugin_pack>'
- p121
- sS'helpicon'
- p122
- S'<function helpicon>'
- p123
- sS'SQLDB'
- p124
- S"<class 'gluon.dal.DAL'>"
- p125
- sS'read_hosts_deny'
- p126
- S'<function read_hosts_deny>'
- p127
- sg106
- S"<Storage {'_user_agent': {'is_mobile': False, 'i...ssion_hash': 'eac378321ffab41f2da22ca2e492be5c'}>"
- p128
- sS'LINK'
- p129
- S"<class 'gluon.html.LINK'>"
- p130
- sS'BR'
- p131
- S"<class 'gluon.html.BR'>"
- p132
- sS'local_import'
- p133
- S'<function <lambda>>'
- p134
- sS'EMBED'
- p135
- S"<class 'gluon.html.EMBED'>"
- p136
- sS'cmdutil'
- p137
- S"<module 'mercurial.cmdutil' from '/usr/local/lib/python2.7/dist-packages/mercurial/cmdutil.py'>"
- p138
- sS'compile2'
- p139
- S'<function compile2>'
- p140
- sS'redirect'
- p141
- S'<function redirect>'
- p142
- sS'IS_INT_IN_RANGE'
- p143
- S"<class 'gluon.validators.IS_INT_IN_RANGE'>"
- p144
- sS'upgrade'
- p145
- S'<function upgrade>'
- p146
- sS'IS_LOWER'
- p147
- S"<class 'gluon.validators.IS_LOWER'>"
- p148
- sS'IS_STRONG'
- p149
- S"<class 'gluon.validators.IS_STRONG'>"
- p150
- sS'write_hosts_deny'
- p151
- S'<function write_hosts_deny>'
- p152
- sS'cache'
- p153
- S'<gluon.cache.Cache object>'
- p154
- sS'addremove'
- p155
- S'<function addremove>'
- p156
- sS'IS_IN_DB'
- p157
- S"<class 'gluon.validators.IS_IN_DB'>"
- p158
- sS'TAG'
- p159
- S'<gluon.html.__TAG__ object>'
- p160
- sS'WEB2PY_VERSION_URL'
- p161
- S"'http://web2py.com/examples/default/version'"
- p162
- sS'app_pack'
- p163
- S'<function app_pack>'
- p164
- sS'SQLField'
- p165
- S"<class 'gluon.dal.Field'>"
- p166
- sS'_f'
- p167
- S"'site'"
- p168
- sS'app_cleanup'
- p169
- S'<function app_cleanup>'
- p170
- sS'_a'
- p171
- S"'admin'"
- p172
- sS'BODY'
- p173
- S"<class 'gluon.html.BODY'>"
- p174
- sS'IS_DATE_IN_RANGE'
- p175
- S"<class 'gluon.validators.IS_DATE_IN_RANGE'>"
- p176
- sS'button_enable'
- p177
- S'<function button_enable>'
- p178
- sS'TH'
- p179
- S"<class 'gluon.html.TH'>"
- p180
- sS'ON'
- p181
- S'True'
- p182
- sS'app_compile'
- p183
- S'<function app_compile>'
- p184
- sS'__file__'
- p185
- S"'/home/mattspence/web2py/applications/admin/controllers/default.py'"
- p186
- sS'zipfile'
- p187
- S"<module 'zipfile' from '/usr/lib/python2.7/zipfile.py'>"
- p188
- sS'stat'
- p189
- S"<module 'stat' from '/usr/lib/python2.7/stat.py'>"
- p190
- sS'P'
- S"<class 'gluon.html.P'>"
- p191
- sS'T'
- S'<gluon.languages.translator object>'
- p192
- sS'ui'
- p193
- S"<module 'mercurial.ui' from '/usr/local/lib/python2.7/dist-packages/mercurial/ui.py'>"
- p194
- sS'XHTML'
- p195
- S"<class 'gluon.html.XHTML'>"
- p196
- sS'EMAIL_SERVER'
- p197
- S"'localhost'"
- p198
- sS'add_path_first'
- p199
- S'<function add_path_first>'
- p200
- sS'regex_include'
- p201
- S'<_sre.SRE_Pattern object>'
- p202
- sS'TicketStorage'
- p203
- S"<class 'gluon.restricted.TicketStorage'>"
- p204
- sS'OL'
- p205
- S"<class 'gluon.html.OL'>"
- p206
- sS'TEXTAREA'
- p207
- S"<class 'gluon.html.TEXTAREA'>"
- p208
- sS'MENU'
- p209
- S"<class 'gluon.html.MENU'>"
- p210
- sS'button'
- p211
- S'<function button>'
- p212
- sS'EMAIL_LOGIN'
- p213
- S'None'
- p214
- sS't0'
- p215
- S'1379202252.335307'
- p216
- sS'check_new_version'
- p217
- S'<function check_new_version>'
- p218
- sS'IS_IMAGE'
- p219
- S"<class 'gluon.validators.IS_IMAGE'>"
- p220
- sS'WEB2PY_URL'
- p221
- S"'http://web2py.com'"
- p222
- sS'LOAD'
- p223
- S'<function LOAD>'
- p224
- sS'IS_EQUAL_TO'
- p225
- S"<class 'gluon.validators.IS_EQUAL_TO'>"
- p226
- sS'CODE'
- p227
- S"<class 'gluon.html.CODE'>"
- p228
- sS'HTTP'
- p229
- S"<class 'gluon.http.HTTP'>"
- p230
- sS'is_gae'
- p231
- S'False'
- p232
- sS'HR'
- p233
- S"<class 'gluon.html.HR'>"
- p234
- sS'IS_DATETIME'
- p235
- S"<class 'gluon.validators.IS_DATETIME'>"
- p236
- sS'login_record'
- p237
- S'<function login_record>'
- p238
- sS'expiration_failed_logins'
- p239
- S'3600'
- p240
- sS'LABEL'
- p241
- S"<class 'gluon.html.LABEL'>"
- p242
- sS'OPTGROUP'
- p243
- S"<class 'gluon.html.OPTGROUP'>"
- p244
- sS'REPLACE_TAB_BY_SPACES'
- p245
- S'4'
- sS'A'
- S"<class 'gluon.html.A'>"
- p246
- sS'LI'
- p247
- S"<class 'gluon.html.LI'>"
- p248
- sS'write_file'
- p249
- S'<function write_file>'
- p250
- sS'port'
- p251
- S'443'
- p252
- sS'SELECT'
- p253
- S"<class 'gluon.html.SELECT'>"
- p254
- sS'DEMO_MODE'
- p255
- g232
- sS'sp_button'
- p256
- S'<function sp_button>'
- p257
- sS'LAYOUTS_APP'
- p258
- S"'http://web2py.com/layouts'"
- p259
- sS'STRONG'
- p260
- S"<class 'gluon.html.STRONG'>"
- p261
- sS'FONT_SIZE'
- p262
- S'10'
- p263
- sS'CENTER'
- p264
- S"<class 'gluon.html.CENTER'>"
- p265
- sS'allowed_number_of_attempts'
- p266
- S'5'
- sg86
- S'<function restricted>'
- p267
- sS'EXPERIMENTAL_STUFF'
- p268
- g182
- sS'urllib'
- p269
- S"<module 'urllib' from '/usr/lib/python2.7/urllib.py'>"
- p270
- sS'DISPLAY'
- p271
- S"'onload'"
- p272
- sS'global_settings'
- p273
- S"<Storage {'debugging': False, 'is_pypy': False, ...': '2.5.1-stable+timestamp.2013.06.06.15.39.19'}>"
- p274
- sS'HTML'
- p275
- S"<class 'gluon.html.HTML'>"
- p276
- sS'SQLFORM'
- p277
- S"<class 'gluon.sqlhtml.SQLFORM'>"
- p278
- sS'deny_file'
- p279
- S"'/home/mattspence/web2py/applications/admin/private/hosts.deny'"
- p280
- sS'tar_compiled'
- p281
- S'<function tar_compiled>'
- p282
- sS'searchbox'
- p283
- S'<function searchbox>'
- p284
- sS'EM'
- p285
- S"<class 'gluon.html.EM'>"
- p286
- sS'PRE'
- p287
- S"<class 'gluon.html.PRE'>"
- p288
- sS'FIELDSET'
- p289
- S"<class 'gluon.html.FIELDSET'>"
- p290
- sS'create_missing_folders'
- p291
- S'<function create_missing_folders>'
- p292
- sS'__builtins__'
- p293
- S"{'ArithmeticError': <type 'exceptions.ArithmeticError'>, 'AssertionError': <type 'exceptions.AssertionError'>, 'AttributeError': <type 'exceptions.AttributeError'>, 'BaseException': <type 'exceptions.BaseException'>, 'BufferError': <type 'exceptions.BufferError'>, 'BytesWarning': <type 'exceptions.BytesWarning'>, 'DeprecationWarning': <type 'exceptions.DeprecationWarning'>, 'EOFError': <type 'exceptions.EOFError'>, 'Ellipsis': Ellipsis, 'EnvironmentError': <type 'exceptions.EnvironmentError'>, ...}"
- p294
- sS'FILTER_APPS'
- p295
- S'[]'
- p296
- sS'HEAD'
- p297
- S"<class 'gluon.html.HEAD'>"
- p298
- sS'embed64'
- p299
- S'<function embed64>'
- p300
- sS'IS_LIST_OF'
- p301
- S"<class 'gluon.validators.IS_LIST_OF'>"
- p302
- sS'apath'
- p303
- S'<function apath>'
- p304
- sS'findT'
- p305
- S'<function findT>'
- p306
- sS'plugin_install'
- p307
- S'<function plugin_install>'
- p308
- sS'cgi'
- p309
- S"<module 'cgi' from '/usr/lib/python2.7/cgi.py'>"
- p310
- sS'regex_expose'
- p311
- S'<_sre.SRE_Pattern object>'
- p312
- sS'CLEANUP'
- p313
- S"<class 'gluon.validators.CLEANUP'>"
- p314
- sS'verify_password'
- p315
- S'<function verify_password>'
- p316
- sS'H2'
- p317
- S"<class 'gluon.html.H2'>"
- p318
- sS'H3'
- p319
- S"<class 'gluon.html.H3'>"
- p320
- sS'BUTTON'
- p321
- S"<class 'gluon.html.BUTTON'>"
- p322
- sS'traceback'
- p323
- S"<module 'traceback' from '/usr/lib/python2.7/traceback.py'>"
- p324
- sS'H6'
- p325
- S"<class 'gluon.html.H6'>"
- p326
- sS'portalocker'
- p327
- S"<module 'gluon.portalocker' from '/home/mattspence/web2py/gluon/portalocker.pyc'>"
- p328
- sS'is_manager'
- p329
- S'<function is_manager>'
- p330
- sS'H5'
- p331
- S"<class 'gluon.html.H5'>"
- p332
- sS'UL'
- p333
- S"<class 'gluon.html.UL'>"
- p334
- sS'IS_UPPER'
- p335
- S"<class 'gluon.validators.IS_UPPER'>"
- p336
- sS'xmlescape'
- p337
- S'<function xmlescape>'
- p338
- sS'IS_TIME'
- p339
- S"<class 'gluon.validators.IS_TIME'>"
- p340
- sS'os'
- p341
- S"<module 'os' from '/usr/lib/python2.7/os.py'>"
- p342
- sS'compile_application'
- p343
- S'<function compile_application>'
- p344
- sS'RestrictedError'
- p345
- S"<class 'gluon.restricted.RestrictedError'>"
- p346
- sS'base64'
- p347
- S"<module 'base64' from '/usr/lib/python2.7/base64.py'>"
- p348
- sS'OPTION'
- p349
- S"<class 'gluon.html.OPTION'>"
- p350
- sS'TITLE'
- p351
- S"<class 'gluon.html.TITLE'>"
- p352
- sS'CRYPT'
- p353
- S"<class 'gluon.validators.CRYPT'>"
- p354
- sS'IS_EMPTY_OR'
- p355
- S"<class 'gluon.validators.IS_EMPTY_OR'>"
- p356
- sS'MARKMIN'
- p357
- S"<class 'gluon.html.MARKMIN'>"
- p358
- sS'w2p_unpack'
- p359
- S'<function w2p_unpack>'
- p360
- sS'web2py_uuid'
- p361
- S'<function web2py_uuid>'
- p362
- sS'INPUT'
- p363
- S"<class 'gluon.html.INPUT'>"
- p364
- sS'MULTI_USER_MODE'
- p365
- g232
- sS'regex_tables'
- p366
- S'<_sre.SRE_Pattern object>'
- p367
- sS'COL'
- p368
- S"<class 'gluon.html.COL'>"
- p369
- sS'SCRIPT'
- p370
- S"<class 'gluon.html.SCRIPT'>"
- p371
- sS'have_mercurial'
- p372
- g182
- sS'is_mobile'
- p373
- g232
- sS'EXPIRATION'
- p374
- S'3600'
- p375
- sS'TEXT_EDITOR_KEYBINDING'
- p376
- S"''"
- p377
- sS'TABLE'
- p378
- S"<class 'gluon.html.TABLE'>"
- p379
- sS'recursive_unlink'
- p380
- S'<function recursive_unlink>'
- p381
- sS'IS_EXPR'
- p382
- S"<class 'gluon.validators.IS_EXPR'>"
- p383
- sS'IS_IPV4'
- p384
- S"<class 'gluon.validators.IS_IPV4'>"
- p385
- sS'IS_LENGTH'
- p386
- S"<class 'gluon.validators.IS_LENGTH'>"
- p387
- sS'IS_IPV6'
- p388
- S"<class 'gluon.validators.IS_IPV6'>"
- p389
- sS'XML'
- p390
- S"<class 'gluon.html.XML'>"
- p391
- sS'B'
- S"<class 'gluon.html.B'>"
- p392
- sS'IMG'
- p393
- S"<class 'gluon.html.IMG'>"
- p394
- sS'SQLTABLE'
- p395
- S"<class 'gluon.sqlhtml.SQLTABLE'>"
- p396
- sS'abspath'
- p397
- S'<function abspath>'
- p398
- sS'untar'
- p399
- S'<function untar>'
- p400
- sS'IS_ALPHANUMERIC'
- p401
- S"<class 'gluon.validators.IS_ALPHANUMERIC'>"
- p402
- sS'site'
- p403
- S"<module 'site' from '/usr/lib/python2.7/site.py'>"
- p404
- sS'hg'
- p405
- S"<module 'mercurial.hg' from '/usr/local/lib/python2.7/dist-packages/mercurial/hg.py'>"
- p406
- sS'socket'
- p407
- S"<module 'socket' from '/usr/lib/python2.7/socket.py'>"
- p408
- sS'app_pack_compiled'
- p409
- S'<function app_pack_compiled>'
- p410
- sS'SPAN'
- p411
- S"<class 'gluon.html.SPAN'>"
- p412
- sS'IS_JSON'
- p413
- S"<class 'gluon.validators.IS_JSON'>"
- p414
- sS'IS_IPADDRESS'
- p415
- S"<class 'gluon.validators.IS_IPADDRESS'>"
- p416
- sS'_c'
- p417
- S"'default'"
- p418
- sS'PLUGINS_APP'
- p419
- S"'http://web2py.com/plugins'"
- p420
- sS'up'
- p421
- S'<function up>'
- p422
- sS'CHECK_VERSION'
- p423
- g182
- sS'TD'
- p424
- S"<class 'gluon.html.TD'>"
- p425
- sS'BEAUTIFY'
- p426
- S"<class 'gluon.html.BEAUTIFY'>"
- p427
- sS'META'
- p428
- S"<class 'gluon.html.META'>"
- p429
- sS'md5_hash'
- p430
- S'<function md5_hash>'
- p431
- sS'read_file'
- p432
- S'<function read_file>'
- p433
- sS'update_all_languages'
- p434
- S'<function update_all_languages>'
- p435
- sS'TEXT_EDITOR'
- p436
- S"'codemirror'"
- p437
- sS'app_create'
- p438
- S'<function app_create>'
- p439
- sS'H1'
- p440
- S"<class 'gluon.html.H1'>"
- p441
- sS'IS_DATE'
- p442
- S"<class 'gluon.validators.IS_DATE'>"
- p443
- sS'IS_EMAIL'
- p444
- S"<class 'gluon.validators.IS_EMAIL'>"
- p445
- sS'tar'
- p446
- S'<function tar>'
- p447
- sS'IS_DECIMAL_IN_RANGE'
- p448
- S"<class 'gluon.validators.IS_DECIMAL_IN_RANGE'>"
- p449
- sS'IS_NOT_EMPTY'
- p450
- S"<class 'gluon.validators.IS_NOT_EMPTY'>"
- p451
- sS'IS_FLOAT_IN_RANGE'
- p452
- S"<class 'gluon.validators.IS_FLOAT_IN_RANGE'>"
- p453
- sS'w2p_pack'
- p454
- S'<function w2p_pack>'
- p455
- sS'TBODY'
- p456
- S"<class 'gluon.html.TBODY'>"
- p457
- sS'CAT'
- p458
- S"<class 'gluon.html.CAT'>"
- p459
- sS'Field'
- p460
- S"<class 'gluon.dal.Field'>"
- p461
- sS'unzip'
- p462
- S'<function unzip>'
- p463
- sS'H4'
- p464
- S"<class 'gluon.html.H4'>"
- p465
- sS'w2p_pack_plugin'
- p466
- S'<function w2p_pack_plugin>'
- p467
- sS'DIV'
- p468
- S"<class 'gluon.html.DIV'>"
- p469
- sS'shutil'
- p470
- S"<module 'shutil' from '/usr/lib/python2.7/shutil.py'>"
- p471
- sS'LEGEND'
- p472
- S"<class 'gluon.html.LEGEND'>"
- p473
- sS'app_install'
- p474
- S'<function app_install>'
- p475
- sS'COLGROUP'
- p476
- S"<class 'gluon.html.COLGROUP'>"
- p477
- sS'A_button'
- p478
- S'<function A_button>'
- p479
- sS'TT'
- p480
- S"<class 'gluon.html.TT'>"
- p481
- sS'TR'
- p482
- S"<class 'gluon.html.TR'>"
- p483
- sS'FULL_SCREEN'
- p484
- S"'false'"
- p485
- sS'__package__'
- p486
- S'None'
- p487
- sS'listdir'
- p488
- S'<function listdir>'
- p489
- sS'URL'
- p490
- S'<function URL>'
- p491
- sS'IFRAME'
- p492
- S"<class 'gluon.html.IFRAME'>"
- p493
- sS'remove_compiled_application'
- p494
- S'<function remove_compiled_application>'
- p495
- sS'IS_URL'
- p496
- S"<class 'gluon.validators.IS_URL'>"
- p497
- sS'IS_MATCH'
- p498
- S"<class 'gluon.validators.IS_MATCH'>"
- p499
- sS'create_missing_app_folders'
- p500
- S'<function create_missing_app_folders>'
- p501
- sS'dedent'
- p502
- S'<function dedent>'
- p503
- sS'STYLE'
- p504
- S"<class 'gluon.html.STYLE'>"
- p505
- sS'IS_NULL_OR'
- p506
- S"<class 'gluon.validators.IS_EMPTY_OR'>"
- p507
- sS'IS_DATETIME_IN_RANGE'
- p508
- S"<class 'gluon.validators.IS_DATETIME_IN_RANGE'>"
- p509
- sS'FORM'
- p510
- S"<class 'gluon.html.FORM'>"
- p511
- sS'I'
- S"<class 'gluon.html.I'>"
- p512
- sS'w2p_unpack_plugin'
- p513
- S'<function w2p_unpack_plugin>'
- p514
- sS'sys'
- p515
- S"<module 'sys' (built-in)>"
- p516
- sS'IS_NOT_IN_DB'
- p517
- S"<class 'gluon.validators.IS_NOT_IN_DB'>"
- p518
- sS'ALLOW_TOGGLE'
- p519
- S"'true'"
- p520
- sS'http_host'
- p521
- S"'mattspence.pythonanywhere.com'"
- p522
- sS'rmtree'
- p523
- S'<function rmtree>'
- p524
- sS'TEXT_EDITOR_THEME'
- p525
- S"'chrome'"
- p526
- sS'parse_version'
- p527
- S'<function parse_version>'
- p528
- sS'cleanpath'
- p529
- S'<function cleanpath>'
- p530
- sg112
- S"<Storage {'body': <cStringIO.StringO object at 0...bda> at 0x14a7aa0>, 'view': 'default/site.html'}>"
- p531
- sS'THEAD'
- p532
- S"<class 'gluon.html.THEAD'>"
- p533
- sS'ANY_OF'
- p534
- S"<class 'gluon.validators.ANY_OF'>"
- p535
- sS'_config'
- p536
- S"{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>, 'AssertionError': <type 'exceptions.AssertionError'>, 'AttributeError': <type 'exceptions.AttributeError'>, 'BaseException': <type 'exceptions.BaseException'>, 'BufferError': <type 'exceptions.BufferError'>, 'BytesWarning': <type 'exceptions.BytesWarning'>, 'DeprecationWarning': <type 'exceptions.DeprecationWarning'>, 'EOFError': <type 'exceptions.EOFError'>, 'Ellipsis': Ellipsis, 'EnvironmentError': <type 'exceptions.EnvironmentError'>, ...}, '__file__': 'Unknown', '__name__': '__restricted__', 'password': '46a72111db809e45a5abf798479579f0'}"
- p537
- sS'fix_newlines'
- p538
- S'<function fix_newlines>'
- p539
- sS'__name__'
- p540
- S"'__restricted__'"
- p541
- sS'GAE_APPCFG'
- p542
- S"'/usr/local/bin/appcfg.py'"
- p543
- sg56
- S"<Storage {'function': 'site', 'body': <cStringIO...applications/admin/', 'post_vars': <Storage {}>}>"
- p544
- sS'difflib'
- p545
- S"<module 'difflib' from '/usr/lib/python2.7/difflib.py'>"
- p546
- sS'EMAIL_SENDER'
- p547
- S"'[email protected]'"
- p548
- sS'DAL'
- p549
- S"<class 'gluon.dal.DAL'>"
- p550
- sS'IS_IN_SET'
- p551
- S"<class 'gluon.validators.IS_IN_SET'>"
- p552
- sS'TWITTER_HASH'
- p553
- S"'web2py'"
- p554
- sS'IS_UPLOAD_FILENAME'
- p555
- S"<class 'gluon.validators.IS_UPLOAD_FILENAME'>"
- p556
- sS'time'
- p557
- S"<module 'time' (built-in)>"
- p558
- sS'app_uninstall'
- p559
- S'<function app_uninstall>'
- p560
- sS'regex_extend'
- p561
- S'<_sre.SRE_Pattern object>'
- p562
- sS're'
- p563
- S"<module 're' from '/usr/lib/python2.7/re.py'>"
- p564
- sS'TFOOT'
- p565
- S"<class 'gluon.html.TFOOT'>"
- p566
- sssg323
- S'Traceback (most recent call last):\n File "/home/mattspence/web2py/gluon/restricted.py", line 212, in restricted\n exec ccode in environment\n File "/home/mattspence/web2py/applications/admin/controllers/default.py", line 14, in <module>\n from gluon.tools import Config\nImportError: cannot import name Config\n'
- p567
- s.(dp1
- S'output'
- p2
- S"<type 'exceptions.ImportError'> cannot import name Config"
- p3
- sS'layer'
- p4
- S'/home/mattspence/web2py/applications/admin/controllers/default.py'
- p5
- sS'code'
- p6
- S'# coding: utf8\n\nEXPERIMENTAL_STUFF = True\n\nif EXPERIMENTAL_STUFF:\n if is_mobile:\n response.view = response.view.replace(\'default/\', \'default.mobile/\')\n response.menu = []\n\nimport re\nfrom gluon.admin import *\nfrom gluon.fileutils import abspath, read_file, write_file\nfrom gluon.utils import web2py_uuid\nfrom gluon.tools import Config\nfrom glob import glob\nimport shutil\nimport platform\n\ntry:\n import git\n if git.__version__ < \'0.3.1\':\n raise ImportError("Your version of git is %s. Upgrade to 0.3.1 or better." % git.__version__)\n have_git = True\nexcept ImportError, e:\n have_git = False\n GIT_MISSING = \'Requires gitpython module, but not installed or incompatible version: %s\' % e\n\nfrom gluon.languages import (read_possible_languages, read_dict, write_dict,\n read_plural_dict, write_plural_dict)\n\n\nif DEMO_MODE and request.function in [\'change_password\', \'pack\', \'pack_custom\',\'pack_plugin\', \'upgrade_web2py\', \'uninstall\', \'cleanup\', \'compile_app\', \'remove_compiled_app\', \'delete\', \'delete_plugin\', \'create_file\', \'upload_file\', \'update_languages\', \'reload_routes\', \'git_push\', \'git_pull\']:\n session.flash = T(\'disabled in demo mode\')\n redirect(URL(\'site\'))\n\n\nif not is_manager() and request.function in [\'change_password\', \'upgrade_web2py\']:\n session.flash = T(\'disabled in multi user mode\')\n redirect(URL(\'site\'))\n\nif FILTER_APPS and request.args(0) and not request.args(0) in FILTER_APPS:\n session.flash = T(\'disabled in demo mode\')\n redirect(URL(\'site\'))\n\n\nif not session.token:\n session.token = web2py_uuid()\n\n\ndef count_lines(data):\n return len([line for line in data.split(\'\\n\') if line.strip() and not line.startswith(\'#\')])\n\n\ndef log_progress(app, mode=\'EDIT\', filename=None, progress=0):\n progress_file = os.path.join(apath(app, r=request), \'progress.log\')\n now = str(request.now)[:19]\n if not os.path.exists(progress_file):\n safe_open(progress_file, \'w\').write(\'[%s] START\\n\' % now)\n if filename:\n safe_open(progress_file, \'a\').write(\n \'[%s] %s %s: %s\\n\' % (now, mode, filename, progress))\n\n\ndef safe_open(a, b):\n if DEMO_MODE and (\'w\' in b or \'a\' in b):\n class tmp:\n def write(self, data):\n pass\n return tmp()\n return open(a, b)\n\n\ndef safe_read(a, b=\'r\'):\n safe_file = safe_open(a, b)\n try:\n return safe_file.read()\n finally:\n safe_file.close()\n\n\ndef safe_write(a, value, b=\'w\'):\n safe_file = safe_open(a, b)\n try:\n safe_file.write(value)\n finally:\n safe_file.close()\n\n\ndef get_app(name=None):\n app = name or request.args(0)\n if (app and os.path.exists(apath(app, r=request)) and\n (not MULTI_USER_MODE or is_manager() or\n db(db.app.name == app)(db.app.owner == auth.user.id).count())):\n return app\n session.flash = T(\'App does not exist or you are not authorized\')\n redirect(URL(\'site\'))\n\n\ndef index():\n """ Index handler """\n\n send = request.vars.send\n if DEMO_MODE:\n session.authorized = True\n session.last_time = t0\n if not send:\n send = URL(\'site\')\n if session.authorized:\n redirect(send)\n elif request.vars.password:\n if verify_password(request.vars.password):\n session.authorized = True\n login_record(True)\n\n if CHECK_VERSION:\n session.check_version = True\n else:\n session.check_version = False\n\n session.last_time = t0\n if isinstance(send, list): # ## why does this happen?\n send = str(send[0])\n\n redirect(send)\n else:\n times_denied = login_record(False)\n if times_denied >= allowed_number_of_attempts:\n response.flash = \\\n T(\'admin disabled because too many invalid login attempts\')\n elif times_denied == allowed_number_of_attempts - 1:\n response.flash = \\\n T(\'You have one more login attempt before you are locked out\')\n else:\n response.flash = T(\'invalid password.\')\n return dict(send=send)\n\n\ndef check_version():\n """ Checks if web2py is up to date """\n\n session.forget()\n session._unlock(response)\n\n new_version, version = check_new_version(request.env.web2py_version,\n WEB2PY_VERSION_URL)\n\n if new_version == -1:\n return A(T(\'Unable to check for upgrades\'), _href=WEB2PY_URL)\n elif new_version != True:\n return A(T(\'web2py is up to date\'), _href=WEB2PY_URL)\n elif platform.system().lower() in (\'windows\', \'win32\', \'win64\') and os.path.exists("web2py.exe"):\n return SPAN(\'You should upgrade to %s\' % version.split(\'(\')[0])\n else:\n return sp_button(URL(\'upgrade_web2py\'), T(\'upgrade now to %s\') % version.split(\'(\')[0])\n\n\ndef logout():\n """ Logout handler """\n session.authorized = None\n if MULTI_USER_MODE:\n redirect(URL(\'user/logout\'))\n redirect(URL(\'index\'))\n\n\ndef change_password():\n\n if session.pam_user:\n session.flash = T(\n \'PAM authenticated user, cannot change password here\')\n redirect(URL(\'site\'))\n form = SQLFORM.factory(Field(\'current_admin_password\', \'password\'),\n Field(\'new_admin_password\',\n \'password\', requires=IS_STRONG()),\n Field(\'new_admin_password_again\', \'password\'),\n _class="span4 well")\n if form.accepts(request.vars):\n if not verify_password(request.vars.current_admin_password):\n form.errors.current_admin_password = T(\'invalid password\')\n elif form.vars.new_admin_password != form.vars.new_admin_password_again:\n form.errors.new_admin_password_again = T(\'no match\')\n else:\n path = abspath(\'parameters_%s.py\' % request.env.server_port)\n safe_write(path, \'password="%s"\' % CRYPT()(\n request.vars.new_admin_password)[0])\n session.flash = T(\'password changed\')\n redirect(URL(\'site\'))\n return dict(form=form)\n\n\ndef site():\n """ Site handler """\n\n myversion = request.env.web2py_version\n\n # Shortcut to make the elif statements more legible\n file_or_appurl = \'file\' in request.vars or \'appurl\' in request.vars\n\n class IS_VALID_APPNAME(object):\n def __call__(self, value):\n if not re.compile(\'\\w+\').match(value):\n return (value, T(\'Invalid application name\'))\n if not request.vars.overwrite and \\\n os.path.exists(os.path.join(apath(r=request), value)):\n return (value, T(\'Application exists already\'))\n return (value, None)\n\n is_appname = IS_VALID_APPNAME()\n form_create = SQLFORM.factory(Field(\'name\', requires=is_appname),\n table_name=\'appcreate\')\n form_update = SQLFORM.factory(Field(\'name\', requires=is_appname),\n Field(\'file\', \'upload\', uploadfield=False),\n Field(\'url\'),\n Field(\'overwrite\', \'boolean\'),\n table_name=\'appupdate\')\n form_create.process()\n form_update.process()\n\n if DEMO_MODE:\n pass\n\n elif form_create.accepted:\n # create a new application\n appname = cleanpath(form_create.vars.name)\n created, error = app_create(appname, request, info=True)\n if created:\n if MULTI_USER_MODE:\n db.app.insert(name=appname, owner=auth.user.id)\n log_progress(appname)\n session.flash = T(\'new application "%s" created\', appname)\n redirect(URL(\'design\', args=appname))\n else:\n session.flash = \\\n DIV(T(\'unable to create application "%s"\' % appname),\n PRE(error))\n redirect(URL(r=request))\n\n elif form_update.accepted:\n if (form_update.vars.url or \'\').endswith(\'.git\'):\n if not have_git:\n session.flash = GIT_MISSING\n redirect(URL(r=request))\n target = os.path.join(apath(r=request), form_update.vars.name)\n try:\n new_repo = git.Repo.clone_from(form_update.vars.url, target)\n session.flash = T(\'new application "%s" imported\',\n form_update.vars.name)\n except git.GitCommandError, err:\n session.flash = T(\'Invalid git repository specified.\')\n redirect(URL(r=request))\n\n elif form_update.vars.url:\n # fetch an application via URL or file upload\n try:\n f = urllib.urlopen(form_update.vars.url)\n if f.code == 404:\n raise Exception("404 file not found")\n except Exception, e:\n session.flash = \\\n DIV(T(\'Unable to download app because:\'), PRE(str(e)))\n redirect(URL(r=request))\n fname = form_update.vars.url\n\n elif form_update.accepted and form_update.vars.file:\n fname = request.vars.file.filename\n f = request.vars.file.file\n\n else:\n session.flash = \'No file uploaded and no URL specified\'\n redirect(URL(r=request))\n\n if f:\n appname = cleanpath(form_update.vars.name)\n installed = app_install(appname, f,\n request, fname,\n overwrite=form_update.vars.overwrite)\n if f and installed:\n msg = \'application %(appname)s installed with md5sum: %(digest)s\'\n if MULTI_USER_MODE:\n db.app.insert(name=appname, owner=auth.user.id)\n log_progress(appname)\n session.flash = T(msg, dict(appname=appname,\n digest=md5_hash(installed)))\n elif f and form_update.vars.overwrite:\n msg = \'unable to install application "%(appname)s"\'\n session.flash = T(msg, dict(appname=form_update.vars.name))\n else:\n msg = \'unable to install application "%(appname)s"\'\n session.flash = T(msg, dict(appname=form_update.vars.name))\n redirect(URL(r=request))\n\n regex = re.compile(\'^\\w+$\')\n\n if is_manager():\n apps = [f for f in os.listdir(apath(r=request)) if regex.match(f)]\n else:\n apps = [f.name for f in db(db.app.owner == auth.user_id).select()]\n\n if FILTER_APPS:\n apps = [f for f in apps if f in FILTER_APPS]\n\n apps = sorted(apps, lambda a, b: cmp(a.upper(), b.upper()))\n myplatform = platform.python_version()\n return dict(app=None, apps=apps, myversion=myversion, myplatform=myplatform,\n form_create=form_create, form_update=form_update)\n\n\ndef report_progress(app):\n import datetime\n progress_file = os.path.join(apath(app, r=request), \'progress.log\')\n regex = re.compile(\'\\[(.*?)\\][^\\:]+\\:\\s+(\\-?\\d+)\')\n if not os.path.exists(progress_file):\n return []\n matches = regex.findall(open(progress_file, \'r\').read())\n events, counter = [], 0\n for m in matches:\n if not m:\n continue\n days = -(request.now - datetime.datetime.strptime(m[0],\n \'%Y-%m-%d %H:%M:%S\')).days\n counter += int(m[1])\n events.append([days, counter])\n return events\n\n\ndef pack():\n app = get_app()\n\n try:\n if len(request.args) == 1:\n fname = \'web2py.app.%s.w2p\' % app\n filename = app_pack(app, request, raise_ex=True)\n else:\n fname = \'web2py.app.%s.compiled.w2p\' % app\n filename = app_pack_compiled(app, request, raise_ex=True)\n except Exception, e:\n filename = None\n\n if filename:\n response.headers[\'Content-Type\'] = \'application/w2p\'\n disposition = \'attachment; filename=%s\' % fname\n response.headers[\'Content-Disposition\'] = disposition\n return safe_read(filename, \'rb\')\n else:\n session.flash = T(\'internal error: %s\' % e)\n redirect(URL(\'site\'))\n\ndef pack_plugin():\n app = get_app()\n if len(request.args) == 2:\n fname = \'web2py.plugin.%s.w2p\' % request.args[1]\n filename = plugin_pack(app, request.args[1], request)\n if filename:\n response.headers[\'Content-Type\'] = \'application/w2p\'\n disposition = \'attachment; filename=%s\' % fname\n response.headers[\'Content-Disposition\'] = disposition\n return safe_read(filename, \'rb\')\n else:\n session.flash = T(\'internal error\')\n redirect(URL(\'plugin\', args=request.args))\n\ndef pack_custom():\n app = get_app()\n base = apath(app, r=request)\n if request.post_vars.file:\n files = request.post_vars.file\n files = [files] if not isinstance(files,list) else files\n fname = \'web2py.app.%s.w2p\' % app\n try:\n filename = app_pack(app, request, raise_ex=True, filenames=files)\n except Exception, e:\n filename = None\n if filename:\n response.headers[\'Content-Type\'] = \'application/w2p\'\n disposition = \'attachment; filename=%s\' % fname\n response.headers[\'Content-Disposition\'] = disposition\n return safe_read(filename, \'rb\')\n else:\n session.flash = T(\'internal error: %s\' % e)\n redirect(URL(args=request.args))\n def ignore(fs):\n return [f for f in fs if not (\n f[:1] in \'#\' or f.endswith(\'~\') or f.endswith(\'.bak\'))]\n files = {}\n for (r,d,f) in os.walk(base):\n files[r] = {\'folders\':ignore(d),\'files\':ignore(f)}\n return locals()\n\n\ndef upgrade_web2py():\n dialog = FORM.confirm(T(\'Upgrade\'),\n {T(\'Cancel\'): URL(\'site\')})\n if dialog.accepted:\n (success, error) = upgrade(request)\n if success:\n session.flash = T(\'web2py upgraded; please restart it\')\n else:\n session.flash = T(\'unable to upgrade because "%s"\', error)\n redirect(URL(\'site\'))\n return dict(dialog=dialog)\n\n\ndef uninstall():\n app = get_app()\n\n dialog = FORM.confirm(T(\'Uninstall\'),\n {T(\'Cancel\'): URL(\'site\')})\n dialog[\'_id\'] = \'confirm_form\'\n dialog[\'_class\'] = \'well\'\n for component in dialog.components:\n component[\'_class\'] = \'btn\'\n\n if dialog.accepted:\n if MULTI_USER_MODE:\n if is_manager() and db(db.app.name == app).delete():\n pass\n elif db(db.app.name == app)(db.app.owner == auth.user.id).delete():\n pass\n else:\n session.flash = T(\'no permission to uninstall "%s"\', app)\n redirect(URL(\'site\'))\n try:\n filename = app_pack(app, request, raise_ex=True)\n except:\n session.flash = T(\'unable to uninstall "%s"\', app)\n else:\n if app_uninstall(app, request):\n session.flash = T(\'application "%s" uninstalled\', app)\n else:\n session.flash = T(\'unable to uninstall "%s"\', app)\n redirect(URL(\'site\'))\n return dict(app=app, dialog=dialog)\n\n\ndef cleanup():\n app = get_app()\n clean = app_cleanup(app, request)\n if not clean:\n session.flash = T("some files could not be removed")\n else:\n session.flash = T(\'cache, errors and sessions cleaned\')\n\n redirect(URL(\'site\'))\n\n\ndef compile_app():\n app = get_app()\n c = app_compile(app, request)\n if not c:\n session.flash = T(\'application compiled\')\n else:\n session.flash = DIV(T(\'Cannot compile: there are errors in your app:\'),\n CODE(c))\n redirect(URL(\'site\'))\n\n\ndef remove_compiled_app():\n """ Remove the compiled application """\n app = get_app()\n remove_compiled_application(apath(app, r=request))\n session.flash = T(\'compiled application removed\')\n redirect(URL(\'site\'))\n\n\ndef delete():\n """ Object delete handler """\n app = get_app()\n filename = \'/\'.join(request.args)\n sender = request.vars.sender\n\n if isinstance(sender, list): # ## fix a problem with Vista\n sender = sender[0]\n\n dialog = FORM.confirm(T(\'Delete\'),\n {T(\'Cancel\'): URL(sender, anchor=request.vars.id)})\n\n if dialog.accepted:\n try:\n full_path = apath(filename, r=request)\n lineno = count_lines(open(full_path, \'r\').read())\n os.unlink(full_path)\n log_progress(app, \'DELETE\', filename, progress=-lineno)\n session.flash = T(\'file "%(filename)s" deleted\',\n dict(filename=filename))\n except Exception:\n session.flash = T(\'unable to delete file "%(filename)s"\',\n dict(filename=filename))\n redirect(URL(sender, anchor=request.vars.id2))\n return dict(dialog=dialog, filename=filename)\n\n\ndef enable():\n app = get_app()\n filename = os.path.join(apath(app, r=request), \'DISABLED\')\n if is_gae:\n return SPAN(T(\'Not supported\'), _style=\'color:yellow\')\n elif os.path.exists(filename):\n return SPAN(T(\'Disable\'), _style=\'color:green\')\n else:\n safe_open(filename, \'wb\').write(\'disabled: True\\ntime-disabled: %s\' % request.now)\n return SPAN(T(\'Enable\'), _style=\'color:red\')\n\ndef peek():\n """ Visualize object code """\n app = get_app(request.vars.app)\n filename = \'/\'.join(request.args)\n if request.vars.app:\n path = abspath(filename)\n else:\n path = apath(filename, r=request)\n try:\n data = safe_read(path).replace(\'\\r\', \'\')\n except IOError:\n session.flash = T(\'file does not exist\')\n redirect(URL(\'site\'))\n\n extension = filename[filename.rfind(\'.\') + 1:].lower()\n\n return dict(app=app,\n filename=filename,\n data=data,\n extension=extension)\n\n\ndef test():\n """ Execute controller tests """\n app = get_app()\n if len(request.args) > 1:\n file = request.args[1]\n else:\n file = \'.*\\.py\'\n\n controllers = listdir(\n apath(\'%s/controllers/\' % app, r=request), file + \'$\')\n\n return dict(app=app, controllers=controllers)\n\n\ndef keepalive():\n return \'\'\n\n\ndef search():\n keywords = request.vars.keywords or \'\'\n app = get_app()\n\n def match(filename, keywords):\n filename = os.path.join(apath(app, r=request), filename)\n if keywords in read_file(filename, \'rb\'):\n return True\n return False\n path = apath(request.args[0], r=request)\n files1 = glob(os.path.join(path, \'*/*.py\'))\n files2 = glob(os.path.join(path, \'*/*.html\'))\n files3 = glob(os.path.join(path, \'*/*/*.html\'))\n files = [x[len(path) + 1:].replace(\n \'\\\\\', \'/\') for x in files1 + files2 + files3 if match(x, keywords)]\n return response.json(dict(files=files, message=T.M(\'Searching: **%s** %%{file}\', len(files))))\n\n\ndef edit():\n """ File edit handler """\n # Load json only if it is ajax edited...\n app = get_app(request.vars.app)\n app_path = apath(app, r=request)\n editor_defaults={\'theme\':\'web2py\'}\n config = Config(os.path.join(request.folder, \'settings.cfg\'),\n section=\'editor\', default_values=editor_defaults)\n preferences = config.read()\n\n if not(request.ajax):\n # return the scaffolding, the rest will be through ajax requests\n response.title = T(\'Editing %s\' % app)\n editarea_preferences = {}\n editarea_preferences[\'FONT_SIZE\'] = \'10\'\n editarea_preferences[\'FULL_SCREEN\'] = \'false\'\n editarea_preferences[\'ALLOW_TOGGLE\'] = \'true\'\n editarea_preferences[\'REPLACE_TAB_BY_SPACES\'] = \'4\'\n editarea_preferences[\'DISPLAY\'] = \'onload\'\n for key in editarea_preferences:\n if key in globals():\n editarea_preferences[key] = globals()[key]\n return response.render (\'default/edit.html\', dict(app=request.args[0], editor_settings=preferences, editarea_preferences=editarea_preferences))\n\n # show settings tab and save prefernces\n if \'settings\' in request.vars:\n if request.post_vars: #save new preferences\n if config.save(request.post_vars.items()):\n response.headers["web2py-component-flash"] = T(\'Preferences saved correctly\')\n else:\n response.headers["web2py-component-flash"] = T(\'Preferences saved on session only\')\n response.headers["web2py-component-command"] = "update_theme(\'%s\'); jQuery(\'a[href=#editor_settings] button.close\').click();" % config.read()[\'theme\']\n return\n else:\n details = {\'filename\':\'settings\', \'id\':\'editor_settings\', \'force\': False}\n details[\'plain_html\'] = response.render(\'default/editor_settings.html\', {\'editor_settings\':preferences})\n return response.json(details)\n\n """ File edit handler """\n # Load json only if it is ajax edited...\n app = get_app(request.vars.app)\n filename = \'/\'.join(request.args)\n response.title = request.args[-1]\n if request.vars.app:\n path = abspath(filename)\n else:\n path = apath(filename, r=request)\n # Try to discover the file type\n if filename[-3:] == \'.py\':\n filetype = \'python\'\n elif filename[-5:] == \'.html\':\n filetype = \'html\'\n elif filename[-5:] == \'.load\':\n filetype = \'html\'\n elif filename[-4:] == \'.css\':\n filetype = \'css\'\n elif filename[-3:] == \'.js\':\n filetype = \'js\'\n else:\n filetype = \'html\'\n\n # ## check if file is not there\n if (\'revert\' in request.vars) and os.path.exists(path + \'.bak\'):\n try:\n data = safe_read(path + \'.bak\')\n data1 = safe_read(path)\n except IOError:\n session.flash = T(\'Invalid action\')\n if \'from_ajax\' in request.vars:\n return response.json({\'error\': str(T(\'Invalid action\'))})\n else:\n redirect(URL(\'site\'))\n\n safe_write(path, data)\n file_hash = md5_hash(data)\n saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])\n safe_write(path + \'.bak\', data1)\n response.flash = T(\'file "%s" of %s restored\', (filename, saved_on))\n else:\n try:\n data = safe_read(path)\n except IOError:\n session.flash = T(\'Invalid action\')\n if \'from_ajax\' in request.vars:\n return response.json({\'error\': str(T(\'Invalid action\'))})\n else:\n redirect(URL(\'site\'))\n\n lineno_old = count_lines(data)\n file_hash = md5_hash(data)\n saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])\n\n if request.vars.file_hash and request.vars.file_hash != file_hash:\n session.flash = T(\'file changed on disk\')\n data = request.vars.data.replace(\'\\r\\n\', \'\\n\').strip() + \'\\n\'\n safe_write(path + \'.1\', data)\n if \'from_ajax\' in request.vars:\n return response.json({\'error\': str(T(\'file changed on disk\')),\n \'redirect\': URL(\'resolve\',\n args=request.args)})\n else:\n redirect(URL(\'resolve\', args=request.args))\n elif request.vars.data:\n safe_write(path + \'.bak\', data)\n data = request.vars.data.replace(\'\\r\\n\', \'\\n\').strip() + \'\\n\'\n safe_write(path, data)\n lineno_new = count_lines(data)\n log_progress(\n app, \'EDIT\', filename, progress=lineno_new - lineno_old)\n file_hash = md5_hash(data)\n saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])\n response.flash = T(\'file saved on %s\', saved_on)\n\n data_or_revert = (request.vars.data or request.vars.revert)\n\n # Check compile errors\n highlight = None\n if filetype == \'python\' and request.vars.data:\n import _ast\n try:\n code = request.vars.data.rstrip().replace(\'\\r\\n\', \'\\n\') + \'\\n\'\n compile(code, path, "exec", _ast.PyCF_ONLY_AST)\n except Exception, e:\n # offset calculation is only used for textarea (start/stop)\n start = sum([len(line) + 1 for l, line\n in enumerate(request.vars.data.split("\\n"))\n if l < e.lineno - 1])\n if e.text and e.offset:\n offset = e.offset - (len(e.text) - len(\n e.text.splitlines()[-1]))\n else:\n offset = 0\n highlight = {\'start\': start, \'end\': start +\n offset + 1, \'lineno\': e.lineno, \'offset\': offset}\n try:\n ex_name = e.__class__.__name__\n except:\n ex_name = \'unknown exception!\'\n response.flash = DIV(T(\'failed to compile file because:\'), BR(),\n B(ex_name), \' \' + T(\'at line %s\', e.lineno),\n offset and \' \' +\n T(\'at char %s\', offset) or \'\',\n PRE(str(e)))\n\n if data_or_revert and request.args[1] == \'modules\':\n # Lets try to reload the modules\n try:\n mopath = \'.\'.join(request.args[2:])[:-3]\n exec \'import applications.%s.modules.%s\' % (\n request.args[0], mopath)\n reload(sys.modules[\'applications.%s.modules.%s\'\n % (request.args[0], mopath)])\n except Exception, e:\n response.flash = DIV(\n T(\'failed to reload module because:\'), PRE(str(e)))\n\n edit_controller = None\n editviewlinks = None\n view_link = None\n if filetype == \'html\' and len(request.args) >= 3:\n cfilename = os.path.join(request.args[0], \'controllers\',\n request.args[2] + \'.py\')\n if os.path.exists(apath(cfilename, r=request)):\n edit_controller = URL(\'edit\', args=[cfilename.replace(os.sep, "/")])\n view = request.args[3].replace(\'.html\', \'\')\n view_link = URL(request.args[0], request.args[2], view)\n elif filetype == \'python\' and request.args[1] == \'controllers\':\n ## it\'s a controller file.\n ## Create links to all of the associated view files.\n app = get_app()\n viewname = os.path.splitext(request.args[2])[0]\n viewpath = os.path.join(app, \'views\', viewname)\n aviewpath = apath(viewpath, r=request)\n viewlist = []\n if os.path.exists(aviewpath):\n if os.path.isdir(aviewpath):\n viewlist = glob(os.path.join(aviewpath, \'*.html\'))\n elif os.path.exists(aviewpath + \'.html\'):\n viewlist.append(aviewpath + \'.html\')\n if len(viewlist):\n editviewlinks = []\n for v in viewlist:\n vf = os.path.split(v)[-1]\n vargs = "/".join([viewpath.replace(os.sep, "/"), vf])\n editviewlinks.append(A(vf.split(".")[0],\n _class="editor_filelink",\n _href=URL(\'edit\', args=[vargs])))\n\n if len(request.args) > 2 and request.args[1] == \'controllers\':\n controller = (request.args[2])[:-3]\n functions = regex_expose.findall(data)\n else:\n (controller, functions) = (None, None)\n\n if \'from_ajax\' in request.vars:\n return response.json({\'file_hash\': file_hash, \'saved_on\': saved_on, \'functions\': functions, \'controller\': controller, \'application\': request.args[0], \'highlight\': highlight})\n else:\n file_details = dict(app=request.args[0],\n filename=filename,\n filetype=filetype,\n data=data,\n edit_controller=edit_controller,\n file_hash=file_hash,\n saved_on=saved_on,\n controller=controller,\n functions=functions,\n view_link=view_link,\n editviewlinks=editviewlinks,\n id=IS_SLUG()(filename)[0],\n force= True if (request.vars.restore or request.vars.revert) else False)\n plain_html = response.render(\'default/edit_js.html\', file_details)\n file_details[\'plain_html\'] = plain_html\n return response.json(file_details)\n\n\ndef resolve():\n """\n """\n\n filename = \'/\'.join(request.args)\n # ## check if file is not there\n path = apath(filename, r=request)\n a = safe_read(path).split(\'\\n\')\n try:\n b = safe_read(path + \'.1\').split(\'\\n\')\n except IOError:\n session.flash = \'Other file, no longer there\'\n redirect(URL(\'edit\', args=request.args))\n\n d = difflib.ndiff(a, b)\n\n def leading(line):\n """ """\n\n # TODO: we really need to comment this\n z = \'\'\n for (k, c) in enumerate(line):\n if c == \' \':\n z += \' \'\n elif c == \' \\t\':\n z += \' \'\n elif k == 0 and c == \'?\':\n pass\n else:\n break\n\n return XML(z)\n\n def getclass(item):\n """ Determine item class """\n\n if item[0] == \' \':\n return \'normal\'\n if item[0] == \'+\':\n return \'plus\'\n if item[0] == \'-\':\n return \'minus\'\n\n if request.vars:\n c = \'\\n\'.join([item[2:].rstrip() for (i, item) in enumerate(d) if item[0]\n == \' \' or \'line%i\' % i in request.vars])\n safe_write(path, c)\n session.flash = \'files merged\'\n redirect(URL(\'edit\', args=request.args))\n else:\n # Making the short circuit compatible with <= python2.4\n gen_data = lambda index, item: not item[:1] in [\'+\', \'-\'] and "" \\\n or INPUT(_type=\'checkbox\',\n _name=\'line%i\' % index,\n value=item[0] == \'+\')\n\n diff = TABLE(*[TR(TD(gen_data(i, item)),\n TD(item[0]),\n TD(leading(item[2:]),\n TT(item[2:].rstrip())),\n _class=getclass(item))\n for (i, item) in enumerate(d) if item[0] != \'?\'])\n\n return dict(diff=diff, filename=filename)\n\n\ndef edit_language():\n """ Edit language file """\n app = get_app()\n filename = \'/\'.join(request.args)\n response.title = request.args[-1]\n strings = read_dict(apath(filename, r=request))\n\n if \'__corrupted__\' in strings:\n form = SPAN(strings[\'__corrupted__\'], _class=\'error\')\n return dict(filename=filename, form=form)\n\n keys = sorted(strings.keys(), lambda x, y: cmp(\n unicode(x, \'utf-8\').lower(), unicode(y, \'utf-8\').lower()))\n rows = []\n rows.append(H2(T(\'Original/Translation\')))\n\n for key in keys:\n name = md5_hash(key)\n s = strings[key]\n (prefix, sep, key) = key.partition(\'\\x01\')\n if sep:\n prefix = SPAN(prefix + \': \', _class=\'tm_ftag\')\n k = key\n else:\n (k, prefix) = (prefix, \'\')\n\n _class = \'untranslated\' if k == s else \'translated\'\n\n if len(s) <= 40:\n elem = INPUT(_type=\'text\', _name=name, value=s,\n _size=70, _class=_class)\n else:\n elem = TEXTAREA(_name=name, value=s, _cols=70,\n _rows=5, _class=_class)\n\n # Making the short circuit compatible with <= python2.4\n k = (s != k) and k or B(k)\n\n new_row = DIV(LABEL(prefix, k, _style="font-weight:normal;"),\n CAT(elem, \'\\n\', TAG.BUTTON(\n T(\'delete\'),\n _onclick=\'return delkey("%s")\' % name,\n _class=\'btn\')), _id=name, _class=\'span6 well well-small\')\n\n rows.append(DIV(new_row,_class="row-fluid"))\n rows.append(DIV(INPUT(_type=\'submit\', _value=T(\'update\'), _class="btn btn-primary"), _class=\'controls\'))\n form = FORM(*rows)\n if form.accepts(request.vars, keepvalues=True):\n strs = dict()\n for key in keys:\n name = md5_hash(key)\n if form.vars[name] == chr(127):\n continue\n strs[key] = form.vars[name]\n write_dict(apath(filename, r=request), strs)\n session.flash = T(\'file saved on %(time)s\', dict(time=time.ctime()))\n redirect(URL(r=request, args=request.args))\n return dict(app=request.args[0], filename=filename, form=form)\n\n\ndef edit_plurals():\n """ Edit plurals file """\n app = get_app()\n filename = \'/\'.join(request.args)\n plurals = read_plural_dict(\n apath(filename, r=request)) # plural forms dictionary\n nplurals = int(request.vars.nplurals) - 1 # plural forms quantity\n xnplurals = xrange(nplurals)\n\n if \'__corrupted__\' in plurals:\n # show error message and exit\n form = SPAN(plurals[\'__corrupted__\'], _class=\'error\')\n return dict(filename=filename, form=form)\n\n keys = sorted(plurals.keys(), lambda x, y: cmp(\n unicode(x, \'utf-8\').lower(), unicode(y, \'utf-8\').lower()))\n tab_rows = []\n for key in keys:\n name = md5_hash(key)\n forms = plurals[key]\n\n if len(forms) < nplurals:\n forms.extend(None for i in xrange(nplurals - len(forms)))\n tab_col1 = DIV(CAT(LABEL(T("Singular Form")), B(key,\n _class=\'fake-input\')))\n tab_inputs = [SPAN(LABEL(T("Plural Form #%s", n + 1)), INPUT(_type=\'text\', _name=name + \'_\' + str(n), value=forms[n], _size=20), _class=\'span6\') for n in xnplurals]\n tab_col2 = DIV(CAT(*tab_inputs))\n tab_col3 = DIV(CAT(LABEL(XML(\' \')), TAG.BUTTON(T(\'delete\'), _onclick=\'return delkey("%s")\' % name, _class=\'btn\'), _class=\'span6\'))\n tab_row = DIV(DIV(tab_col1, \'\\n\', tab_col2, \'\\n\', tab_col3, _class=\'well well-small\'), _id=name, _class=\'row-fluid tab_row\')\n tab_rows.append(tab_row)\n\n tab_rows.append(DIV(TAG[\'button\'](T(\'update\'), _type=\'submit\',\n _class=\'btn btn-primary\'),\n _class=\'controls\'))\n tab_container = DIV(*tab_rows, **dict(_class="row-fluid"))\n\n form = FORM(tab_container)\n if form.accepts(request.vars, keepvalues=True):\n new_plurals = dict()\n for key in keys:\n name = md5_hash(key)\n if form.vars[name + \'_0\'] == chr(127):\n continue\n new_plurals[key] = [form.vars[name + \'_\' + str(n)]\n for n in xnplurals]\n write_plural_dict(apath(filename, r=request), new_plurals)\n session.flash = T(\'file saved on %(time)s\', dict(time=time.ctime()))\n redirect(URL(r=request, args=request.args, vars=dict(\n nplurals=request.vars.nplurals)))\n return dict(app=request.args[0], filename=filename, form=form)\n\n\ndef about():\n """ Read about info """\n app = get_app()\n # ## check if file is not there\n about = safe_read(apath(\'%s/ABOUT\' % app, r=request))\n license = safe_read(apath(\'%s/LICENSE\' % app, r=request))\n return dict(app=app, about=MARKMIN(about), license=MARKMIN(license), progress=report_progress(app))\n\n\ndef design():\n """ Application design handler """\n app = get_app()\n\n if not response.flash and app == request.application:\n msg = T(\'ATTENTION: you cannot edit the running application!\')\n response.flash = msg\n\n if request.vars and not request.vars.token == session.token:\n redirect(URL(\'logout\'))\n\n if request.vars.pluginfile is not None and not isinstance(request.vars.pluginfile, str):\n filename = os.path.basename(request.vars.pluginfile.filename)\n if plugin_install(app, request.vars.pluginfile.file,\n request, filename):\n session.flash = T(\'new plugin installed\')\n redirect(URL(\'design\', args=app))\n else:\n session.flash = \\\n T(\'unable to create application "%s"\', request.vars.filename)\n redirect(URL(r=request))\n elif isinstance(request.vars.pluginfile, str):\n session.flash = T(\'plugin not specified\')\n redirect(URL(r=request))\n\n # If we have only pyc files it means that\n # we cannot design\n if os.path.exists(apath(\'%s/compiled\' % app, r=request)):\n session.flash = \\\n T(\'application is compiled and cannot be designed\')\n redirect(URL(\'site\'))\n\n # Get all models\n models = listdir(apath(\'%s/models/\' % app, r=request), \'.*\\.py$\')\n models = [x.replace(\'\\\\\', \'/\') for x in models]\n defines = {}\n for m in models:\n data = safe_read(apath(\'%s/models/%s\' % (app, m), r=request))\n defines[m] = regex_tables.findall(data)\n defines[m].sort()\n\n # Get all controllers\n controllers = sorted(\n listdir(apath(\'%s/controllers/\' % app, r=request), \'.*\\.py$\'))\n controllers = [x.replace(\'\\\\\', \'/\') for x in controllers]\n functions = {}\n for c in controllers:\n data = safe_read(apath(\'%s/controllers/%s\' % (app, c), r=request))\n items = regex_expose.findall(data)\n functions[c] = items\n\n # Get all views\n views = sorted(\n listdir(apath(\'%s/views/\' % app, r=request), \'[\\w/\\-]+(\\.\\w+)+$\'))\n views = [x.replace(\'\\\\\', \'/\') for x in views if not x.endswith(\'.bak\')]\n extend = {}\n include = {}\n for c in views:\n data = safe_read(apath(\'%s/views/%s\' % (app, c), r=request))\n items = regex_extend.findall(data)\n\n if items:\n extend[c] = items[0][1]\n\n items = regex_include.findall(data)\n include[c] = [i[1] for i in items]\n\n # Get all modules\n modules = listdir(apath(\'%s/modules/\' % app, r=request), \'.*\\.py$\')\n modules = modules = [x.replace(\'\\\\\', \'/\') for x in modules]\n modules.sort()\n\n # Get all private files\n privates = listdir(apath(\'%s/private/\' % app, r=request), \'[^\\.#].*\')\n privates = [x.replace(\'\\\\\', \'/\') for x in privates]\n privates.sort()\n\n # Get all static files\n MAXNFILES = 1000\n statics = listdir(apath(\'%s/static/\' % app, r=request), \'[^\\.#].*\')\n statics = [x.replace(\'\\\\\', \'/\') for x in statics[:MAXNFILES]]\n statics.sort()\n\n # Get all languages\n langpath = os.path.join(apath(app, r=request),\'languages\')\n languages = dict([(lang, info) for lang, info\n in read_possible_languages(langpath).iteritems()\n if info[2] != 0]) # info[2] is langfile_mtime:\n # get only existed files\n\n #Get crontab\n cronfolder = apath(\'%s/cron\' % app, r=request)\n if not os.path.exists(cronfolder):\n os.mkdir(cronfolder)\n crontab = apath(\'%s/cron/crontab\' % app, r=request)\n if not os.path.exists(crontab):\n safe_write(crontab, \'#crontab\')\n\n plugins = []\n\n def filter_plugins(items, plugins):\n plugins += [item[7:].split(\'/\')[0].split(\n \'.\')[0] for item in items if item.startswith(\'plugin_\')]\n plugins[:] = list(set(plugins))\n plugins.sort()\n return [item for item in items if not item.startswith(\'plugin_\')]\n\n return dict(app=app,\n models=filter_plugins(models, plugins),\n defines=defines,\n controllers=filter_plugins(controllers, plugins),\n functions=functions,\n views=filter_plugins(views, plugins),\n modules=filter_plugins(modules, plugins),\n extend=extend,\n include=include,\n privates=filter_plugins(privates, plugins),\n statics=filter_plugins(statics, plugins),\n languages=languages,\n crontab=crontab,\n plugins=plugins)\n\n\ndef delete_plugin():\n """ Object delete handler """\n app = request.args(0)\n plugin = request.args(1)\n plugin_name = \'plugin_\' + plugin\n\n dialog = FORM.confirm(\n T(\'Delete\'),\n {T(\'Cancel\'): URL(\'design\', args=app)})\n\n if dialog.accepted:\n try:\n for folder in [\'models\', \'views\', \'controllers\', \'static\', \'modules\', \'private\']:\n path = os.path.join(apath(app, r=request), folder)\n for item in os.listdir(path):\n if item.rsplit(\'.\', 1)[0] == plugin_name:\n filename = os.path.join(path, item)\n if os.path.isdir(filename):\n shutil.rmtree(filename)\n else:\n os.unlink(filename)\n session.flash = T(\'plugin "%(plugin)s" deleted\',\n dict(plugin=plugin))\n except Exception:\n session.flash = T(\'unable to delete file plugin "%(plugin)s"\',\n dict(plugin=plugin))\n redirect(URL(\'design\', args=request.args(0), anchor=request.vars.id2))\n return dict(dialog=dialog, plugin=plugin)\n\n\ndef plugin():\n """ Application design handler """\n app = get_app()\n plugin = request.args(1)\n\n if not response.flash and app == request.application:\n msg = T(\'ATTENTION: you cannot edit the running application!\')\n response.flash = msg\n\n # If we have only pyc files it means that\n # we cannot design\n if os.path.exists(apath(\'%s/compiled\' % app, r=request)):\n session.flash = \\\n T(\'application is compiled and cannot be designed\')\n redirect(URL(\'site\'))\n\n # Get all models\n models = listdir(apath(\'%s/models/\' % app, r=request), \'.*\\.py$\')\n models = [x.replace(\'\\\\\', \'/\') for x in models]\n defines = {}\n for m in models:\n data = safe_read(apath(\'%s/models/%s\' % (app, m), r=request))\n defines[m] = regex_tables.findall(data)\n defines[m].sort()\n\n # Get all controllers\n controllers = sorted(\n listdir(apath(\'%s/controllers/\' % app, r=request), \'.*\\.py$\'))\n controllers = [x.replace(\'\\\\\', \'/\') for x in controllers]\n functions = {}\n for c in controllers:\n data = safe_read(apath(\'%s/controllers/%s\' % (app, c), r=request))\n items = regex_expose.findall(data)\n functions[c] = items\n\n # Get all views\n views = sorted(\n listdir(apath(\'%s/views/\' % app, r=request), \'[\\w/\\-]+\\.\\w+$\'))\n views = [x.replace(\'\\\\\', \'/\') for x in views]\n extend = {}\n include = {}\n for c in views:\n data = safe_read(apath(\'%s/views/%s\' % (app, c), r=request))\n items = regex_extend.findall(data)\n if items:\n extend[c] = items[0][1]\n\n items = regex_include.findall(data)\n include[c] = [i[1] for i in items]\n\n # Get all modules\n modules = listdir(apath(\'%s/modules/\' % app, r=request), \'.*\\.py$\')\n modules = modules = [x.replace(\'\\\\\', \'/\') for x in modules]\n modules.sort()\n\n # Get all private files\n privates = listdir(apath(\'%s/private/\' % app, r=request), \'[^\\.#].*\')\n privates = [x.replace(\'\\\\\', \'/\') for x in privates]\n privates.sort()\n\n # Get all static files\n statics = listdir(apath(\'%s/static/\' % app, r=request), \'[^\\.#].*\')\n statics = [x.replace(\'\\\\\', \'/\') for x in statics]\n statics.sort()\n\n # Get all languages\n languages = sorted([lang + \'.py\' for lang, info in\n T.get_possible_languages_info().iteritems()\n if info[2] != 0]) # info[2] is langfile_mtime:\n # get only existed files\n\n #Get crontab\n crontab = apath(\'%s/cron/crontab\' % app, r=request)\n if not os.path.exists(crontab):\n safe_write(crontab, \'#crontab\')\n\n def filter_plugins(items):\n regex = re.compile(\'^plugin_\' + plugin + \'(/.*|\\..*)?$\')\n return [item for item in items if item and regex.match(item)]\n\n return dict(app=app,\n models=filter_plugins(models),\n defines=defines,\n controllers=filter_plugins(controllers),\n functions=functions,\n views=filter_plugins(views),\n modules=filter_plugins(modules),\n extend=extend,\n include=include,\n privates=filter_plugins(privates),\n statics=filter_plugins(statics),\n languages=languages,\n crontab=crontab)\n\n\ndef create_file():\n """ Create files handler """\n if request.vars and not request.vars.token == session.token:\n redirect(URL(\'logout\'))\n try:\n anchor = \'#\' + request.vars.id if request.vars.id else \'\'\n if request.vars.app:\n app = get_app(request.vars.app)\n path = abspath(request.vars.location)\n else:\n app = get_app(name=request.vars.location.split(\'/\')[0])\n path = apath(request.vars.location, r=request)\n filename = re.sub(\'[^\\w./-]+\', \'_\', request.vars.filename)\n if path[-7:] == \'/rules/\':\n # Handle plural rules files\n if len(filename) == 0:\n raise SyntaxError\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n lang = re.match(\'^plural_rules-(.*)\\.py$\', filename).group(1)\n langinfo = read_possible_languages(apath(app, r=request))[lang]\n text = dedent("""\n #!/usr/bin/env python\n # -*- coding: utf8 -*-\n # Plural-Forms for %(lang)s (%(langname)s)\n\n nplurals=2 # for example, English language has 2 forms:\n # 1 singular and 1 plural\n\n # Determine plural_id for number *n* as sequence of positive\n # integers: 0,1,...\n # NOTE! For singular form ALWAYS return plural_id = 0\n get_plural_id = lambda n: int(n != 1)\n\n # Construct and return plural form of *word* using\n # *plural_id* (which ALWAYS>0). This function will be executed\n # for words (or phrases) not found in plural_dict dictionary.\n # By default this function simply returns word in singular:\n construct_plural_form = lambda word, plural_id: word\n """)[1:] % dict(lang=langinfo[0], langname=langinfo[1])\n\n elif path[-11:] == \'/languages/\':\n # Handle language files\n if len(filename) == 0:\n raise SyntaxError\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n path = os.path.join(apath(app, r=request), \'languages\', filename)\n if not os.path.exists(path):\n safe_write(path, \'\')\n # create language xx[-yy].py file:\n findT(apath(app, r=request), filename[:-3])\n session.flash = T(\'language file "%(filename)s" created/updated\',\n dict(filename=filename))\n redirect(request.vars.sender + anchor)\n\n elif path[-8:] == \'/models/\':\n # Handle python models\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if len(filename) == 3:\n raise SyntaxError\n\n text = \'# coding: utf8\\n\'\n\n elif path[-13:] == \'/controllers/\':\n # Handle python controllers\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if len(filename) == 3:\n raise SyntaxError\n\n text = \'# coding: utf8\\n# %s\\ndef index(): return dict(message="hello from %s")\'\n text = text % (T(\'try something like\'), filename)\n\n elif path[-7:] == \'/views/\':\n if request.vars.plugin and not filename.startswith(\'plugin_%s/\' % request.vars.plugin):\n filename = \'plugin_%s/%s\' % (request.vars.plugin, filename)\n # Handle template (html) views\n if filename.find(\'.\') < 0:\n filename += \'.html\'\n extension = filename.split(\'.\')[-1].lower()\n\n if len(filename) == 5:\n raise SyntaxError\n\n msg = T(\n \'This is the %(filename)s template\', dict(filename=filename))\n if extension == \'html\':\n text = dedent("""\n {{extend \'layout.html\'}}\n <h1>%s</h1>\n {{=BEAUTIFY(response._vars)}}""" % msg)[1:]\n else:\n generic = os.path.join(path, \'generic.\' + extension)\n if os.path.exists(generic):\n text = read_file(generic)\n else:\n text = \'\'\n\n elif path[-9:] == \'/modules/\':\n if request.vars.plugin and not filename.startswith(\'plugin_%s/\' % request.vars.plugin):\n filename = \'plugin_%s/%s\' % (request.vars.plugin, filename)\n # Handle python module files\n if not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if len(filename) == 3:\n raise SyntaxError\n\n text = dedent("""\n #!/usr/bin/env python\n # coding: utf8\n from gluon import *\\n""")[1:]\n\n elif (path[-8:] == \'/static/\') or (path[-9:] == \'/private/\'):\n if request.vars.plugin and not filename.startswith(\'plugin_%s/\' % request.vars.plugin):\n filename = \'plugin_%s/%s\' % (request.vars.plugin, filename)\n text = \'\'\n\n else:\n redirect(request.vars.sender + anchor)\n\n full_filename = os.path.join(path, filename)\n dirpath = os.path.dirname(full_filename)\n\n if not os.path.exists(dirpath):\n os.makedirs(dirpath)\n\n if os.path.exists(full_filename):\n raise SyntaxError\n\n safe_write(full_filename, text)\n log_progress(app, \'CREATE\', filename)\n session.flash = T(\'file "%(filename)s" created\',\n dict(filename=full_filename[len(path):]))\n vars = {}\n if request.vars.id:\n vars[\'id\'] = request.vars.id\n if request.vars.app:\n vars[\'app\'] = request.vars.app\n redirect(URL(\'edit\',\n args=[os.path.join(request.vars.location, filename)], vars=vars))\n except Exception, e:\n if not isinstance(e, HTTP):\n session.flash = T(\'cannot create file\')\n\n redirect(request.vars.sender + anchor)\n\n\ndef upload_file():\n """ File uploading handler """\n if request.vars and not request.vars.token == session.token:\n redirect(URL(\'logout\'))\n try:\n filename = None\n app = get_app(name=request.vars.location.split(\'/\')[0])\n path = apath(request.vars.location, r=request)\n\n if request.vars.filename:\n filename = re.sub(\'[^\\w\\./]+\', \'_\', request.vars.filename)\n else:\n filename = os.path.split(request.vars.file.filename)[-1]\n\n if path[-8:] == \'/models/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if path[-9:] == \'/modules/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if path[-13:] == \'/controllers/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n if path[-7:] == \'/views/\' and not filename[-5:] == \'.html\':\n filename += \'.html\'\n\n if path[-11:] == \'/languages/\' and not filename[-3:] == \'.py\':\n filename += \'.py\'\n\n filename = os.path.join(path, filename)\n dirpath = os.path.dirname(filename)\n\n if not os.path.exists(dirpath):\n os.makedirs(dirpath)\n\n data = request.vars.file.file.read()\n lineno = count_lines(data)\n safe_write(filename, data, \'wb\')\n log_progress(app, \'UPLOAD\', filename, lineno)\n session.flash = T(\'file "%(filename)s" uploaded\',\n dict(filename=filename[len(path):]))\n except Exception:\n if filename:\n d = dict(filename=filename[len(path):])\n else:\n d = dict(filename=\'unkown\')\n session.flash = T(\'cannot upload file "%(filename)s"\', d)\n\n redirect(request.vars.sender)\n\n\ndef errors():\n """ Error handler """\n import operator\n import os\n import pickle\n import hashlib\n\n app = get_app()\n\n method = request.args(1) or \'new\'\n db_ready = {}\n db_ready[\'status\'] = get_ticket_storage(app)\n db_ready[\'errmessage\'] = T(\n "No ticket_storage.txt found under /private folder")\n db_ready[\'errlink\'] = "http://web2py.com/books/default/chapter/29/13#Collecting-tickets"\n\n if method == \'new\':\n errors_path = apath(\'%s/errors\' % app, r=request)\n\n delete_hashes = []\n for item in request.vars:\n if item[:7] == \'delete_\':\n delete_hashes.append(item[7:])\n\n hash2error = dict()\n\n for fn in listdir(errors_path, \'^[a-fA-F0-9.\\-]+$\'):\n fullpath = os.path.join(errors_path, fn)\n if not os.path.isfile(fullpath):\n continue\n try:\n fullpath_file = open(fullpath, \'r\')\n try:\n error = pickle.load(fullpath_file)\n finally:\n fullpath_file.close()\n except IOError:\n continue\n except EOFError:\n continue\n\n hash = hashlib.md5(error[\'traceback\']).hexdigest()\n\n if hash in delete_hashes:\n os.unlink(fullpath)\n else:\n try:\n hash2error[hash][\'count\'] += 1\n except KeyError:\n error_lines = error[\'traceback\'].split("\\n")\n last_line = error_lines[-2] if len(error_lines)>1 else \'unknown\'\n error_causer = os.path.split(error[\'layer\'])[1]\n hash2error[hash] = dict(count=1, pickel=error,\n causer=error_causer,\n last_line=last_line,\n hash=hash, ticket=fn)\n\n decorated = [(x[\'count\'], x) for x in hash2error.values()]\n decorated.sort(key=operator.itemgetter(0), reverse=True)\n\n return dict(errors=[x[1] for x in decorated], app=app, method=method, db_ready=db_ready)\n\n elif method == \'dbnew\':\n errors_path = apath(\'%s/errors\' % app, r=request)\n tk_db, tk_table = get_ticket_storage(app)\n\n delete_hashes = []\n for item in request.vars:\n if item[:7] == \'delete_\':\n delete_hashes.append(item[7:])\n\n hash2error = dict()\n\n for fn in tk_db(tk_table.id > 0).select():\n try:\n error = pickle.loads(fn.ticket_data)\n except AttributeError:\n tk_db(tk_table.id == fn.id).delete()\n tk_db.commit()\n\n hash = hashlib.md5(error[\'traceback\']).hexdigest()\n\n if hash in delete_hashes:\n tk_db(tk_table.id == fn.id).delete()\n tk_db.commit()\n else:\n try:\n hash2error[\'hash\'][\'count\'] += 1\n except KeyError:\n error_lines = error[\'traceback\'].split("\\n")\n last_line = error_lines[-2]\n error_causer = os.path.split(error[\'layer\'])[1]\n hash2error[hash] = dict(count=1, pickel=error,\n causer=error_causer,\n last_line=last_line,\n hash=hash, ticket=fn.ticket_id)\n\n decorated = [(x[\'count\'], x) for x in hash2error.values()]\n\n decorated.sort(key=operator.itemgetter(0), reverse=True)\n\n return dict(errors=[x[1] for x in decorated], app=app, method=method)\n\n elif method == \'dbold\':\n tk_db, tk_table = get_ticket_storage(app)\n for item in request.vars:\n if item[:7] == \'delete_\':\n tk_db(tk_table.ticket_id == item[7:]).delete()\n tk_db.commit()\n tickets_ = tk_db(tk_table.id > 0).select(tk_table.ticket_id, tk_table.created_datetime, orderby=~tk_table.created_datetime)\n tickets = [row.ticket_id for row in tickets_]\n times = dict(\n [(row.ticket_id, row.created_datetime) for row in tickets_])\n\n return dict(app=app, tickets=tickets, method=method, times=times)\n\n else:\n for item in request.vars:\n # delete_all} rows doesn\'t contain any ticket\n # Remove anything else as requested\n if item[:7] == \'delete_\' and (not item == "delete_all}"):\n os.unlink(apath(\'%s/errors/%s\' % (app, item[7:]), r=request))\n func = lambda p: os.stat(apath(\'%s/errors/%s\' %\n (app, p), r=request)).st_mtime\n tickets = sorted(\n listdir(apath(\'%s/errors/\' % app, r=request), \'^\\w.*\'),\n key=func,\n reverse=True)\n\n return dict(app=app, tickets=tickets, method=method, db_ready=db_ready)\n\n\ndef get_ticket_storage(app):\n private_folder = apath(\'%s/private\' % app, r=request)\n ticket_file = os.path.join(private_folder, \'ticket_storage.txt\')\n if os.path.exists(ticket_file):\n db_string = open(ticket_file).read()\n db_string = db_string.strip().replace(\'\\r\', \'\').replace(\'\\n\', \'\')\n else:\n return False\n tickets_table = \'web2py_ticket\'\n tablename = tickets_table + \'_\' + app\n db_path = apath(\'%s/databases\' % app, r=request)\n ticketsdb = DAL(db_string, folder=db_path, auto_import=True)\n if not ticketsdb.get(tablename):\n table = ticketsdb.define_table(\n tablename,\n Field(\'ticket_id\', length=100),\n Field(\'ticket_data\', \'text\'),\n Field(\'created_datetime\', \'datetime\'),\n )\n return ticketsdb, ticketsdb.get(tablename)\n\n\ndef make_link(path):\n """ Create a link from a path """\n tryFile = path.replace(\'\\\\\', \'/\')\n\n if os.path.isabs(tryFile) and os.path.isfile(tryFile):\n (folder, filename) = os.path.split(tryFile)\n (base, ext) = os.path.splitext(filename)\n app = get_app()\n\n editable = {\'controllers\': \'.py\', \'models\': \'.py\', \'views\': \'.html\'}\n for key in editable.keys():\n check_extension = folder.endswith("%s/%s" % (app, key))\n if ext.lower() == editable[key] and check_extension:\n return A(\'"\' + tryFile + \'"\',\n _href=URL(r=request,\n f=\'edit/%s/%s/%s\' % (app, key, filename))).xml()\n return \'\'\n\n\ndef make_links(traceback):\n """ Make links using the given traceback """\n\n lwords = traceback.split(\'"\')\n\n # Making the short circuit compatible with <= python2.4\n result = (len(lwords) != 0) and lwords[0] or \'\'\n\n i = 1\n\n while i < len(lwords):\n link = make_link(lwords[i])\n\n if link == \'\':\n result += \'"\' + lwords[i]\n else:\n result += link\n\n if i + 1 < len(lwords):\n result += lwords[i + 1]\n i = i + 1\n\n i = i + 1\n\n return result\n\n\nclass TRACEBACK(object):\n """ Generate the traceback """\n\n def __init__(self, text):\n """ TRACEBACK constructor """\n\n self.s = make_links(CODE(text).xml())\n\n def xml(self):\n """ Returns the xml """\n\n return self.s\n\n\ndef ticket():\n """ Ticket handler """\n\n if len(request.args) != 2:\n session.flash = T(\'invalid ticket\')\n redirect(URL(\'site\'))\n\n app = get_app()\n myversion = request.env.web2py_version\n ticket = request.args[1]\n e = RestrictedError()\n e.load(request, app, ticket)\n\n return dict(app=app,\n ticket=ticket,\n output=e.output,\n traceback=(e.traceback and TRACEBACK(e.traceback)),\n snapshot=e.snapshot,\n code=e.code,\n layer=e.layer,\n myversion=myversion)\n\n\ndef ticketdb():\n """ Ticket handler """\n\n if len(request.args) != 2:\n session.flash = T(\'invalid ticket\')\n redirect(URL(\'site\'))\n\n app = get_app()\n myversion = request.env.web2py_version\n ticket = request.args[1]\n e = RestrictedError()\n request.tickets_db = get_ticket_storage(app)[0]\n e.load(request, app, ticket)\n response.view = \'default/ticket.html\'\n return dict(app=app,\n ticket=ticket,\n output=e.output,\n traceback=(e.traceback and TRACEBACK(e.traceback)),\n snapshot=e.snapshot,\n code=e.code,\n layer=e.layer,\n myversion=myversion)\n\n\ndef error():\n """ Generate a ticket (for testing) """\n raise RuntimeError(\'admin ticket generator at your service\')\n\n\ndef update_languages():\n """ Update available languages """\n\n app = get_app()\n update_all_languages(apath(app, r=request))\n session.flash = T(\'Language files (static strings) updated\')\n redirect(URL(\'design\', args=app, anchor=\'languages\'))\n\n\ndef user():\n if MULTI_USER_MODE:\n if not db(db.auth_user).count():\n auth.settings.registration_requires_approval = False\n return dict(form=auth())\n else:\n return dict(form=T("Disabled"))\n\n\ndef reload_routes():\n """ Reload routes.py """\n import gluon.rewrite\n gluon.rewrite.load()\n redirect(URL(\'site\'))\n\n\ndef manage_students():\n if not (MULTI_USER_MODE and is_manager()):\n session.flash = T(\'Not Authorized\')\n redirect(URL(\'site\'))\n db.auth_user.registration_key.writable = True\n grid = SQLFORM.grid(db.auth_user)\n return locals()\n\n\ndef bulk_register():\n if not (MULTI_USER_MODE and is_manager()):\n session.flash = T(\'Not Authorized\')\n redirect(URL(\'site\'))\n form = SQLFORM.factory(Field(\'emails\', \'text\'))\n if form.process().accepted:\n emails = [x.strip() for x in form.vars.emails.split(\'\\n\') if x.strip()]\n n = 0\n for email in emails:\n if not db.auth_user(email=email):\n n += db.auth_user.insert(email=email) and 1 or 0\n session.flash = T(\'%s students registered\', n)\n redirect(URL(\'site\'))\n return locals()\n\n### Begin experimental stuff need fixes:\n# 1) should run in its own process - cannot os.chdir\n# 2) should not prompt user at console\n# 3) should give option to force commit and not reuqire manual merge\n\n\ndef git_pull():\n """ Git Pull handler """\n app = get_app()\n if not have_git:\n session.flash = GIT_MISSING\n redirect(URL(\'site\'))\n dialog = FORM.confirm(T(\'Pull\'),\n {T(\'Cancel\'): URL(\'site\')})\n if dialog.accepted:\n try:\n repo = git.Repo(os.path.join(apath(r=request), app))\n origin = repo.remotes.origin\n origin.fetch()\n origin.pull()\n session.flash = T("Application updated via git pull")\n redirect(URL(\'site\'))\n\n except git.CheckoutError:\n session.flash = T("Pull failed, certain files could not be checked out. Check logs for details.")\n redirect(URL(\'site\'))\n except git.UnmergedEntriesError:\n session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")\n redirect(URL(\'site\'))\n except git.GitCommandError:\n session.flash = T(\n "Pull failed, git exited abnormally. See logs for details.")\n redirect(URL(\'site\'))\n except AssertionError:\n session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")\n redirect(URL(\'site\'))\n elif \'cancel\' in request.vars:\n redirect(URL(\'site\'))\n return dict(app=app, dialog=dialog)\n\n\ndef git_push():\n """ Git Push handler """\n app = get_app()\n if not have_git:\n session.flash = GIT_MISSING\n redirect(URL(\'site\'))\n form = SQLFORM.factory(Field(\'changelog\', requires=IS_NOT_EMPTY()))\n form.element(\'input[type=submit]\')[\'_value\'] = T(\'Push\')\n form.add_button(T(\'Cancel\'), URL(\'site\'))\n form.process()\n if form.accepted:\n try:\n repo = git.Repo(os.path.join(apath(r=request), app))\n index = repo.index\n index.add([apath(r=request) + app + \'/*\'])\n new_commit = index.commit(form.vars.changelog)\n origin = repo.remotes.origin\n origin.push()\n session.flash = T(\n "Git repo updated with latest application changes.")\n redirect(URL(\'site\'))\n except git.UnmergedEntriesError:\n session.flash = T("Push failed, there are unmerged entries in the cache. Resolve merge issues manually and try again.")\n redirect(URL(\'site\'))\n return dict(app=app, form=form)\n\nresponse._vars=response._caller(site)\n'
- p7
- sS'snapshot'
- p8
- (dp9
- S'exception'
- p10
- (dp11
- S'__hash__'
- p12
- S"<method-wrapper '__hash__' of exceptions.ImportError object>"
- p13
- sS'__setattr__'
- p14
- S"<method-wrapper '__setattr__' of exceptions.ImportError object>"
- p15
- sS'__reduce_ex__'
- p16
- S'<built-in method __reduce_ex__ of exceptions.ImportError object>'
- p17
- sS'__getslice__'
- p18
- S"<method-wrapper '__getslice__' of exceptions.ImportError object>"
- p19
- sS'__getitem__'
- p20
- S"<method-wrapper '__getitem__' of exceptions.ImportError object>"
- p21
- sS'__setstate__'
- p22
- S'<built-in method __setstate__ of exceptions.ImportError object>'
- p23
- sS'args'
- p24
- S"('cannot import name Config',)"
- p25
- sS'__reduce__'
- p26
- S'<built-in method __reduce__ of exceptions.ImportError object>'
- p27
- sS'__str__'
- p28
- S"<method-wrapper '__str__' of exceptions.ImportError object>"
- p29
- sS'__format__'
- p30
- S'<built-in method __format__ of exceptions.ImportError object>'
- p31
- sS'__getattribute__'
- p32
- S"<method-wrapper '__getattribute__' of exceptions.ImportError object>"
- p33
- sS'__class__'
- p34
- S"<type 'exceptions.ImportError'>"
- p35
- sS'__unicode__'
- p36
- S'<built-in method __unicode__ of exceptions.ImportError object>'
- p37
- sS'__delattr__'
- p38
- S"<method-wrapper '__delattr__' of exceptions.ImportError object>"
- p39
- sS'__subclasshook__'
- p40
- S'<built-in method __subclasshook__ of type object>'
- p41
- sS'__repr__'
- p42
- S"<method-wrapper '__repr__' of exceptions.ImportError object>"
- p43
- sS'__dict__'
- p44
- S'{}'
- p45
- sS'__sizeof__'
- p46
- S'<built-in method __sizeof__ of exceptions.ImportError object>'
- p47
- sS'__doc__'
- p48
- S'"Import can\'t find module, or can\'t find name in module."'
- p49
- sS'__init__'
- p50
- S"<method-wrapper '__init__' of exceptions.ImportError object>"
- p51
- sS'__new__'
- p52
- S'<built-in method __new__ of type object>'
- p53
- ssS'evalue'
- p54
- S'cannot import name Config'
- p55
- sS'request'
- p56
- cgluon.html
- XML_unpickle
- p57
- (S's\xceP\x00\x00<div><table><tr><td style="font-weight:bold;vertical-align:top">ajax</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">application</td><td valign="top">:</td><td><div>admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">args</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">body</td><td valign="top">:</td><td><div><cStringIO.StringO object at 0x2c51228></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">cid</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">client</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">controller</td><td valign="top">:</td><td><div>default</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">cookies</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">session_id_admin</td><td valign="top">:</td><td><div>108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_id_welcome</td><td valign="top">:</td><td><div>108.18.133.177-fec60924-a09a-4214-9b4c-d54b080b9520<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">sessionid</td><td valign="top">:</td><td><div>410b040fc52e3b7354b87ed162f67030<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">env</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">app_folders</td><td valign="top">:</td><td><div>set(['/home/mattspence/web2py/applications/admin/'])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">applications_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">content_length</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">content_type</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">db_sessions</td><td valign="top">:</td><td><div>set([])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">debugging</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">document_root</td><td valign="top">:</td><td><div>/var/log/nginx/user_logs</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">gluon_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_accept</td><td valign="top">:</td><td><div>text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_accept_encoding</td><td valign="top">:</td><td><div>gzip, deflate</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_accept_language</td><td valign="top">:</td><td><div>en-us</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_connection</td><td valign="top">:</td><td><div>close</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_cookie</td><td valign="top">:</td><td><div>session_id_admin=108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8; session_id_welcome=108.18.133.177-fec60924-a09a-4214-9b4c-d54b080b9520; sessionid=410b040fc52e3b7354b87ed162f67030; __utma=133430031.689296413.1370357862.1377877431.1379201088.14; __utmb=133430031.35.10.1379201088; __utmc=133430031; __utmz=133430031.1370378347.2.2.utmcsr=blog.pythonanywhere.com|utmccn=(referral)|utmcmd=referral|utmcct=/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_dnt</td><td valign="top">:</td><td><div>1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_host</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_origin</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_referer</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com/admin/default/upgrade_web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_user_agent</td><td valign="top">:</td><td><div>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_x_forwarded_for</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">http_x_real_ip</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">https</td><td valign="top">:</td><td><div>on</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_jython</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_pypy</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">local_hosts</td><td valign="top">:</td><td><div><table><tr><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td><div>::1</div></td></tr><tr><td><div>::ffff:127.0.0.1</div></td></tr><tr><td><div>glenn-liveweb1</div></td></tr><tr><td><div>localhost</div></td></tr><tr><td><div>50.19.109.98</div></td></tr><tr><td><div>127.0.0.1</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path_info</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">query_string</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">remote_addr</td><td valign="top">:</td><td><div>10.87.22.48</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">remote_port</td><td valign="top">:</td><td><div>34558</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">request_method</td><td valign="top">:</td><td><div>GET</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">request_uri</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">script_name</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">server_name</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">server_port</td><td valign="top">:</td><td><div>443</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">server_protocol</td><td valign="top">:</td><td><div>HTTP/1.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi_node</td><td valign="top">:</td><td><div>glenn-liveweb1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi_version</td><td valign="top">:</td><td><div>1.9.12</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">web2py_path</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">web2py_version</td><td valign="top">:</td><td><div>2.5.1-stable+timestamp.2013.06.06.15.39.19</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_errors</td><td valign="top">:</td><td><div><uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_file_wrapper</td><td valign="top">:</td><td><div><built-in function uwsgi_sendfile></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_input</td><td valign="top">:</td><td><div><uwsgi._Input object at 0x7f6453906600></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_multiprocess</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_multithread</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_run_once</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_url_scheme</td><td valign="top">:</td><td><div>https</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_version</td><td valign="top">:</td><td><div><table><tr><td><div>1</div></td></tr><tr><td><div>0</div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">extension</td><td valign="top">:</td><td><div>html</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">folder</td><td valign="top">:</td><td><div>/home/mattspence/web2py/applications/admin/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">function</td><td valign="top">:</td><td><div>site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">get_vars</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">global_settings</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">app_folders</td><td valign="top">:</td><td><div>set(['/home/mattspence/web2py/applications/admin/'])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">applications_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">db_sessions</td><td valign="top">:</td><td><div>set([])</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">debugging</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">gluon_parent</td><td valign="top">:</td><td><div>/home/mattspence/web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_jython</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_pypy</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">local_hosts</td><td valign="top">:</td><td><div><table><tr><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td><div>::1</div></td></tr><tr><td><div>::ffff:127.0.0.1</div></td></tr><tr><td><div>glenn-liveweb1</div></td></tr><tr><td><div>localhost</div></td></tr><tr><td><div>50.19.109.98</div></td></tr><tr><td><div>127.0.0.1</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">web2py_version</td><td valign="top">:</td><td><div>2.5.1-stable+timestamp.2013.06.06.15.39.19</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_https</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_local</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_restful</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">now</td><td valign="top">:</td><td><div>datetime.datetime(2013, 9, 14, 23, 44, 12, 309319)</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">post_vars</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">raw_args</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">raw_extension</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">url</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">utcnow</td><td valign="top">:</td><td><div>datetime.datetime(2013, 9, 14, 23, 44, 12, 309349)</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uuid</td><td valign="top">:</td><td><div>admin/108.18.133.177.2013-09-14.23-44-12.1b1d1afe-9202-4b6d-b6a9-bc793509db41</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">vars</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">environ</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">CONTENT_LENGTH</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">CONTENT_TYPE</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">DOCUMENT_ROOT</td><td valign="top">:</td><td><div>/var/log/nginx/user_logs</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTPS</td><td valign="top">:</td><td><div>on</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ACCEPT</td><td valign="top">:</td><td><div>text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ACCEPT_ENCODING</td><td valign="top">:</td><td><div>gzip, deflate</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ACCEPT_LANGUAGE</td><td valign="top">:</td><td><div>en-us</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_CONNECTION</td><td valign="top">:</td><td><div>close</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_COOKIE</td><td valign="top">:</td><td><div>session_id_admin=108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8; session_id_welcome=108.18.133.177-fec60924-a09a-4214-9b4c-d54b080b9520; sessionid=410b040fc52e3b7354b87ed162f67030; __utma=133430031.689296413.1370357862.1377877431.1379201088.14; __utmb=133430031.35.10.1379201088; __utmc=133430031; __utmz=133430031.1370378347.2.2.utmcsr=blog.pythonanywhere.com|utmccn=(referral)|utmcmd=referral|utmcct=/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_DNT</td><td valign="top">:</td><td><div>1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_HOST</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_ORIGIN</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_REFERER</td><td valign="top">:</td><td><div>https://mattspence.pythonanywhere.com/admin/default/upgrade_web2py</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_USER_AGENT</td><td valign="top">:</td><td><div>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_X_FORWARDED_FOR</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">HTTP_X_REAL_IP</td><td valign="top">:</td><td><div>108.18.133.177</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">PATH_INFO</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">QUERY_STRING</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REMOTE_ADDR</td><td valign="top">:</td><td><div>10.87.22.48</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REMOTE_PORT</td><td valign="top">:</td><td><div>34558</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REQUEST_METHOD</td><td valign="top">:</td><td><div>GET</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">REQUEST_URI</td><td valign="top">:</td><td><div>/admin/default/site</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SCRIPT_NAME</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SERVER_NAME</td><td valign="top">:</td><td><div>mattspence.pythonanywhere.com</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SERVER_PORT</td><td valign="top">:</td><td><div>443</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">SERVER_PROTOCOL</td><td valign="top">:</td><td><div>HTTP/1.1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi.node</td><td valign="top">:</td><td><div>glenn-liveweb1</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">uwsgi.version</td><td valign="top">:</td><td><div>1.9.12</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.errors</td><td valign="top">:</td><td><div><uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.file_wrapper</td><td valign="top">:</td><td><div><built-in function uwsgi_sendfile></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.input</td><td valign="top">:</td><td><div><cStringIO.StringO object at 0x2c51228></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.multiprocess</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.multithread</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.run_once</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.url_scheme</td><td valign="top">:</td><td><div>https</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.version</td><td valign="top">:</td><td><div>1</div></td></tr></table></div></td></tr></table></div></td></tr></table></div>'
- tRp58
- sS'frames'
- p59
- (lp60
- (dp61
- S'file'
- p62
- S'/home/mattspence/web2py/gluon/restricted.py'
- p63
- sS'dump'
- p64
- (dp65
- S'environment'
- p66
- S"{'A': <class 'gluon.html.A'>, 'ALLOW_TOGGLE': 'true', 'ANY_OF': <class 'gluon.validators.ANY_OF'>, 'A_button': <function A_button>, 'B': <class 'gluon.html.B'>, 'BEAUTIFY': <class 'gluon.html.BEAUTIFY'>, 'BODY': <class 'gluon.html.BODY'>, 'BR': <class 'gluon.html.BR'>, 'BUTTON': <class 'gluon.html.BUTTON'>, 'CAT': <class 'gluon.html.CAT'>, ...}"
- p67
- sS'ccode'
- p68
- S'<code object <module> at 0x148f230, file "/home/...plications/admin/controllers/default.py", line 3>'
- p69
- ssS'lnum'
- p70
- I212
- sS'lines'
- p71
- (dp72
- I207
- S' try:'
- p73
- sI208
- S' if isinstance(code, types.CodeType):'
- p74
- sI209
- S' ccode = code'
- p75
- sI210
- S' else:'
- p76
- sI211
- S' ccode = compile2(code, layer)'
- p77
- sI212
- S' exec ccode in environment'
- p78
- sI213
- S' except HTTP:'
- p79
- sI214
- S' raise'
- p80
- sI215
- S' except RestrictedError:'
- p81
- sI216
- S' # do not encapsulate (obfuscate) the original RestrictedError'
- p82
- ssS'call'
- p83
- S"(code='# coding: utf8\\n\\nEXPERIMENTAL_STUFF = True\\n\\nif EX...orm=form)\\n\\nresponse._vars=response._caller(site)\\n', environment={'A': <class 'gluon.html.A'>, 'ALLOW_TOGGLE': 'true', 'ANY_OF': <class 'gluon.validators.ANY_OF'>, 'A_button': <function A_button>, 'B': <class 'gluon.html.B'>, 'BEAUTIFY': <class 'gluon.html.BEAUTIFY'>, 'BODY': <class 'gluon.html.BODY'>, 'BR': <class 'gluon.html.BR'>, 'BUTTON': <class 'gluon.html.BUTTON'>, 'CAT': <class 'gluon.html.CAT'>, ...}, layer='/home/mattspence/web2py/applications/admin/controllers/default.py')"
- p84
- sS'func'
- p85
- S'restricted'
- p86
- sa(dp87
- g62
- S'/home/mattspence/web2py/applications/admin/controllers/default.py'
- p88
- sg64
- (dp89
- S'Config'
- p90
- S'undefined'
- p91
- sS'gluon'
- p92
- g91
- ssg70
- I14
- sg71
- (dp93
- I9
- S''
- sI10
- S'import re'
- p94
- sI11
- S'from gluon.admin import *'
- p95
- sI12
- S'from gluon.fileutils import abspath, read_file, write_file'
- p96
- sI13
- S'from gluon.utils import web2py_uuid'
- p97
- sI14
- S'from gluon.tools import Config'
- p98
- sI15
- S'from glob import glob'
- p99
- sI16
- S'import shutil'
- p100
- sI17
- S'import platform'
- p101
- sI18
- S''
- ssg83
- S'()'
- p102
- sg85
- S'<module>'
- p103
- sasS'pyver'
- p104
- S'Python 2.7.4: /usr/local/bin/uwsgi (prefix: /usr)'
- p105
- sS'session'
- p106
- g57
- (S's~\x03\x00\x00<div><table><tr><td style="font-weight:bold;vertical-align:top">authorized</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">check_version</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">flash</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">is_mobile</td><td valign="top">:</td><td><div>auto</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">last_time</td><td valign="top">:</td><td><div>1379202252.335307</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">pam_user</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">token</td><td valign="top">:</td><td><div>c0c92bd0-a6e3-486f-84c2-cce8421ce960</div></td></tr></table></div>'
- tRp107
- sS'etype'
- p108
- S"<type 'exceptions.ImportError'>"
- p109
- sS'date'
- p110
- S'Sat Sep 14 23:44:12 2013'
- p111
- sS'response'
- p112
- g57
- (S's\x9e\x16\x00\x00<div><table><tr><td style="font-weight:bold;vertical-align:top">body</td><td valign="top">:</td><td><div><cStringIO.StringO object at 0x2c4f068></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">cookies</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">session_id_admin</td><td valign="top">:</td><td><div>108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8<table><tr><td style="font-weight:bold;vertical-align:top">comment</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">domain</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">expires</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">httponly</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">max-age</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">path</td><td valign="top">:</td><td><div>/</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">secure</td><td valign="top">:</td><td><div></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">version</td><td valign="top">:</td><td><div></div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">delimiters</td><td valign="top">:</td><td><div><table><tr><td><div>{{</div></td></tr><tr><td><div>}}</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">files</td><td valign="top">:</td><td><div><table><tr><td><div>/admin/static/plugin_multiselect/jquery.multi-select.js</div></td></tr><tr><td><div>/admin/static/plugin_multiselect/multi-select.css</div></td></tr><tr><td><div>/admin/static/plugin_multiselect/start.js</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">flash</td><td valign="top">:</td><td><div>unable to upgrade because "[Errno 2] No such file or directory: '/home/mattspence/web2py/examples/README'"</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">generic_patterns</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">headers</td><td valign="top">:</td><td><div><table><tr><td style="font-weight:bold;vertical-align:top">X-Powered-By</td><td valign="top">:</td><td><div>web2py</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">menu</td><td valign="top">:</td><td><div><table><tr><td><div><table><tr><td><div>Site</div></td></tr><tr><td><div>True</div></td></tr><tr><td><div>/admin/default/site</div></td></tr></table></div></td></tr><tr><td><div><table><tr><td><div>Help</div></td></tr><tr><td><div>False</div></td></tr><tr><td><div>/examples/default/documentation</div></td></tr></table></div></td></tr><tr><td><div><table><tr><td><div>Logout</div></td></tr><tr><td><div>False</div></td></tr><tr><td><div>/admin/default/logout</div></td></tr></table></div></td></tr><tr><td><div><table><tr><td><div>Debug</div></td></tr><tr><td><div>False</div></td></tr><tr><td><div>/admin/debug/interact</div></td></tr></table></div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">meta</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">models_to_run</td><td valign="top">:</td><td><div><table><tr><td><div>^\\w+\\.py$</div></td></tr><tr><td><div>^default/\\w+\\.py$</div></td></tr><tr><td><div>^default/site/\\w+\\.py$</div></td></tr></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">postprocessing</td><td valign="top">:</td><td><div><table></table></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_cookie_expires</td><td valign="top">:</td><td><div>None</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_data_name</td><td valign="top">:</td><td><div>session_data_admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_file</td><td valign="top">:</td><td><div><open file '/home/mattspence/web2py/applications/admin/sessions/108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8', mode 'rb+' at 0x2bdadb0></div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_filename</td><td valign="top">:</td><td><div>/home/mattspence/web2py/applications/admin/sessions/108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_id</td><td valign="top">:</td><td><div>108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_id_name</td><td valign="top">:</td><td><div>session_id_admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_locked</td><td valign="top">:</td><td><div>True</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_new</td><td valign="top">:</td><td><div>False</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">session_storage_type</td><td valign="top">:</td><td><div>file</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">status</td><td valign="top">:</td><td><div>200</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">subtitle</td><td valign="top">:</td><td><div>admin</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">title</td><td valign="top">:</td><td><div>site </div></td></tr><tr><td style="font-weight:bold;vertical-align:top">view</td><td valign="top">:</td><td><div>default/site.html</div></td></tr></table></div>'
- tRp113
- sS'locals'
- p114
- (dp115
- S'IS_SLUG'
- p116
- S"<class 'gluon.validators.IS_SLUG'>"
- p117
- sS'OBJECT'
- p118
- S"<class 'gluon.html.OBJECT'>"
- p119
- sS'plugin_pack'
- p120
- S'<function plugin_pack>'
- p121
- sS'helpicon'
- p122
- S'<function helpicon>'
- p123
- sS'SQLDB'
- p124
- S"<class 'gluon.dal.DAL'>"
- p125
- sS'read_hosts_deny'
- p126
- S'<function read_hosts_deny>'
- p127
- sg106
- S"<Storage {'_user_agent': {'is_mobile': False, 'i...ssion_hash': 'eac378321ffab41f2da22ca2e492be5c'}>"
- p128
- sS'LINK'
- p129
- S"<class 'gluon.html.LINK'>"
- p130
- sS'BR'
- p131
- S"<class 'gluon.html.BR'>"
- p132
- sS'local_import'
- p133
- S'<function <lambda>>'
- p134
- sS'EMBED'
- p135
- S"<class 'gluon.html.EMBED'>"
- p136
- sS'cmdutil'
- p137
- S"<module 'mercurial.cmdutil' from '/usr/local/lib/python2.7/dist-packages/mercurial/cmdutil.py'>"
- p138
- sS'compile2'
- p139
- S'<function compile2>'
- p140
- sS'redirect'
- p141
- S'<function redirect>'
- p142
- sS'IS_INT_IN_RANGE'
- p143
- S"<class 'gluon.validators.IS_INT_IN_RANGE'>"
- p144
- sS'upgrade'
- p145
- S'<function upgrade>'
- p146
- sS'IS_LOWER'
- p147
- S"<class 'gluon.validators.IS_LOWER'>"
- p148
- sS'IS_STRONG'
- p149
- S"<class 'gluon.validators.IS_STRONG'>"
- p150
- sS'write_hosts_deny'
- p151
- S'<function write_hosts_deny>'
- p152
- sS'cache'
- p153
- S'<gluon.cache.Cache object>'
- p154
- sS'addremove'
- p155
- S'<function addremove>'
- p156
- sS'IS_IN_DB'
- p157
- S"<class 'gluon.validators.IS_IN_DB'>"
- p158
- sS'TAG'
- p159
- S'<gluon.html.__TAG__ object>'
- p160
- sS'WEB2PY_VERSION_URL'
- p161
- S"'http://web2py.com/examples/default/version'"
- p162
- sS'app_pack'
- p163
- S'<function app_pack>'
- p164
- sS'SQLField'
- p165
- S"<class 'gluon.dal.Field'>"
- p166
- sS'_f'
- p167
- S"'site'"
- p168
- sS'app_cleanup'
- p169
- S'<function app_cleanup>'
- p170
- sS'_a'
- p171
- S"'admin'"
- p172
- sS'BODY'
- p173
- S"<class 'gluon.html.BODY'>"
- p174
- sS'IS_DATE_IN_RANGE'
- p175
- S"<class 'gluon.validators.IS_DATE_IN_RANGE'>"
- p176
- sS'button_enable'
- p177
- S'<function button_enable>'
- p178
- sS'TH'
- p179
- S"<class 'gluon.html.TH'>"
- p180
- sS'ON'
- p181
- S'True'
- p182
- sS'app_compile'
- p183
- S'<function app_compile>'
- p184
- sS'__file__'
- p185
- S"'/home/mattspence/web2py/applications/admin/controllers/default.py'"
- p186
- sS'zipfile'
- p187
- S"<module 'zipfile' from '/usr/lib/python2.7/zipfile.py'>"
- p188
- sS'stat'
- p189
- S"<module 'stat' from '/usr/lib/python2.7/stat.py'>"
- p190
- sS'P'
- S"<class 'gluon.html.P'>"
- p191
- sS'T'
- S'<gluon.languages.translator object>'
- p192
- sS'ui'
- p193
- S"<module 'mercurial.ui' from '/usr/local/lib/python2.7/dist-packages/mercurial/ui.py'>"
- p194
- sS'XHTML'
- p195
- S"<class 'gluon.html.XHTML'>"
- p196
- sS'EMAIL_SERVER'
- p197
- S"'localhost'"
- p198
- sS'add_path_first'
- p199
- S'<function add_path_first>'
- p200
- sS'regex_include'
- p201
- S'<_sre.SRE_Pattern object>'
- p202
- sS'TicketStorage'
- p203
- S"<class 'gluon.restricted.TicketStorage'>"
- p204
- sS'OL'
- p205
- S"<class 'gluon.html.OL'>"
- p206
- sS'TEXTAREA'
- p207
- S"<class 'gluon.html.TEXTAREA'>"
- p208
- sS'MENU'
- p209
- S"<class 'gluon.html.MENU'>"
- p210
- sS'button'
- p211
- S'<function button>'
- p212
- sS'EMAIL_LOGIN'
- p213
- S'None'
- p214
- sS't0'
- p215
- S'1379202252.335307'
- p216
- sS'check_new_version'
- p217
- S'<function check_new_version>'
- p218
- sS'IS_IMAGE'
- p219
- S"<class 'gluon.validators.IS_IMAGE'>"
- p220
- sS'WEB2PY_URL'
- p221
- S"'http://web2py.com'"
- p222
- sS'LOAD'
- p223
- S'<function LOAD>'
- p224
- sS'IS_EQUAL_TO'
- p225
- S"<class 'gluon.validators.IS_EQUAL_TO'>"
- p226
- sS'CODE'
- p227
- S"<class 'gluon.html.CODE'>"
- p228
- sS'HTTP'
- p229
- S"<class 'gluon.http.HTTP'>"
- p230
- sS'is_gae'
- p231
- S'False'
- p232
- sS'HR'
- p233
- S"<class 'gluon.html.HR'>"
- p234
- sS'IS_DATETIME'
- p235
- S"<class 'gluon.validators.IS_DATETIME'>"
- p236
- sS'login_record'
- p237
- S'<function login_record>'
- p238
- sS'expiration_failed_logins'
- p239
- S'3600'
- p240
- sS'LABEL'
- p241
- S"<class 'gluon.html.LABEL'>"
- p242
- sS'OPTGROUP'
- p243
- S"<class 'gluon.html.OPTGROUP'>"
- p244
- sS'REPLACE_TAB_BY_SPACES'
- p245
- S'4'
- sS'A'
- S"<class 'gluon.html.A'>"
- p246
- sS'LI'
- p247
- S"<class 'gluon.html.LI'>"
- p248
- sS'write_file'
- p249
- S'<function write_file>'
- p250
- sS'port'
- p251
- S'443'
- p252
- sS'SELECT'
- p253
- S"<class 'gluon.html.SELECT'>"
- p254
- sS'DEMO_MODE'
- p255
- g232
- sS'sp_button'
- p256
- S'<function sp_button>'
- p257
- sS'LAYOUTS_APP'
- p258
- S"'http://web2py.com/layouts'"
- p259
- sS'STRONG'
- p260
- S"<class 'gluon.html.STRONG'>"
- p261
- sS'FONT_SIZE'
- p262
- S'10'
- p263
- sS'CENTER'
- p264
- S"<class 'gluon.html.CENTER'>"
- p265
- sS'allowed_number_of_attempts'
- p266
- S'5'
- sg86
- S'<function restricted>'
- p267
- sS'EXPERIMENTAL_STUFF'
- p268
- g182
- sS'urllib'
- p269
- S"<module 'urllib' from '/usr/lib/python2.7/urllib.py'>"
- p270
- sS'DISPLAY'
- p271
- S"'onload'"
- p272
- sS'global_settings'
- p273
- S"<Storage {'debugging': False, 'is_pypy': False, ...': '2.5.1-stable+timestamp.2013.06.06.15.39.19'}>"
- p274
- sS'HTML'
- p275
- S"<class 'gluon.html.HTML'>"
- p276
- sS'SQLFORM'
- p277
- S"<class 'gluon.sqlhtml.SQLFORM'>"
- p278
- sS'deny_file'
- p279
- S"'/home/mattspence/web2py/applications/admin/private/hosts.deny'"
- p280
- sS'tar_compiled'
- p281
- S'<function tar_compiled>'
- p282
- sS'searchbox'
- p283
- S'<function searchbox>'
- p284
- sS'EM'
- p285
- S"<class 'gluon.html.EM'>"
- p286
- sS'PRE'
- p287
- S"<class 'gluon.html.PRE'>"
- p288
- sS'FIELDSET'
- p289
- S"<class 'gluon.html.FIELDSET'>"
- p290
- sS'create_missing_folders'
- p291
- S'<function create_missing_folders>'
- p292
- sS'__builtins__'
- p293
- S"{'ArithmeticError': <type 'exceptions.ArithmeticError'>, 'AssertionError': <type 'exceptions.AssertionError'>, 'AttributeError': <type 'exceptions.AttributeError'>, 'BaseException': <type 'exceptions.BaseException'>, 'BufferError': <type 'exceptions.BufferError'>, 'BytesWarning': <type 'exceptions.BytesWarning'>, 'DeprecationWarning': <type 'exceptions.DeprecationWarning'>, 'EOFError': <type 'exceptions.EOFError'>, 'Ellipsis': Ellipsis, 'EnvironmentError': <type 'exceptions.EnvironmentError'>, ...}"
- p294
- sS'FILTER_APPS'
- p295
- S'[]'
- p296
- sS'HEAD'
- p297
- S"<class 'gluon.html.HEAD'>"
- p298
- sS'embed64'
- p299
- S'<function embed64>'
- p300
- sS'IS_LIST_OF'
- p301
- S"<class 'gluon.validators.IS_LIST_OF'>"
- p302
- sS'apath'
- p303
- S'<function apath>'
- p304
- sS'findT'
- p305
- S'<function findT>'
- p306
- sS'plugin_install'
- p307
- S'<function plugin_install>'
- p308
- sS'cgi'
- p309
- S"<module 'cgi' from '/usr/lib/python2.7/cgi.py'>"
- p310
- sS'regex_expose'
- p311
- S'<_sre.SRE_Pattern object>'
- p312
- sS'CLEANUP'
- p313
- S"<class 'gluon.validators.CLEANUP'>"
- p314
- sS'verify_password'
- p315
- S'<function verify_password>'
- p316
- sS'H2'
- p317
- S"<class 'gluon.html.H2'>"
- p318
- sS'H3'
- p319
- S"<class 'gluon.html.H3'>"
- p320
- sS'BUTTON'
- p321
- S"<class 'gluon.html.BUTTON'>"
- p322
- sS'traceback'
- p323
- S"<module 'traceback' from '/usr/lib/python2.7/traceback.py'>"
- p324
- sS'H6'
- p325
- S"<class 'gluon.html.H6'>"
- p326
- sS'portalocker'
- p327
- S"<module 'gluon.portalocker' from '/home/mattspence/web2py/gluon/portalocker.pyc'>"
- p328
- sS'is_manager'
- p329
- S'<function is_manager>'
- p330
- sS'H5'
- p331
- S"<class 'gluon.html.H5'>"
- p332
- sS'UL'
- p333
- S"<class 'gluon.html.UL'>"
- p334
- sS'IS_UPPER'
- p335
- S"<class 'gluon.validators.IS_UPPER'>"
- p336
- sS'xmlescape'
- p337
- S'<function xmlescape>'
- p338
- sS'IS_TIME'
- p339
- S"<class 'gluon.validators.IS_TIME'>"
- p340
- sS'os'
- p341
- S"<module 'os' from '/usr/lib/python2.7/os.py'>"
- p342
- sS'compile_application'
- p343
- S'<function compile_application>'
- p344
- sS'RestrictedError'
- p345
- S"<class 'gluon.restricted.RestrictedError'>"
- p346
- sS'base64'
- p347
- S"<module 'base64' from '/usr/lib/python2.7/base64.py'>"
- p348
- sS'OPTION'
- p349
- S"<class 'gluon.html.OPTION'>"
- p350
- sS'TITLE'
- p351
- S"<class 'gluon.html.TITLE'>"
- p352
- sS'CRYPT'
- p353
- S"<class 'gluon.validators.CRYPT'>"
- p354
- sS'IS_EMPTY_OR'
- p355
- S"<class 'gluon.validators.IS_EMPTY_OR'>"
- p356
- sS'MARKMIN'
- p357
- S"<class 'gluon.html.MARKMIN'>"
- p358
- sS'w2p_unpack'
- p359
- S'<function w2p_unpack>'
- p360
- sS'web2py_uuid'
- p361
- S'<function web2py_uuid>'
- p362
- sS'INPUT'
- p363
- S"<class 'gluon.html.INPUT'>"
- p364
- sS'MULTI_USER_MODE'
- p365
- g232
- sS'regex_tables'
- p366
- S'<_sre.SRE_Pattern object>'
- p367
- sS'COL'
- p368
- S"<class 'gluon.html.COL'>"
- p369
- sS'SCRIPT'
- p370
- S"<class 'gluon.html.SCRIPT'>"
- p371
- sS'have_mercurial'
- p372
- g182
- sS'is_mobile'
- p373
- g232
- sS'EXPIRATION'
- p374
- S'3600'
- p375
- sS'TEXT_EDITOR_KEYBINDING'
- p376
- S"''"
- p377
- sS'TABLE'
- p378
- S"<class 'gluon.html.TABLE'>"
- p379
- sS'recursive_unlink'
- p380
- S'<function recursive_unlink>'
- p381
- sS'IS_EXPR'
- p382
- S"<class 'gluon.validators.IS_EXPR'>"
- p383
- sS'IS_IPV4'
- p384
- S"<class 'gluon.validators.IS_IPV4'>"
- p385
- sS'IS_LENGTH'
- p386
- S"<class 'gluon.validators.IS_LENGTH'>"
- p387
- sS'IS_IPV6'
- p388
- S"<class 'gluon.validators.IS_IPV6'>"
- p389
- sS'XML'
- p390
- S"<class 'gluon.html.XML'>"
- p391
- sS'B'
- S"<class 'gluon.html.B'>"
- p392
- sS'IMG'
- p393
- S"<class 'gluon.html.IMG'>"
- p394
- sS'SQLTABLE'
- p395
- S"<class 'gluon.sqlhtml.SQLTABLE'>"
- p396
- sS'abspath'
- p397
- S'<function abspath>'
- p398
- sS'untar'
- p399
- S'<function untar>'
- p400
- sS'IS_ALPHANUMERIC'
- p401
- S"<class 'gluon.validators.IS_ALPHANUMERIC'>"
- p402
- sS'site'
- p403
- S"<module 'site' from '/usr/lib/python2.7/site.py'>"
- p404
- sS'hg'
- p405
- S"<module 'mercurial.hg' from '/usr/local/lib/python2.7/dist-packages/mercurial/hg.py'>"
- p406
- sS'socket'
- p407
- S"<module 'socket' from '/usr/lib/python2.7/socket.py'>"
- p408
- sS'app_pack_compiled'
- p409
- S'<function app_pack_compiled>'
- p410
- sS'SPAN'
- p411
- S"<class 'gluon.html.SPAN'>"
- p412
- sS'IS_JSON'
- p413
- S"<class 'gluon.validators.IS_JSON'>"
- p414
- sS'IS_IPADDRESS'
- p415
- S"<class 'gluon.validators.IS_IPADDRESS'>"
- p416
- sS'_c'
- p417
- S"'default'"
- p418
- sS'PLUGINS_APP'
- p419
- S"'http://web2py.com/plugins'"
- p420
- sS'up'
- p421
- S'<function up>'
- p422
- sS'CHECK_VERSION'
- p423
- g182
- sS'TD'
- p424
- S"<class 'gluon.html.TD'>"
- p425
- sS'BEAUTIFY'
- p426
- S"<class 'gluon.html.BEAUTIFY'>"
- p427
- sS'META'
- p428
- S"<class 'gluon.html.META'>"
- p429
- sS'md5_hash'
- p430
- S'<function md5_hash>'
- p431
- sS'read_file'
- p432
- S'<function read_file>'
- p433
- sS'update_all_languages'
- p434
- S'<function update_all_languages>'
- p435
- sS'TEXT_EDITOR'
- p436
- S"'codemirror'"
- p437
- sS'app_create'
- p438
- S'<function app_create>'
- p439
- sS'H1'
- p440
- S"<class 'gluon.html.H1'>"
- p441
- sS'IS_DATE'
- p442
- S"<class 'gluon.validators.IS_DATE'>"
- p443
- sS'IS_EMAIL'
- p444
- S"<class 'gluon.validators.IS_EMAIL'>"
- p445
- sS'tar'
- p446
- S'<function tar>'
- p447
- sS'IS_DECIMAL_IN_RANGE'
- p448
- S"<class 'gluon.validators.IS_DECIMAL_IN_RANGE'>"
- p449
- sS'IS_NOT_EMPTY'
- p450
- S"<class 'gluon.validators.IS_NOT_EMPTY'>"
- p451
- sS'IS_FLOAT_IN_RANGE'
- p452
- S"<class 'gluon.validators.IS_FLOAT_IN_RANGE'>"
- p453
- sS'w2p_pack'
- p454
- S'<function w2p_pack>'
- p455
- sS'TBODY'
- p456
- S"<class 'gluon.html.TBODY'>"
- p457
- sS'CAT'
- p458
- S"<class 'gluon.html.CAT'>"
- p459
- sS'Field'
- p460
- S"<class 'gluon.dal.Field'>"
- p461
- sS'unzip'
- p462
- S'<function unzip>'
- p463
- sS'H4'
- p464
- S"<class 'gluon.html.H4'>"
- p465
- sS'w2p_pack_plugin'
- p466
- S'<function w2p_pack_plugin>'
- p467
- sS'DIV'
- p468
- S"<class 'gluon.html.DIV'>"
- p469
- sS'shutil'
- p470
- S"<module 'shutil' from '/usr/lib/python2.7/shutil.py'>"
- p471
- sS'LEGEND'
- p472
- S"<class 'gluon.html.LEGEND'>"
- p473
- sS'app_install'
- p474
- S'<function app_install>'
- p475
- sS'COLGROUP'
- p476
- S"<class 'gluon.html.COLGROUP'>"
- p477
- sS'A_button'
- p478
- S'<function A_button>'
- p479
- sS'TT'
- p480
- S"<class 'gluon.html.TT'>"
- p481
- sS'TR'
- p482
- S"<class 'gluon.html.TR'>"
- p483
- sS'FULL_SCREEN'
- p484
- S"'false'"
- p485
- sS'__package__'
- p486
- S'None'
- p487
- sS'listdir'
- p488
- S'<function listdir>'
- p489
- sS'URL'
- p490
- S'<function URL>'
- p491
- sS'IFRAME'
- p492
- S"<class 'gluon.html.IFRAME'>"
- p493
- sS'remove_compiled_application'
- p494
- S'<function remove_compiled_application>'
- p495
- sS'IS_URL'
- p496
- S"<class 'gluon.validators.IS_URL'>"
- p497
- sS'IS_MATCH'
- p498
- S"<class 'gluon.validators.IS_MATCH'>"
- p499
- sS'create_missing_app_folders'
- p500
- S'<function create_missing_app_folders>'
- p501
- sS'dedent'
- p502
- S'<function dedent>'
- p503
- sS'STYLE'
- p504
- S"<class 'gluon.html.STYLE'>"
- p505
- sS'IS_NULL_OR'
- p506
- S"<class 'gluon.validators.IS_EMPTY_OR'>"
- p507
- sS'IS_DATETIME_IN_RANGE'
- p508
- S"<class 'gluon.validators.IS_DATETIME_IN_RANGE'>"
- p509
- sS'FORM'
- p510
- S"<class 'gluon.html.FORM'>"
- p511
- sS'I'
- S"<class 'gluon.html.I'>"
- p512
- sS'w2p_unpack_plugin'
- p513
- S'<function w2p_unpack_plugin>'
- p514
- sS'sys'
- p515
- S"<module 'sys' (built-in)>"
- p516
- sS'IS_NOT_IN_DB'
- p517
- S"<class 'gluon.validators.IS_NOT_IN_DB'>"
- p518
- sS'ALLOW_TOGGLE'
- p519
- S"'true'"
- p520
- sS'http_host'
- p521
- S"'mattspence.pythonanywhere.com'"
- p522
- sS'rmtree'
- p523
- S'<function rmtree>'
- p524
- sS'TEXT_EDITOR_THEME'
- p525
- S"'chrome'"
- p526
- sS'parse_version'
- p527
- S'<function parse_version>'
- p528
- sS'cleanpath'
- p529
- S'<function cleanpath>'
- p530
- sg112
- S"<Storage {'body': <cStringIO.StringO object at 0...bda> at 0x14a7aa0>, 'view': 'default/site.html'}>"
- p531
- sS'THEAD'
- p532
- S"<class 'gluon.html.THEAD'>"
- p533
- sS'ANY_OF'
- p534
- S"<class 'gluon.validators.ANY_OF'>"
- p535
- sS'_config'
- p536
- S"{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>, 'AssertionError': <type 'exceptions.AssertionError'>, 'AttributeError': <type 'exceptions.AttributeError'>, 'BaseException': <type 'exceptions.BaseException'>, 'BufferError': <type 'exceptions.BufferError'>, 'BytesWarning': <type 'exceptions.BytesWarning'>, 'DeprecationWarning': <type 'exceptions.DeprecationWarning'>, 'EOFError': <type 'exceptions.EOFError'>, 'Ellipsis': Ellipsis, 'EnvironmentError': <type 'exceptions.EnvironmentError'>, ...}, '__file__': 'Unknown', '__name__': '__restricted__', 'password': '46a72111db809e45a5abf798479579f0'}"
- p537
- sS'fix_newlines'
- p538
- S'<function fix_newlines>'
- p539
- sS'__name__'
- p540
- S"'__restricted__'"
- p541
- sS'GAE_APPCFG'
- p542
- S"'/usr/local/bin/appcfg.py'"
- p543
- sg56
- S"<Storage {'function': 'site', 'body': <cStringIO...applications/admin/', 'post_vars': <Storage {}>}>"
- p544
- sS'difflib'
- p545
- S"<module 'difflib' from '/usr/lib/python2.7/difflib.py'>"
- p546
- sS'EMAIL_SENDER'
- p547
- S"'[email protected]'"
- p548
- sS'DAL'
- p549
- S"<class 'gluon.dal.DAL'>"
- p550
- sS'IS_IN_SET'
- p551
- S"<class 'gluon.validators.IS_IN_SET'>"
- p552
- sS'TWITTER_HASH'
- p553
- S"'web2py'"
- p554
- sS'IS_UPLOAD_FILENAME'
- p555
- S"<class 'gluon.validators.IS_UPLOAD_FILENAME'>"
- p556
- sS'time'
- p557
- S"<module 'time' (built-in)>"
- p558
- sS'app_uninstall'
- p559
- S'<function app_uninstall>'
- p560
- sS'regex_extend'
- p561
- S'<_sre.SRE_Pattern object>'
- p562
- sS're'
- p563
- S"<module 're' from '/usr/lib/python2.7/re.py'>"
- p564
- sS'TFOOT'
- p565
- S"<class 'gluon.html.TFOOT'>"
- p566
- sssg323
- S'Traceback (most recent call last):\n File "/home/mattspence/web2py/gluon/restricted.py", line 212, in restricted\n exec ccode in environment\n File "/home/mattspence/web2py/applications/admin/controllers/default.py", line 14, in <module>\n from gluon.tools import Config\nImportError: cannot import name Config\n'
- p567
- s.
Add Comment
Please, Sign In to add comment