Guest User

error message on 2.6.2

a guest
Sep 14th, 2013
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 225.66 KB | None | 0 0
  1. (dp1
  2. S'output'
  3. p2
  4. S"<type 'exceptions.ImportError'> cannot import name Config"
  5. p3
  6. sS'layer'
  7. p4
  8. S'/home/mattspence/web2py/applications/admin/controllers/default.py'
  9. p5
  10. sS'code'
  11. p6
  12. 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 += \'&nbsp;\'\n elif c == \' \\t\':\n z += \'&nbsp;\'\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(\'&nbsp;\')), 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'
  13. p7
  14. sS'snapshot'
  15. p8
  16. (dp9
  17. S'exception'
  18. p10
  19. (dp11
  20. S'__hash__'
  21. p12
  22. S"<method-wrapper '__hash__' of exceptions.ImportError object>"
  23. p13
  24. sS'__setattr__'
  25. p14
  26. S"<method-wrapper '__setattr__' of exceptions.ImportError object>"
  27. p15
  28. sS'__reduce_ex__'
  29. p16
  30. S'<built-in method __reduce_ex__ of exceptions.ImportError object>'
  31. p17
  32. sS'__getslice__'
  33. p18
  34. S"<method-wrapper '__getslice__' of exceptions.ImportError object>"
  35. p19
  36. sS'__getitem__'
  37. p20
  38. S"<method-wrapper '__getitem__' of exceptions.ImportError object>"
  39. p21
  40. sS'__setstate__'
  41. p22
  42. S'<built-in method __setstate__ of exceptions.ImportError object>'
  43. p23
  44. sS'args'
  45. p24
  46. S"('cannot import name Config',)"
  47. p25
  48. sS'__reduce__'
  49. p26
  50. S'<built-in method __reduce__ of exceptions.ImportError object>'
  51. p27
  52. sS'__str__'
  53. p28
  54. S"<method-wrapper '__str__' of exceptions.ImportError object>"
  55. p29
  56. sS'__format__'
  57. p30
  58. S'<built-in method __format__ of exceptions.ImportError object>'
  59. p31
  60. sS'__getattribute__'
  61. p32
  62. S"<method-wrapper '__getattribute__' of exceptions.ImportError object>"
  63. p33
  64. sS'__class__'
  65. p34
  66. S"<type 'exceptions.ImportError'>"
  67. p35
  68. sS'__unicode__'
  69. p36
  70. S'<built-in method __unicode__ of exceptions.ImportError object>'
  71. p37
  72. sS'__delattr__'
  73. p38
  74. S"<method-wrapper '__delattr__' of exceptions.ImportError object>"
  75. p39
  76. sS'__subclasshook__'
  77. p40
  78. S'<built-in method __subclasshook__ of type object>'
  79. p41
  80. sS'__repr__'
  81. p42
  82. S"<method-wrapper '__repr__' of exceptions.ImportError object>"
  83. p43
  84. sS'__dict__'
  85. p44
  86. S'{}'
  87. p45
  88. sS'__sizeof__'
  89. p46
  90. S'<built-in method __sizeof__ of exceptions.ImportError object>'
  91. p47
  92. sS'__doc__'
  93. p48
  94. S'"Import can\'t find module, or can\'t find name in module."'
  95. p49
  96. sS'__init__'
  97. p50
  98. S"<method-wrapper '__init__' of exceptions.ImportError object>"
  99. p51
  100. sS'__new__'
  101. p52
  102. S'<built-in method __new__ of type object>'
  103. p53
  104. ssS'evalue'
  105. p54
  106. S'cannot import name Config'
  107. p55
  108. sS'request'
  109. p56
  110. cgluon.html
  111. XML_unpickle
  112. p57
  113. (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>&lt;cStringIO.StringO object at 0x2c51228&gt;</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([&#x27;/home/mattspence/web2py/applications/admin/&#x27;])</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>&lt;uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_file_wrapper</td><td valign="top">:</td><td><div>&lt;built-in function uwsgi_sendfile&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_input</td><td valign="top">:</td><td><div>&lt;uwsgi._Input object at 0x7f6453906600&gt;</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([&#x27;/home/mattspence/web2py/applications/admin/&#x27;])</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>&lt;uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.file_wrapper</td><td valign="top">:</td><td><div>&lt;built-in function uwsgi_sendfile&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.input</td><td valign="top">:</td><td><div>&lt;cStringIO.StringO object at 0x2c51228&gt;</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>'
  114. tRp58
  115. sS'frames'
  116. p59
  117. (lp60
  118. (dp61
  119. S'file'
  120. p62
  121. S'/home/mattspence/web2py/gluon/restricted.py'
  122. p63
  123. sS'dump'
  124. p64
  125. (dp65
  126. S'environment'
  127. p66
  128. 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'>, ...}"
  129. p67
  130. sS'ccode'
  131. p68
  132. S'<code object <module> at 0x148f230, file "/home/...plications/admin/controllers/default.py", line 3>'
  133. p69
  134. ssS'lnum'
  135. p70
  136. I212
  137. sS'lines'
  138. p71
  139. (dp72
  140. I207
  141. S' try:'
  142. p73
  143. sI208
  144. S' if isinstance(code, types.CodeType):'
  145. p74
  146. sI209
  147. S' ccode = code'
  148. p75
  149. sI210
  150. S' else:'
  151. p76
  152. sI211
  153. S' ccode = compile2(code, layer)'
  154. p77
  155. sI212
  156. S' exec ccode in environment'
  157. p78
  158. sI213
  159. S' except HTTP:'
  160. p79
  161. sI214
  162. S' raise'
  163. p80
  164. sI215
  165. S' except RestrictedError:'
  166. p81
  167. sI216
  168. S' # do not encapsulate (obfuscate) the original RestrictedError'
  169. p82
  170. ssS'call'
  171. p83
  172. 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')"
  173. p84
  174. sS'func'
  175. p85
  176. S'restricted'
  177. p86
  178. sa(dp87
  179. g62
  180. S'/home/mattspence/web2py/applications/admin/controllers/default.py'
  181. p88
  182. sg64
  183. (dp89
  184. S'Config'
  185. p90
  186. S'undefined'
  187. p91
  188. sS'gluon'
  189. p92
  190. g91
  191. ssg70
  192. I14
  193. sg71
  194. (dp93
  195. I9
  196. S''
  197. sI10
  198. S'import re'
  199. p94
  200. sI11
  201. S'from gluon.admin import *'
  202. p95
  203. sI12
  204. S'from gluon.fileutils import abspath, read_file, write_file'
  205. p96
  206. sI13
  207. S'from gluon.utils import web2py_uuid'
  208. p97
  209. sI14
  210. S'from gluon.tools import Config'
  211. p98
  212. sI15
  213. S'from glob import glob'
  214. p99
  215. sI16
  216. S'import shutil'
  217. p100
  218. sI17
  219. S'import platform'
  220. p101
  221. sI18
  222. S''
  223. ssg83
  224. S'()'
  225. p102
  226. sg85
  227. S'<module>'
  228. p103
  229. sasS'pyver'
  230. p104
  231. S'Python 2.7.4: /usr/local/bin/uwsgi (prefix: /usr)'
  232. p105
  233. sS'session'
  234. p106
  235. g57
  236. (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>'
  237. tRp107
  238. sS'etype'
  239. p108
  240. S"<type 'exceptions.ImportError'>"
  241. p109
  242. sS'date'
  243. p110
  244. S'Sat Sep 14 23:44:12 2013'
  245. p111
  246. sS'response'
  247. p112
  248. g57
  249. (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>&lt;cStringIO.StringO object at 0x2c4f068&gt;</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 &quot;[Errno 2] No such file or directory: &#x27;/home/mattspence/web2py/examples/README&#x27;&quot;</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>&lt;open file &#x27;/home/mattspence/web2py/applications/admin/sessions/108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8&#x27;, mode &#x27;rb+&#x27; at 0x2bdadb0&gt;</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>'
  250. tRp113
  251. sS'locals'
  252. p114
  253. (dp115
  254. S'IS_SLUG'
  255. p116
  256. S"<class 'gluon.validators.IS_SLUG'>"
  257. p117
  258. sS'OBJECT'
  259. p118
  260. S"<class 'gluon.html.OBJECT'>"
  261. p119
  262. sS'plugin_pack'
  263. p120
  264. S'<function plugin_pack>'
  265. p121
  266. sS'helpicon'
  267. p122
  268. S'<function helpicon>'
  269. p123
  270. sS'SQLDB'
  271. p124
  272. S"<class 'gluon.dal.DAL'>"
  273. p125
  274. sS'read_hosts_deny'
  275. p126
  276. S'<function read_hosts_deny>'
  277. p127
  278. sg106
  279. S"<Storage {'_user_agent': {'is_mobile': False, 'i...ssion_hash': 'eac378321ffab41f2da22ca2e492be5c'}>"
  280. p128
  281. sS'LINK'
  282. p129
  283. S"<class 'gluon.html.LINK'>"
  284. p130
  285. sS'BR'
  286. p131
  287. S"<class 'gluon.html.BR'>"
  288. p132
  289. sS'local_import'
  290. p133
  291. S'<function <lambda>>'
  292. p134
  293. sS'EMBED'
  294. p135
  295. S"<class 'gluon.html.EMBED'>"
  296. p136
  297. sS'cmdutil'
  298. p137
  299. S"<module 'mercurial.cmdutil' from '/usr/local/lib/python2.7/dist-packages/mercurial/cmdutil.py'>"
  300. p138
  301. sS'compile2'
  302. p139
  303. S'<function compile2>'
  304. p140
  305. sS'redirect'
  306. p141
  307. S'<function redirect>'
  308. p142
  309. sS'IS_INT_IN_RANGE'
  310. p143
  311. S"<class 'gluon.validators.IS_INT_IN_RANGE'>"
  312. p144
  313. sS'upgrade'
  314. p145
  315. S'<function upgrade>'
  316. p146
  317. sS'IS_LOWER'
  318. p147
  319. S"<class 'gluon.validators.IS_LOWER'>"
  320. p148
  321. sS'IS_STRONG'
  322. p149
  323. S"<class 'gluon.validators.IS_STRONG'>"
  324. p150
  325. sS'write_hosts_deny'
  326. p151
  327. S'<function write_hosts_deny>'
  328. p152
  329. sS'cache'
  330. p153
  331. S'<gluon.cache.Cache object>'
  332. p154
  333. sS'addremove'
  334. p155
  335. S'<function addremove>'
  336. p156
  337. sS'IS_IN_DB'
  338. p157
  339. S"<class 'gluon.validators.IS_IN_DB'>"
  340. p158
  341. sS'TAG'
  342. p159
  343. S'<gluon.html.__TAG__ object>'
  344. p160
  345. sS'WEB2PY_VERSION_URL'
  346. p161
  347. S"'http://web2py.com/examples/default/version'"
  348. p162
  349. sS'app_pack'
  350. p163
  351. S'<function app_pack>'
  352. p164
  353. sS'SQLField'
  354. p165
  355. S"<class 'gluon.dal.Field'>"
  356. p166
  357. sS'_f'
  358. p167
  359. S"'site'"
  360. p168
  361. sS'app_cleanup'
  362. p169
  363. S'<function app_cleanup>'
  364. p170
  365. sS'_a'
  366. p171
  367. S"'admin'"
  368. p172
  369. sS'BODY'
  370. p173
  371. S"<class 'gluon.html.BODY'>"
  372. p174
  373. sS'IS_DATE_IN_RANGE'
  374. p175
  375. S"<class 'gluon.validators.IS_DATE_IN_RANGE'>"
  376. p176
  377. sS'button_enable'
  378. p177
  379. S'<function button_enable>'
  380. p178
  381. sS'TH'
  382. p179
  383. S"<class 'gluon.html.TH'>"
  384. p180
  385. sS'ON'
  386. p181
  387. S'True'
  388. p182
  389. sS'app_compile'
  390. p183
  391. S'<function app_compile>'
  392. p184
  393. sS'__file__'
  394. p185
  395. S"'/home/mattspence/web2py/applications/admin/controllers/default.py'"
  396. p186
  397. sS'zipfile'
  398. p187
  399. S"<module 'zipfile' from '/usr/lib/python2.7/zipfile.py'>"
  400. p188
  401. sS'stat'
  402. p189
  403. S"<module 'stat' from '/usr/lib/python2.7/stat.py'>"
  404. p190
  405. sS'P'
  406. S"<class 'gluon.html.P'>"
  407. p191
  408. sS'T'
  409. S'<gluon.languages.translator object>'
  410. p192
  411. sS'ui'
  412. p193
  413. S"<module 'mercurial.ui' from '/usr/local/lib/python2.7/dist-packages/mercurial/ui.py'>"
  414. p194
  415. sS'XHTML'
  416. p195
  417. S"<class 'gluon.html.XHTML'>"
  418. p196
  419. sS'EMAIL_SERVER'
  420. p197
  421. S"'localhost'"
  422. p198
  423. sS'add_path_first'
  424. p199
  425. S'<function add_path_first>'
  426. p200
  427. sS'regex_include'
  428. p201
  429. S'<_sre.SRE_Pattern object>'
  430. p202
  431. sS'TicketStorage'
  432. p203
  433. S"<class 'gluon.restricted.TicketStorage'>"
  434. p204
  435. sS'OL'
  436. p205
  437. S"<class 'gluon.html.OL'>"
  438. p206
  439. sS'TEXTAREA'
  440. p207
  441. S"<class 'gluon.html.TEXTAREA'>"
  442. p208
  443. sS'MENU'
  444. p209
  445. S"<class 'gluon.html.MENU'>"
  446. p210
  447. sS'button'
  448. p211
  449. S'<function button>'
  450. p212
  451. sS'EMAIL_LOGIN'
  452. p213
  453. S'None'
  454. p214
  455. sS't0'
  456. p215
  457. S'1379202252.335307'
  458. p216
  459. sS'check_new_version'
  460. p217
  461. S'<function check_new_version>'
  462. p218
  463. sS'IS_IMAGE'
  464. p219
  465. S"<class 'gluon.validators.IS_IMAGE'>"
  466. p220
  467. sS'WEB2PY_URL'
  468. p221
  469. S"'http://web2py.com'"
  470. p222
  471. sS'LOAD'
  472. p223
  473. S'<function LOAD>'
  474. p224
  475. sS'IS_EQUAL_TO'
  476. p225
  477. S"<class 'gluon.validators.IS_EQUAL_TO'>"
  478. p226
  479. sS'CODE'
  480. p227
  481. S"<class 'gluon.html.CODE'>"
  482. p228
  483. sS'HTTP'
  484. p229
  485. S"<class 'gluon.http.HTTP'>"
  486. p230
  487. sS'is_gae'
  488. p231
  489. S'False'
  490. p232
  491. sS'HR'
  492. p233
  493. S"<class 'gluon.html.HR'>"
  494. p234
  495. sS'IS_DATETIME'
  496. p235
  497. S"<class 'gluon.validators.IS_DATETIME'>"
  498. p236
  499. sS'login_record'
  500. p237
  501. S'<function login_record>'
  502. p238
  503. sS'expiration_failed_logins'
  504. p239
  505. S'3600'
  506. p240
  507. sS'LABEL'
  508. p241
  509. S"<class 'gluon.html.LABEL'>"
  510. p242
  511. sS'OPTGROUP'
  512. p243
  513. S"<class 'gluon.html.OPTGROUP'>"
  514. p244
  515. sS'REPLACE_TAB_BY_SPACES'
  516. p245
  517. S'4'
  518. sS'A'
  519. S"<class 'gluon.html.A'>"
  520. p246
  521. sS'LI'
  522. p247
  523. S"<class 'gluon.html.LI'>"
  524. p248
  525. sS'write_file'
  526. p249
  527. S'<function write_file>'
  528. p250
  529. sS'port'
  530. p251
  531. S'443'
  532. p252
  533. sS'SELECT'
  534. p253
  535. S"<class 'gluon.html.SELECT'>"
  536. p254
  537. sS'DEMO_MODE'
  538. p255
  539. g232
  540. sS'sp_button'
  541. p256
  542. S'<function sp_button>'
  543. p257
  544. sS'LAYOUTS_APP'
  545. p258
  546. S"'http://web2py.com/layouts'"
  547. p259
  548. sS'STRONG'
  549. p260
  550. S"<class 'gluon.html.STRONG'>"
  551. p261
  552. sS'FONT_SIZE'
  553. p262
  554. S'10'
  555. p263
  556. sS'CENTER'
  557. p264
  558. S"<class 'gluon.html.CENTER'>"
  559. p265
  560. sS'allowed_number_of_attempts'
  561. p266
  562. S'5'
  563. sg86
  564. S'<function restricted>'
  565. p267
  566. sS'EXPERIMENTAL_STUFF'
  567. p268
  568. g182
  569. sS'urllib'
  570. p269
  571. S"<module 'urllib' from '/usr/lib/python2.7/urllib.py'>"
  572. p270
  573. sS'DISPLAY'
  574. p271
  575. S"'onload'"
  576. p272
  577. sS'global_settings'
  578. p273
  579. S"<Storage {'debugging': False, 'is_pypy': False, ...': '2.5.1-stable+timestamp.2013.06.06.15.39.19'}>"
  580. p274
  581. sS'HTML'
  582. p275
  583. S"<class 'gluon.html.HTML'>"
  584. p276
  585. sS'SQLFORM'
  586. p277
  587. S"<class 'gluon.sqlhtml.SQLFORM'>"
  588. p278
  589. sS'deny_file'
  590. p279
  591. S"'/home/mattspence/web2py/applications/admin/private/hosts.deny'"
  592. p280
  593. sS'tar_compiled'
  594. p281
  595. S'<function tar_compiled>'
  596. p282
  597. sS'searchbox'
  598. p283
  599. S'<function searchbox>'
  600. p284
  601. sS'EM'
  602. p285
  603. S"<class 'gluon.html.EM'>"
  604. p286
  605. sS'PRE'
  606. p287
  607. S"<class 'gluon.html.PRE'>"
  608. p288
  609. sS'FIELDSET'
  610. p289
  611. S"<class 'gluon.html.FIELDSET'>"
  612. p290
  613. sS'create_missing_folders'
  614. p291
  615. S'<function create_missing_folders>'
  616. p292
  617. sS'__builtins__'
  618. p293
  619. 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'>, ...}"
  620. p294
  621. sS'FILTER_APPS'
  622. p295
  623. S'[]'
  624. p296
  625. sS'HEAD'
  626. p297
  627. S"<class 'gluon.html.HEAD'>"
  628. p298
  629. sS'embed64'
  630. p299
  631. S'<function embed64>'
  632. p300
  633. sS'IS_LIST_OF'
  634. p301
  635. S"<class 'gluon.validators.IS_LIST_OF'>"
  636. p302
  637. sS'apath'
  638. p303
  639. S'<function apath>'
  640. p304
  641. sS'findT'
  642. p305
  643. S'<function findT>'
  644. p306
  645. sS'plugin_install'
  646. p307
  647. S'<function plugin_install>'
  648. p308
  649. sS'cgi'
  650. p309
  651. S"<module 'cgi' from '/usr/lib/python2.7/cgi.py'>"
  652. p310
  653. sS'regex_expose'
  654. p311
  655. S'<_sre.SRE_Pattern object>'
  656. p312
  657. sS'CLEANUP'
  658. p313
  659. S"<class 'gluon.validators.CLEANUP'>"
  660. p314
  661. sS'verify_password'
  662. p315
  663. S'<function verify_password>'
  664. p316
  665. sS'H2'
  666. p317
  667. S"<class 'gluon.html.H2'>"
  668. p318
  669. sS'H3'
  670. p319
  671. S"<class 'gluon.html.H3'>"
  672. p320
  673. sS'BUTTON'
  674. p321
  675. S"<class 'gluon.html.BUTTON'>"
  676. p322
  677. sS'traceback'
  678. p323
  679. S"<module 'traceback' from '/usr/lib/python2.7/traceback.py'>"
  680. p324
  681. sS'H6'
  682. p325
  683. S"<class 'gluon.html.H6'>"
  684. p326
  685. sS'portalocker'
  686. p327
  687. S"<module 'gluon.portalocker' from '/home/mattspence/web2py/gluon/portalocker.pyc'>"
  688. p328
  689. sS'is_manager'
  690. p329
  691. S'<function is_manager>'
  692. p330
  693. sS'H5'
  694. p331
  695. S"<class 'gluon.html.H5'>"
  696. p332
  697. sS'UL'
  698. p333
  699. S"<class 'gluon.html.UL'>"
  700. p334
  701. sS'IS_UPPER'
  702. p335
  703. S"<class 'gluon.validators.IS_UPPER'>"
  704. p336
  705. sS'xmlescape'
  706. p337
  707. S'<function xmlescape>'
  708. p338
  709. sS'IS_TIME'
  710. p339
  711. S"<class 'gluon.validators.IS_TIME'>"
  712. p340
  713. sS'os'
  714. p341
  715. S"<module 'os' from '/usr/lib/python2.7/os.py'>"
  716. p342
  717. sS'compile_application'
  718. p343
  719. S'<function compile_application>'
  720. p344
  721. sS'RestrictedError'
  722. p345
  723. S"<class 'gluon.restricted.RestrictedError'>"
  724. p346
  725. sS'base64'
  726. p347
  727. S"<module 'base64' from '/usr/lib/python2.7/base64.py'>"
  728. p348
  729. sS'OPTION'
  730. p349
  731. S"<class 'gluon.html.OPTION'>"
  732. p350
  733. sS'TITLE'
  734. p351
  735. S"<class 'gluon.html.TITLE'>"
  736. p352
  737. sS'CRYPT'
  738. p353
  739. S"<class 'gluon.validators.CRYPT'>"
  740. p354
  741. sS'IS_EMPTY_OR'
  742. p355
  743. S"<class 'gluon.validators.IS_EMPTY_OR'>"
  744. p356
  745. sS'MARKMIN'
  746. p357
  747. S"<class 'gluon.html.MARKMIN'>"
  748. p358
  749. sS'w2p_unpack'
  750. p359
  751. S'<function w2p_unpack>'
  752. p360
  753. sS'web2py_uuid'
  754. p361
  755. S'<function web2py_uuid>'
  756. p362
  757. sS'INPUT'
  758. p363
  759. S"<class 'gluon.html.INPUT'>"
  760. p364
  761. sS'MULTI_USER_MODE'
  762. p365
  763. g232
  764. sS'regex_tables'
  765. p366
  766. S'<_sre.SRE_Pattern object>'
  767. p367
  768. sS'COL'
  769. p368
  770. S"<class 'gluon.html.COL'>"
  771. p369
  772. sS'SCRIPT'
  773. p370
  774. S"<class 'gluon.html.SCRIPT'>"
  775. p371
  776. sS'have_mercurial'
  777. p372
  778. g182
  779. sS'is_mobile'
  780. p373
  781. g232
  782. sS'EXPIRATION'
  783. p374
  784. S'3600'
  785. p375
  786. sS'TEXT_EDITOR_KEYBINDING'
  787. p376
  788. S"''"
  789. p377
  790. sS'TABLE'
  791. p378
  792. S"<class 'gluon.html.TABLE'>"
  793. p379
  794. sS'recursive_unlink'
  795. p380
  796. S'<function recursive_unlink>'
  797. p381
  798. sS'IS_EXPR'
  799. p382
  800. S"<class 'gluon.validators.IS_EXPR'>"
  801. p383
  802. sS'IS_IPV4'
  803. p384
  804. S"<class 'gluon.validators.IS_IPV4'>"
  805. p385
  806. sS'IS_LENGTH'
  807. p386
  808. S"<class 'gluon.validators.IS_LENGTH'>"
  809. p387
  810. sS'IS_IPV6'
  811. p388
  812. S"<class 'gluon.validators.IS_IPV6'>"
  813. p389
  814. sS'XML'
  815. p390
  816. S"<class 'gluon.html.XML'>"
  817. p391
  818. sS'B'
  819. S"<class 'gluon.html.B'>"
  820. p392
  821. sS'IMG'
  822. p393
  823. S"<class 'gluon.html.IMG'>"
  824. p394
  825. sS'SQLTABLE'
  826. p395
  827. S"<class 'gluon.sqlhtml.SQLTABLE'>"
  828. p396
  829. sS'abspath'
  830. p397
  831. S'<function abspath>'
  832. p398
  833. sS'untar'
  834. p399
  835. S'<function untar>'
  836. p400
  837. sS'IS_ALPHANUMERIC'
  838. p401
  839. S"<class 'gluon.validators.IS_ALPHANUMERIC'>"
  840. p402
  841. sS'site'
  842. p403
  843. S"<module 'site' from '/usr/lib/python2.7/site.py'>"
  844. p404
  845. sS'hg'
  846. p405
  847. S"<module 'mercurial.hg' from '/usr/local/lib/python2.7/dist-packages/mercurial/hg.py'>"
  848. p406
  849. sS'socket'
  850. p407
  851. S"<module 'socket' from '/usr/lib/python2.7/socket.py'>"
  852. p408
  853. sS'app_pack_compiled'
  854. p409
  855. S'<function app_pack_compiled>'
  856. p410
  857. sS'SPAN'
  858. p411
  859. S"<class 'gluon.html.SPAN'>"
  860. p412
  861. sS'IS_JSON'
  862. p413
  863. S"<class 'gluon.validators.IS_JSON'>"
  864. p414
  865. sS'IS_IPADDRESS'
  866. p415
  867. S"<class 'gluon.validators.IS_IPADDRESS'>"
  868. p416
  869. sS'_c'
  870. p417
  871. S"'default'"
  872. p418
  873. sS'PLUGINS_APP'
  874. p419
  875. S"'http://web2py.com/plugins'"
  876. p420
  877. sS'up'
  878. p421
  879. S'<function up>'
  880. p422
  881. sS'CHECK_VERSION'
  882. p423
  883. g182
  884. sS'TD'
  885. p424
  886. S"<class 'gluon.html.TD'>"
  887. p425
  888. sS'BEAUTIFY'
  889. p426
  890. S"<class 'gluon.html.BEAUTIFY'>"
  891. p427
  892. sS'META'
  893. p428
  894. S"<class 'gluon.html.META'>"
  895. p429
  896. sS'md5_hash'
  897. p430
  898. S'<function md5_hash>'
  899. p431
  900. sS'read_file'
  901. p432
  902. S'<function read_file>'
  903. p433
  904. sS'update_all_languages'
  905. p434
  906. S'<function update_all_languages>'
  907. p435
  908. sS'TEXT_EDITOR'
  909. p436
  910. S"'codemirror'"
  911. p437
  912. sS'app_create'
  913. p438
  914. S'<function app_create>'
  915. p439
  916. sS'H1'
  917. p440
  918. S"<class 'gluon.html.H1'>"
  919. p441
  920. sS'IS_DATE'
  921. p442
  922. S"<class 'gluon.validators.IS_DATE'>"
  923. p443
  924. sS'IS_EMAIL'
  925. p444
  926. S"<class 'gluon.validators.IS_EMAIL'>"
  927. p445
  928. sS'tar'
  929. p446
  930. S'<function tar>'
  931. p447
  932. sS'IS_DECIMAL_IN_RANGE'
  933. p448
  934. S"<class 'gluon.validators.IS_DECIMAL_IN_RANGE'>"
  935. p449
  936. sS'IS_NOT_EMPTY'
  937. p450
  938. S"<class 'gluon.validators.IS_NOT_EMPTY'>"
  939. p451
  940. sS'IS_FLOAT_IN_RANGE'
  941. p452
  942. S"<class 'gluon.validators.IS_FLOAT_IN_RANGE'>"
  943. p453
  944. sS'w2p_pack'
  945. p454
  946. S'<function w2p_pack>'
  947. p455
  948. sS'TBODY'
  949. p456
  950. S"<class 'gluon.html.TBODY'>"
  951. p457
  952. sS'CAT'
  953. p458
  954. S"<class 'gluon.html.CAT'>"
  955. p459
  956. sS'Field'
  957. p460
  958. S"<class 'gluon.dal.Field'>"
  959. p461
  960. sS'unzip'
  961. p462
  962. S'<function unzip>'
  963. p463
  964. sS'H4'
  965. p464
  966. S"<class 'gluon.html.H4'>"
  967. p465
  968. sS'w2p_pack_plugin'
  969. p466
  970. S'<function w2p_pack_plugin>'
  971. p467
  972. sS'DIV'
  973. p468
  974. S"<class 'gluon.html.DIV'>"
  975. p469
  976. sS'shutil'
  977. p470
  978. S"<module 'shutil' from '/usr/lib/python2.7/shutil.py'>"
  979. p471
  980. sS'LEGEND'
  981. p472
  982. S"<class 'gluon.html.LEGEND'>"
  983. p473
  984. sS'app_install'
  985. p474
  986. S'<function app_install>'
  987. p475
  988. sS'COLGROUP'
  989. p476
  990. S"<class 'gluon.html.COLGROUP'>"
  991. p477
  992. sS'A_button'
  993. p478
  994. S'<function A_button>'
  995. p479
  996. sS'TT'
  997. p480
  998. S"<class 'gluon.html.TT'>"
  999. p481
  1000. sS'TR'
  1001. p482
  1002. S"<class 'gluon.html.TR'>"
  1003. p483
  1004. sS'FULL_SCREEN'
  1005. p484
  1006. S"'false'"
  1007. p485
  1008. sS'__package__'
  1009. p486
  1010. S'None'
  1011. p487
  1012. sS'listdir'
  1013. p488
  1014. S'<function listdir>'
  1015. p489
  1016. sS'URL'
  1017. p490
  1018. S'<function URL>'
  1019. p491
  1020. sS'IFRAME'
  1021. p492
  1022. S"<class 'gluon.html.IFRAME'>"
  1023. p493
  1024. sS'remove_compiled_application'
  1025. p494
  1026. S'<function remove_compiled_application>'
  1027. p495
  1028. sS'IS_URL'
  1029. p496
  1030. S"<class 'gluon.validators.IS_URL'>"
  1031. p497
  1032. sS'IS_MATCH'
  1033. p498
  1034. S"<class 'gluon.validators.IS_MATCH'>"
  1035. p499
  1036. sS'create_missing_app_folders'
  1037. p500
  1038. S'<function create_missing_app_folders>'
  1039. p501
  1040. sS'dedent'
  1041. p502
  1042. S'<function dedent>'
  1043. p503
  1044. sS'STYLE'
  1045. p504
  1046. S"<class 'gluon.html.STYLE'>"
  1047. p505
  1048. sS'IS_NULL_OR'
  1049. p506
  1050. S"<class 'gluon.validators.IS_EMPTY_OR'>"
  1051. p507
  1052. sS'IS_DATETIME_IN_RANGE'
  1053. p508
  1054. S"<class 'gluon.validators.IS_DATETIME_IN_RANGE'>"
  1055. p509
  1056. sS'FORM'
  1057. p510
  1058. S"<class 'gluon.html.FORM'>"
  1059. p511
  1060. sS'I'
  1061. S"<class 'gluon.html.I'>"
  1062. p512
  1063. sS'w2p_unpack_plugin'
  1064. p513
  1065. S'<function w2p_unpack_plugin>'
  1066. p514
  1067. sS'sys'
  1068. p515
  1069. S"<module 'sys' (built-in)>"
  1070. p516
  1071. sS'IS_NOT_IN_DB'
  1072. p517
  1073. S"<class 'gluon.validators.IS_NOT_IN_DB'>"
  1074. p518
  1075. sS'ALLOW_TOGGLE'
  1076. p519
  1077. S"'true'"
  1078. p520
  1079. sS'http_host'
  1080. p521
  1081. S"'mattspence.pythonanywhere.com'"
  1082. p522
  1083. sS'rmtree'
  1084. p523
  1085. S'<function rmtree>'
  1086. p524
  1087. sS'TEXT_EDITOR_THEME'
  1088. p525
  1089. S"'chrome'"
  1090. p526
  1091. sS'parse_version'
  1092. p527
  1093. S'<function parse_version>'
  1094. p528
  1095. sS'cleanpath'
  1096. p529
  1097. S'<function cleanpath>'
  1098. p530
  1099. sg112
  1100. S"<Storage {'body': <cStringIO.StringO object at 0...bda> at 0x14a7aa0>, 'view': 'default/site.html'}>"
  1101. p531
  1102. sS'THEAD'
  1103. p532
  1104. S"<class 'gluon.html.THEAD'>"
  1105. p533
  1106. sS'ANY_OF'
  1107. p534
  1108. S"<class 'gluon.validators.ANY_OF'>"
  1109. p535
  1110. sS'_config'
  1111. p536
  1112. 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'}"
  1113. p537
  1114. sS'fix_newlines'
  1115. p538
  1116. S'<function fix_newlines>'
  1117. p539
  1118. sS'__name__'
  1119. p540
  1120. S"'__restricted__'"
  1121. p541
  1122. sS'GAE_APPCFG'
  1123. p542
  1124. S"'/usr/local/bin/appcfg.py'"
  1125. p543
  1126. sg56
  1127. S"<Storage {'function': 'site', 'body': <cStringIO...applications/admin/', 'post_vars': <Storage {}>}>"
  1128. p544
  1129. sS'difflib'
  1130. p545
  1131. S"<module 'difflib' from '/usr/lib/python2.7/difflib.py'>"
  1132. p546
  1133. sS'EMAIL_SENDER'
  1134. p547
  1135. p548
  1136. sS'DAL'
  1137. p549
  1138. S"<class 'gluon.dal.DAL'>"
  1139. p550
  1140. sS'IS_IN_SET'
  1141. p551
  1142. S"<class 'gluon.validators.IS_IN_SET'>"
  1143. p552
  1144. sS'TWITTER_HASH'
  1145. p553
  1146. S"'web2py'"
  1147. p554
  1148. sS'IS_UPLOAD_FILENAME'
  1149. p555
  1150. S"<class 'gluon.validators.IS_UPLOAD_FILENAME'>"
  1151. p556
  1152. sS'time'
  1153. p557
  1154. S"<module 'time' (built-in)>"
  1155. p558
  1156. sS'app_uninstall'
  1157. p559
  1158. S'<function app_uninstall>'
  1159. p560
  1160. sS'regex_extend'
  1161. p561
  1162. S'<_sre.SRE_Pattern object>'
  1163. p562
  1164. sS're'
  1165. p563
  1166. S"<module 're' from '/usr/lib/python2.7/re.py'>"
  1167. p564
  1168. sS'TFOOT'
  1169. p565
  1170. S"<class 'gluon.html.TFOOT'>"
  1171. p566
  1172. sssg323
  1173. 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'
  1174. p567
  1175. s.(dp1
  1176. S'output'
  1177. p2
  1178. S"<type 'exceptions.ImportError'> cannot import name Config"
  1179. p3
  1180. sS'layer'
  1181. p4
  1182. S'/home/mattspence/web2py/applications/admin/controllers/default.py'
  1183. p5
  1184. sS'code'
  1185. p6
  1186. 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 += \'&nbsp;\'\n elif c == \' \\t\':\n z += \'&nbsp;\'\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(\'&nbsp;\')), 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'
  1187. p7
  1188. sS'snapshot'
  1189. p8
  1190. (dp9
  1191. S'exception'
  1192. p10
  1193. (dp11
  1194. S'__hash__'
  1195. p12
  1196. S"<method-wrapper '__hash__' of exceptions.ImportError object>"
  1197. p13
  1198. sS'__setattr__'
  1199. p14
  1200. S"<method-wrapper '__setattr__' of exceptions.ImportError object>"
  1201. p15
  1202. sS'__reduce_ex__'
  1203. p16
  1204. S'<built-in method __reduce_ex__ of exceptions.ImportError object>'
  1205. p17
  1206. sS'__getslice__'
  1207. p18
  1208. S"<method-wrapper '__getslice__' of exceptions.ImportError object>"
  1209. p19
  1210. sS'__getitem__'
  1211. p20
  1212. S"<method-wrapper '__getitem__' of exceptions.ImportError object>"
  1213. p21
  1214. sS'__setstate__'
  1215. p22
  1216. S'<built-in method __setstate__ of exceptions.ImportError object>'
  1217. p23
  1218. sS'args'
  1219. p24
  1220. S"('cannot import name Config',)"
  1221. p25
  1222. sS'__reduce__'
  1223. p26
  1224. S'<built-in method __reduce__ of exceptions.ImportError object>'
  1225. p27
  1226. sS'__str__'
  1227. p28
  1228. S"<method-wrapper '__str__' of exceptions.ImportError object>"
  1229. p29
  1230. sS'__format__'
  1231. p30
  1232. S'<built-in method __format__ of exceptions.ImportError object>'
  1233. p31
  1234. sS'__getattribute__'
  1235. p32
  1236. S"<method-wrapper '__getattribute__' of exceptions.ImportError object>"
  1237. p33
  1238. sS'__class__'
  1239. p34
  1240. S"<type 'exceptions.ImportError'>"
  1241. p35
  1242. sS'__unicode__'
  1243. p36
  1244. S'<built-in method __unicode__ of exceptions.ImportError object>'
  1245. p37
  1246. sS'__delattr__'
  1247. p38
  1248. S"<method-wrapper '__delattr__' of exceptions.ImportError object>"
  1249. p39
  1250. sS'__subclasshook__'
  1251. p40
  1252. S'<built-in method __subclasshook__ of type object>'
  1253. p41
  1254. sS'__repr__'
  1255. p42
  1256. S"<method-wrapper '__repr__' of exceptions.ImportError object>"
  1257. p43
  1258. sS'__dict__'
  1259. p44
  1260. S'{}'
  1261. p45
  1262. sS'__sizeof__'
  1263. p46
  1264. S'<built-in method __sizeof__ of exceptions.ImportError object>'
  1265. p47
  1266. sS'__doc__'
  1267. p48
  1268. S'"Import can\'t find module, or can\'t find name in module."'
  1269. p49
  1270. sS'__init__'
  1271. p50
  1272. S"<method-wrapper '__init__' of exceptions.ImportError object>"
  1273. p51
  1274. sS'__new__'
  1275. p52
  1276. S'<built-in method __new__ of type object>'
  1277. p53
  1278. ssS'evalue'
  1279. p54
  1280. S'cannot import name Config'
  1281. p55
  1282. sS'request'
  1283. p56
  1284. cgluon.html
  1285. XML_unpickle
  1286. p57
  1287. (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>&lt;cStringIO.StringO object at 0x2c51228&gt;</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([&#x27;/home/mattspence/web2py/applications/admin/&#x27;])</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>&lt;uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_file_wrapper</td><td valign="top">:</td><td><div>&lt;built-in function uwsgi_sendfile&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi_input</td><td valign="top">:</td><td><div>&lt;uwsgi._Input object at 0x7f6453906600&gt;</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([&#x27;/home/mattspence/web2py/applications/admin/&#x27;])</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>&lt;uwsgi_file__bin_user_wsgi_wrapper.ErrorLogWrapper object at 0x1e025d0&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.file_wrapper</td><td valign="top">:</td><td><div>&lt;built-in function uwsgi_sendfile&gt;</div></td></tr><tr><td style="font-weight:bold;vertical-align:top">wsgi.input</td><td valign="top">:</td><td><div>&lt;cStringIO.StringO object at 0x2c51228&gt;</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>'
  1288. tRp58
  1289. sS'frames'
  1290. p59
  1291. (lp60
  1292. (dp61
  1293. S'file'
  1294. p62
  1295. S'/home/mattspence/web2py/gluon/restricted.py'
  1296. p63
  1297. sS'dump'
  1298. p64
  1299. (dp65
  1300. S'environment'
  1301. p66
  1302. 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'>, ...}"
  1303. p67
  1304. sS'ccode'
  1305. p68
  1306. S'<code object <module> at 0x148f230, file "/home/...plications/admin/controllers/default.py", line 3>'
  1307. p69
  1308. ssS'lnum'
  1309. p70
  1310. I212
  1311. sS'lines'
  1312. p71
  1313. (dp72
  1314. I207
  1315. S' try:'
  1316. p73
  1317. sI208
  1318. S' if isinstance(code, types.CodeType):'
  1319. p74
  1320. sI209
  1321. S' ccode = code'
  1322. p75
  1323. sI210
  1324. S' else:'
  1325. p76
  1326. sI211
  1327. S' ccode = compile2(code, layer)'
  1328. p77
  1329. sI212
  1330. S' exec ccode in environment'
  1331. p78
  1332. sI213
  1333. S' except HTTP:'
  1334. p79
  1335. sI214
  1336. S' raise'
  1337. p80
  1338. sI215
  1339. S' except RestrictedError:'
  1340. p81
  1341. sI216
  1342. S' # do not encapsulate (obfuscate) the original RestrictedError'
  1343. p82
  1344. ssS'call'
  1345. p83
  1346. 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')"
  1347. p84
  1348. sS'func'
  1349. p85
  1350. S'restricted'
  1351. p86
  1352. sa(dp87
  1353. g62
  1354. S'/home/mattspence/web2py/applications/admin/controllers/default.py'
  1355. p88
  1356. sg64
  1357. (dp89
  1358. S'Config'
  1359. p90
  1360. S'undefined'
  1361. p91
  1362. sS'gluon'
  1363. p92
  1364. g91
  1365. ssg70
  1366. I14
  1367. sg71
  1368. (dp93
  1369. I9
  1370. S''
  1371. sI10
  1372. S'import re'
  1373. p94
  1374. sI11
  1375. S'from gluon.admin import *'
  1376. p95
  1377. sI12
  1378. S'from gluon.fileutils import abspath, read_file, write_file'
  1379. p96
  1380. sI13
  1381. S'from gluon.utils import web2py_uuid'
  1382. p97
  1383. sI14
  1384. S'from gluon.tools import Config'
  1385. p98
  1386. sI15
  1387. S'from glob import glob'
  1388. p99
  1389. sI16
  1390. S'import shutil'
  1391. p100
  1392. sI17
  1393. S'import platform'
  1394. p101
  1395. sI18
  1396. S''
  1397. ssg83
  1398. S'()'
  1399. p102
  1400. sg85
  1401. S'<module>'
  1402. p103
  1403. sasS'pyver'
  1404. p104
  1405. S'Python 2.7.4: /usr/local/bin/uwsgi (prefix: /usr)'
  1406. p105
  1407. sS'session'
  1408. p106
  1409. g57
  1410. (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>'
  1411. tRp107
  1412. sS'etype'
  1413. p108
  1414. S"<type 'exceptions.ImportError'>"
  1415. p109
  1416. sS'date'
  1417. p110
  1418. S'Sat Sep 14 23:44:12 2013'
  1419. p111
  1420. sS'response'
  1421. p112
  1422. g57
  1423. (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>&lt;cStringIO.StringO object at 0x2c4f068&gt;</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 &quot;[Errno 2] No such file or directory: &#x27;/home/mattspence/web2py/examples/README&#x27;&quot;</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>&lt;open file &#x27;/home/mattspence/web2py/applications/admin/sessions/108.18.133.177-a86214d4-1458-4c57-a610-bc0a2549a2c8&#x27;, mode &#x27;rb+&#x27; at 0x2bdadb0&gt;</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>'
  1424. tRp113
  1425. sS'locals'
  1426. p114
  1427. (dp115
  1428. S'IS_SLUG'
  1429. p116
  1430. S"<class 'gluon.validators.IS_SLUG'>"
  1431. p117
  1432. sS'OBJECT'
  1433. p118
  1434. S"<class 'gluon.html.OBJECT'>"
  1435. p119
  1436. sS'plugin_pack'
  1437. p120
  1438. S'<function plugin_pack>'
  1439. p121
  1440. sS'helpicon'
  1441. p122
  1442. S'<function helpicon>'
  1443. p123
  1444. sS'SQLDB'
  1445. p124
  1446. S"<class 'gluon.dal.DAL'>"
  1447. p125
  1448. sS'read_hosts_deny'
  1449. p126
  1450. S'<function read_hosts_deny>'
  1451. p127
  1452. sg106
  1453. S"<Storage {'_user_agent': {'is_mobile': False, 'i...ssion_hash': 'eac378321ffab41f2da22ca2e492be5c'}>"
  1454. p128
  1455. sS'LINK'
  1456. p129
  1457. S"<class 'gluon.html.LINK'>"
  1458. p130
  1459. sS'BR'
  1460. p131
  1461. S"<class 'gluon.html.BR'>"
  1462. p132
  1463. sS'local_import'
  1464. p133
  1465. S'<function <lambda>>'
  1466. p134
  1467. sS'EMBED'
  1468. p135
  1469. S"<class 'gluon.html.EMBED'>"
  1470. p136
  1471. sS'cmdutil'
  1472. p137
  1473. S"<module 'mercurial.cmdutil' from '/usr/local/lib/python2.7/dist-packages/mercurial/cmdutil.py'>"
  1474. p138
  1475. sS'compile2'
  1476. p139
  1477. S'<function compile2>'
  1478. p140
  1479. sS'redirect'
  1480. p141
  1481. S'<function redirect>'
  1482. p142
  1483. sS'IS_INT_IN_RANGE'
  1484. p143
  1485. S"<class 'gluon.validators.IS_INT_IN_RANGE'>"
  1486. p144
  1487. sS'upgrade'
  1488. p145
  1489. S'<function upgrade>'
  1490. p146
  1491. sS'IS_LOWER'
  1492. p147
  1493. S"<class 'gluon.validators.IS_LOWER'>"
  1494. p148
  1495. sS'IS_STRONG'
  1496. p149
  1497. S"<class 'gluon.validators.IS_STRONG'>"
  1498. p150
  1499. sS'write_hosts_deny'
  1500. p151
  1501. S'<function write_hosts_deny>'
  1502. p152
  1503. sS'cache'
  1504. p153
  1505. S'<gluon.cache.Cache object>'
  1506. p154
  1507. sS'addremove'
  1508. p155
  1509. S'<function addremove>'
  1510. p156
  1511. sS'IS_IN_DB'
  1512. p157
  1513. S"<class 'gluon.validators.IS_IN_DB'>"
  1514. p158
  1515. sS'TAG'
  1516. p159
  1517. S'<gluon.html.__TAG__ object>'
  1518. p160
  1519. sS'WEB2PY_VERSION_URL'
  1520. p161
  1521. S"'http://web2py.com/examples/default/version'"
  1522. p162
  1523. sS'app_pack'
  1524. p163
  1525. S'<function app_pack>'
  1526. p164
  1527. sS'SQLField'
  1528. p165
  1529. S"<class 'gluon.dal.Field'>"
  1530. p166
  1531. sS'_f'
  1532. p167
  1533. S"'site'"
  1534. p168
  1535. sS'app_cleanup'
  1536. p169
  1537. S'<function app_cleanup>'
  1538. p170
  1539. sS'_a'
  1540. p171
  1541. S"'admin'"
  1542. p172
  1543. sS'BODY'
  1544. p173
  1545. S"<class 'gluon.html.BODY'>"
  1546. p174
  1547. sS'IS_DATE_IN_RANGE'
  1548. p175
  1549. S"<class 'gluon.validators.IS_DATE_IN_RANGE'>"
  1550. p176
  1551. sS'button_enable'
  1552. p177
  1553. S'<function button_enable>'
  1554. p178
  1555. sS'TH'
  1556. p179
  1557. S"<class 'gluon.html.TH'>"
  1558. p180
  1559. sS'ON'
  1560. p181
  1561. S'True'
  1562. p182
  1563. sS'app_compile'
  1564. p183
  1565. S'<function app_compile>'
  1566. p184
  1567. sS'__file__'
  1568. p185
  1569. S"'/home/mattspence/web2py/applications/admin/controllers/default.py'"
  1570. p186
  1571. sS'zipfile'
  1572. p187
  1573. S"<module 'zipfile' from '/usr/lib/python2.7/zipfile.py'>"
  1574. p188
  1575. sS'stat'
  1576. p189
  1577. S"<module 'stat' from '/usr/lib/python2.7/stat.py'>"
  1578. p190
  1579. sS'P'
  1580. S"<class 'gluon.html.P'>"
  1581. p191
  1582. sS'T'
  1583. S'<gluon.languages.translator object>'
  1584. p192
  1585. sS'ui'
  1586. p193
  1587. S"<module 'mercurial.ui' from '/usr/local/lib/python2.7/dist-packages/mercurial/ui.py'>"
  1588. p194
  1589. sS'XHTML'
  1590. p195
  1591. S"<class 'gluon.html.XHTML'>"
  1592. p196
  1593. sS'EMAIL_SERVER'
  1594. p197
  1595. S"'localhost'"
  1596. p198
  1597. sS'add_path_first'
  1598. p199
  1599. S'<function add_path_first>'
  1600. p200
  1601. sS'regex_include'
  1602. p201
  1603. S'<_sre.SRE_Pattern object>'
  1604. p202
  1605. sS'TicketStorage'
  1606. p203
  1607. S"<class 'gluon.restricted.TicketStorage'>"
  1608. p204
  1609. sS'OL'
  1610. p205
  1611. S"<class 'gluon.html.OL'>"
  1612. p206
  1613. sS'TEXTAREA'
  1614. p207
  1615. S"<class 'gluon.html.TEXTAREA'>"
  1616. p208
  1617. sS'MENU'
  1618. p209
  1619. S"<class 'gluon.html.MENU'>"
  1620. p210
  1621. sS'button'
  1622. p211
  1623. S'<function button>'
  1624. p212
  1625. sS'EMAIL_LOGIN'
  1626. p213
  1627. S'None'
  1628. p214
  1629. sS't0'
  1630. p215
  1631. S'1379202252.335307'
  1632. p216
  1633. sS'check_new_version'
  1634. p217
  1635. S'<function check_new_version>'
  1636. p218
  1637. sS'IS_IMAGE'
  1638. p219
  1639. S"<class 'gluon.validators.IS_IMAGE'>"
  1640. p220
  1641. sS'WEB2PY_URL'
  1642. p221
  1643. S"'http://web2py.com'"
  1644. p222
  1645. sS'LOAD'
  1646. p223
  1647. S'<function LOAD>'
  1648. p224
  1649. sS'IS_EQUAL_TO'
  1650. p225
  1651. S"<class 'gluon.validators.IS_EQUAL_TO'>"
  1652. p226
  1653. sS'CODE'
  1654. p227
  1655. S"<class 'gluon.html.CODE'>"
  1656. p228
  1657. sS'HTTP'
  1658. p229
  1659. S"<class 'gluon.http.HTTP'>"
  1660. p230
  1661. sS'is_gae'
  1662. p231
  1663. S'False'
  1664. p232
  1665. sS'HR'
  1666. p233
  1667. S"<class 'gluon.html.HR'>"
  1668. p234
  1669. sS'IS_DATETIME'
  1670. p235
  1671. S"<class 'gluon.validators.IS_DATETIME'>"
  1672. p236
  1673. sS'login_record'
  1674. p237
  1675. S'<function login_record>'
  1676. p238
  1677. sS'expiration_failed_logins'
  1678. p239
  1679. S'3600'
  1680. p240
  1681. sS'LABEL'
  1682. p241
  1683. S"<class 'gluon.html.LABEL'>"
  1684. p242
  1685. sS'OPTGROUP'
  1686. p243
  1687. S"<class 'gluon.html.OPTGROUP'>"
  1688. p244
  1689. sS'REPLACE_TAB_BY_SPACES'
  1690. p245
  1691. S'4'
  1692. sS'A'
  1693. S"<class 'gluon.html.A'>"
  1694. p246
  1695. sS'LI'
  1696. p247
  1697. S"<class 'gluon.html.LI'>"
  1698. p248
  1699. sS'write_file'
  1700. p249
  1701. S'<function write_file>'
  1702. p250
  1703. sS'port'
  1704. p251
  1705. S'443'
  1706. p252
  1707. sS'SELECT'
  1708. p253
  1709. S"<class 'gluon.html.SELECT'>"
  1710. p254
  1711. sS'DEMO_MODE'
  1712. p255
  1713. g232
  1714. sS'sp_button'
  1715. p256
  1716. S'<function sp_button>'
  1717. p257
  1718. sS'LAYOUTS_APP'
  1719. p258
  1720. S"'http://web2py.com/layouts'"
  1721. p259
  1722. sS'STRONG'
  1723. p260
  1724. S"<class 'gluon.html.STRONG'>"
  1725. p261
  1726. sS'FONT_SIZE'
  1727. p262
  1728. S'10'
  1729. p263
  1730. sS'CENTER'
  1731. p264
  1732. S"<class 'gluon.html.CENTER'>"
  1733. p265
  1734. sS'allowed_number_of_attempts'
  1735. p266
  1736. S'5'
  1737. sg86
  1738. S'<function restricted>'
  1739. p267
  1740. sS'EXPERIMENTAL_STUFF'
  1741. p268
  1742. g182
  1743. sS'urllib'
  1744. p269
  1745. S"<module 'urllib' from '/usr/lib/python2.7/urllib.py'>"
  1746. p270
  1747. sS'DISPLAY'
  1748. p271
  1749. S"'onload'"
  1750. p272
  1751. sS'global_settings'
  1752. p273
  1753. S"<Storage {'debugging': False, 'is_pypy': False, ...': '2.5.1-stable+timestamp.2013.06.06.15.39.19'}>"
  1754. p274
  1755. sS'HTML'
  1756. p275
  1757. S"<class 'gluon.html.HTML'>"
  1758. p276
  1759. sS'SQLFORM'
  1760. p277
  1761. S"<class 'gluon.sqlhtml.SQLFORM'>"
  1762. p278
  1763. sS'deny_file'
  1764. p279
  1765. S"'/home/mattspence/web2py/applications/admin/private/hosts.deny'"
  1766. p280
  1767. sS'tar_compiled'
  1768. p281
  1769. S'<function tar_compiled>'
  1770. p282
  1771. sS'searchbox'
  1772. p283
  1773. S'<function searchbox>'
  1774. p284
  1775. sS'EM'
  1776. p285
  1777. S"<class 'gluon.html.EM'>"
  1778. p286
  1779. sS'PRE'
  1780. p287
  1781. S"<class 'gluon.html.PRE'>"
  1782. p288
  1783. sS'FIELDSET'
  1784. p289
  1785. S"<class 'gluon.html.FIELDSET'>"
  1786. p290
  1787. sS'create_missing_folders'
  1788. p291
  1789. S'<function create_missing_folders>'
  1790. p292
  1791. sS'__builtins__'
  1792. p293
  1793. 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'>, ...}"
  1794. p294
  1795. sS'FILTER_APPS'
  1796. p295
  1797. S'[]'
  1798. p296
  1799. sS'HEAD'
  1800. p297
  1801. S"<class 'gluon.html.HEAD'>"
  1802. p298
  1803. sS'embed64'
  1804. p299
  1805. S'<function embed64>'
  1806. p300
  1807. sS'IS_LIST_OF'
  1808. p301
  1809. S"<class 'gluon.validators.IS_LIST_OF'>"
  1810. p302
  1811. sS'apath'
  1812. p303
  1813. S'<function apath>'
  1814. p304
  1815. sS'findT'
  1816. p305
  1817. S'<function findT>'
  1818. p306
  1819. sS'plugin_install'
  1820. p307
  1821. S'<function plugin_install>'
  1822. p308
  1823. sS'cgi'
  1824. p309
  1825. S"<module 'cgi' from '/usr/lib/python2.7/cgi.py'>"
  1826. p310
  1827. sS'regex_expose'
  1828. p311
  1829. S'<_sre.SRE_Pattern object>'
  1830. p312
  1831. sS'CLEANUP'
  1832. p313
  1833. S"<class 'gluon.validators.CLEANUP'>"
  1834. p314
  1835. sS'verify_password'
  1836. p315
  1837. S'<function verify_password>'
  1838. p316
  1839. sS'H2'
  1840. p317
  1841. S"<class 'gluon.html.H2'>"
  1842. p318
  1843. sS'H3'
  1844. p319
  1845. S"<class 'gluon.html.H3'>"
  1846. p320
  1847. sS'BUTTON'
  1848. p321
  1849. S"<class 'gluon.html.BUTTON'>"
  1850. p322
  1851. sS'traceback'
  1852. p323
  1853. S"<module 'traceback' from '/usr/lib/python2.7/traceback.py'>"
  1854. p324
  1855. sS'H6'
  1856. p325
  1857. S"<class 'gluon.html.H6'>"
  1858. p326
  1859. sS'portalocker'
  1860. p327
  1861. S"<module 'gluon.portalocker' from '/home/mattspence/web2py/gluon/portalocker.pyc'>"
  1862. p328
  1863. sS'is_manager'
  1864. p329
  1865. S'<function is_manager>'
  1866. p330
  1867. sS'H5'
  1868. p331
  1869. S"<class 'gluon.html.H5'>"
  1870. p332
  1871. sS'UL'
  1872. p333
  1873. S"<class 'gluon.html.UL'>"
  1874. p334
  1875. sS'IS_UPPER'
  1876. p335
  1877. S"<class 'gluon.validators.IS_UPPER'>"
  1878. p336
  1879. sS'xmlescape'
  1880. p337
  1881. S'<function xmlescape>'
  1882. p338
  1883. sS'IS_TIME'
  1884. p339
  1885. S"<class 'gluon.validators.IS_TIME'>"
  1886. p340
  1887. sS'os'
  1888. p341
  1889. S"<module 'os' from '/usr/lib/python2.7/os.py'>"
  1890. p342
  1891. sS'compile_application'
  1892. p343
  1893. S'<function compile_application>'
  1894. p344
  1895. sS'RestrictedError'
  1896. p345
  1897. S"<class 'gluon.restricted.RestrictedError'>"
  1898. p346
  1899. sS'base64'
  1900. p347
  1901. S"<module 'base64' from '/usr/lib/python2.7/base64.py'>"
  1902. p348
  1903. sS'OPTION'
  1904. p349
  1905. S"<class 'gluon.html.OPTION'>"
  1906. p350
  1907. sS'TITLE'
  1908. p351
  1909. S"<class 'gluon.html.TITLE'>"
  1910. p352
  1911. sS'CRYPT'
  1912. p353
  1913. S"<class 'gluon.validators.CRYPT'>"
  1914. p354
  1915. sS'IS_EMPTY_OR'
  1916. p355
  1917. S"<class 'gluon.validators.IS_EMPTY_OR'>"
  1918. p356
  1919. sS'MARKMIN'
  1920. p357
  1921. S"<class 'gluon.html.MARKMIN'>"
  1922. p358
  1923. sS'w2p_unpack'
  1924. p359
  1925. S'<function w2p_unpack>'
  1926. p360
  1927. sS'web2py_uuid'
  1928. p361
  1929. S'<function web2py_uuid>'
  1930. p362
  1931. sS'INPUT'
  1932. p363
  1933. S"<class 'gluon.html.INPUT'>"
  1934. p364
  1935. sS'MULTI_USER_MODE'
  1936. p365
  1937. g232
  1938. sS'regex_tables'
  1939. p366
  1940. S'<_sre.SRE_Pattern object>'
  1941. p367
  1942. sS'COL'
  1943. p368
  1944. S"<class 'gluon.html.COL'>"
  1945. p369
  1946. sS'SCRIPT'
  1947. p370
  1948. S"<class 'gluon.html.SCRIPT'>"
  1949. p371
  1950. sS'have_mercurial'
  1951. p372
  1952. g182
  1953. sS'is_mobile'
  1954. p373
  1955. g232
  1956. sS'EXPIRATION'
  1957. p374
  1958. S'3600'
  1959. p375
  1960. sS'TEXT_EDITOR_KEYBINDING'
  1961. p376
  1962. S"''"
  1963. p377
  1964. sS'TABLE'
  1965. p378
  1966. S"<class 'gluon.html.TABLE'>"
  1967. p379
  1968. sS'recursive_unlink'
  1969. p380
  1970. S'<function recursive_unlink>'
  1971. p381
  1972. sS'IS_EXPR'
  1973. p382
  1974. S"<class 'gluon.validators.IS_EXPR'>"
  1975. p383
  1976. sS'IS_IPV4'
  1977. p384
  1978. S"<class 'gluon.validators.IS_IPV4'>"
  1979. p385
  1980. sS'IS_LENGTH'
  1981. p386
  1982. S"<class 'gluon.validators.IS_LENGTH'>"
  1983. p387
  1984. sS'IS_IPV6'
  1985. p388
  1986. S"<class 'gluon.validators.IS_IPV6'>"
  1987. p389
  1988. sS'XML'
  1989. p390
  1990. S"<class 'gluon.html.XML'>"
  1991. p391
  1992. sS'B'
  1993. S"<class 'gluon.html.B'>"
  1994. p392
  1995. sS'IMG'
  1996. p393
  1997. S"<class 'gluon.html.IMG'>"
  1998. p394
  1999. sS'SQLTABLE'
  2000. p395
  2001. S"<class 'gluon.sqlhtml.SQLTABLE'>"
  2002. p396
  2003. sS'abspath'
  2004. p397
  2005. S'<function abspath>'
  2006. p398
  2007. sS'untar'
  2008. p399
  2009. S'<function untar>'
  2010. p400
  2011. sS'IS_ALPHANUMERIC'
  2012. p401
  2013. S"<class 'gluon.validators.IS_ALPHANUMERIC'>"
  2014. p402
  2015. sS'site'
  2016. p403
  2017. S"<module 'site' from '/usr/lib/python2.7/site.py'>"
  2018. p404
  2019. sS'hg'
  2020. p405
  2021. S"<module 'mercurial.hg' from '/usr/local/lib/python2.7/dist-packages/mercurial/hg.py'>"
  2022. p406
  2023. sS'socket'
  2024. p407
  2025. S"<module 'socket' from '/usr/lib/python2.7/socket.py'>"
  2026. p408
  2027. sS'app_pack_compiled'
  2028. p409
  2029. S'<function app_pack_compiled>'
  2030. p410
  2031. sS'SPAN'
  2032. p411
  2033. S"<class 'gluon.html.SPAN'>"
  2034. p412
  2035. sS'IS_JSON'
  2036. p413
  2037. S"<class 'gluon.validators.IS_JSON'>"
  2038. p414
  2039. sS'IS_IPADDRESS'
  2040. p415
  2041. S"<class 'gluon.validators.IS_IPADDRESS'>"
  2042. p416
  2043. sS'_c'
  2044. p417
  2045. S"'default'"
  2046. p418
  2047. sS'PLUGINS_APP'
  2048. p419
  2049. S"'http://web2py.com/plugins'"
  2050. p420
  2051. sS'up'
  2052. p421
  2053. S'<function up>'
  2054. p422
  2055. sS'CHECK_VERSION'
  2056. p423
  2057. g182
  2058. sS'TD'
  2059. p424
  2060. S"<class 'gluon.html.TD'>"
  2061. p425
  2062. sS'BEAUTIFY'
  2063. p426
  2064. S"<class 'gluon.html.BEAUTIFY'>"
  2065. p427
  2066. sS'META'
  2067. p428
  2068. S"<class 'gluon.html.META'>"
  2069. p429
  2070. sS'md5_hash'
  2071. p430
  2072. S'<function md5_hash>'
  2073. p431
  2074. sS'read_file'
  2075. p432
  2076. S'<function read_file>'
  2077. p433
  2078. sS'update_all_languages'
  2079. p434
  2080. S'<function update_all_languages>'
  2081. p435
  2082. sS'TEXT_EDITOR'
  2083. p436
  2084. S"'codemirror'"
  2085. p437
  2086. sS'app_create'
  2087. p438
  2088. S'<function app_create>'
  2089. p439
  2090. sS'H1'
  2091. p440
  2092. S"<class 'gluon.html.H1'>"
  2093. p441
  2094. sS'IS_DATE'
  2095. p442
  2096. S"<class 'gluon.validators.IS_DATE'>"
  2097. p443
  2098. sS'IS_EMAIL'
  2099. p444
  2100. S"<class 'gluon.validators.IS_EMAIL'>"
  2101. p445
  2102. sS'tar'
  2103. p446
  2104. S'<function tar>'
  2105. p447
  2106. sS'IS_DECIMAL_IN_RANGE'
  2107. p448
  2108. S"<class 'gluon.validators.IS_DECIMAL_IN_RANGE'>"
  2109. p449
  2110. sS'IS_NOT_EMPTY'
  2111. p450
  2112. S"<class 'gluon.validators.IS_NOT_EMPTY'>"
  2113. p451
  2114. sS'IS_FLOAT_IN_RANGE'
  2115. p452
  2116. S"<class 'gluon.validators.IS_FLOAT_IN_RANGE'>"
  2117. p453
  2118. sS'w2p_pack'
  2119. p454
  2120. S'<function w2p_pack>'
  2121. p455
  2122. sS'TBODY'
  2123. p456
  2124. S"<class 'gluon.html.TBODY'>"
  2125. p457
  2126. sS'CAT'
  2127. p458
  2128. S"<class 'gluon.html.CAT'>"
  2129. p459
  2130. sS'Field'
  2131. p460
  2132. S"<class 'gluon.dal.Field'>"
  2133. p461
  2134. sS'unzip'
  2135. p462
  2136. S'<function unzip>'
  2137. p463
  2138. sS'H4'
  2139. p464
  2140. S"<class 'gluon.html.H4'>"
  2141. p465
  2142. sS'w2p_pack_plugin'
  2143. p466
  2144. S'<function w2p_pack_plugin>'
  2145. p467
  2146. sS'DIV'
  2147. p468
  2148. S"<class 'gluon.html.DIV'>"
  2149. p469
  2150. sS'shutil'
  2151. p470
  2152. S"<module 'shutil' from '/usr/lib/python2.7/shutil.py'>"
  2153. p471
  2154. sS'LEGEND'
  2155. p472
  2156. S"<class 'gluon.html.LEGEND'>"
  2157. p473
  2158. sS'app_install'
  2159. p474
  2160. S'<function app_install>'
  2161. p475
  2162. sS'COLGROUP'
  2163. p476
  2164. S"<class 'gluon.html.COLGROUP'>"
  2165. p477
  2166. sS'A_button'
  2167. p478
  2168. S'<function A_button>'
  2169. p479
  2170. sS'TT'
  2171. p480
  2172. S"<class 'gluon.html.TT'>"
  2173. p481
  2174. sS'TR'
  2175. p482
  2176. S"<class 'gluon.html.TR'>"
  2177. p483
  2178. sS'FULL_SCREEN'
  2179. p484
  2180. S"'false'"
  2181. p485
  2182. sS'__package__'
  2183. p486
  2184. S'None'
  2185. p487
  2186. sS'listdir'
  2187. p488
  2188. S'<function listdir>'
  2189. p489
  2190. sS'URL'
  2191. p490
  2192. S'<function URL>'
  2193. p491
  2194. sS'IFRAME'
  2195. p492
  2196. S"<class 'gluon.html.IFRAME'>"
  2197. p493
  2198. sS'remove_compiled_application'
  2199. p494
  2200. S'<function remove_compiled_application>'
  2201. p495
  2202. sS'IS_URL'
  2203. p496
  2204. S"<class 'gluon.validators.IS_URL'>"
  2205. p497
  2206. sS'IS_MATCH'
  2207. p498
  2208. S"<class 'gluon.validators.IS_MATCH'>"
  2209. p499
  2210. sS'create_missing_app_folders'
  2211. p500
  2212. S'<function create_missing_app_folders>'
  2213. p501
  2214. sS'dedent'
  2215. p502
  2216. S'<function dedent>'
  2217. p503
  2218. sS'STYLE'
  2219. p504
  2220. S"<class 'gluon.html.STYLE'>"
  2221. p505
  2222. sS'IS_NULL_OR'
  2223. p506
  2224. S"<class 'gluon.validators.IS_EMPTY_OR'>"
  2225. p507
  2226. sS'IS_DATETIME_IN_RANGE'
  2227. p508
  2228. S"<class 'gluon.validators.IS_DATETIME_IN_RANGE'>"
  2229. p509
  2230. sS'FORM'
  2231. p510
  2232. S"<class 'gluon.html.FORM'>"
  2233. p511
  2234. sS'I'
  2235. S"<class 'gluon.html.I'>"
  2236. p512
  2237. sS'w2p_unpack_plugin'
  2238. p513
  2239. S'<function w2p_unpack_plugin>'
  2240. p514
  2241. sS'sys'
  2242. p515
  2243. S"<module 'sys' (built-in)>"
  2244. p516
  2245. sS'IS_NOT_IN_DB'
  2246. p517
  2247. S"<class 'gluon.validators.IS_NOT_IN_DB'>"
  2248. p518
  2249. sS'ALLOW_TOGGLE'
  2250. p519
  2251. S"'true'"
  2252. p520
  2253. sS'http_host'
  2254. p521
  2255. S"'mattspence.pythonanywhere.com'"
  2256. p522
  2257. sS'rmtree'
  2258. p523
  2259. S'<function rmtree>'
  2260. p524
  2261. sS'TEXT_EDITOR_THEME'
  2262. p525
  2263. S"'chrome'"
  2264. p526
  2265. sS'parse_version'
  2266. p527
  2267. S'<function parse_version>'
  2268. p528
  2269. sS'cleanpath'
  2270. p529
  2271. S'<function cleanpath>'
  2272. p530
  2273. sg112
  2274. S"<Storage {'body': <cStringIO.StringO object at 0...bda> at 0x14a7aa0>, 'view': 'default/site.html'}>"
  2275. p531
  2276. sS'THEAD'
  2277. p532
  2278. S"<class 'gluon.html.THEAD'>"
  2279. p533
  2280. sS'ANY_OF'
  2281. p534
  2282. S"<class 'gluon.validators.ANY_OF'>"
  2283. p535
  2284. sS'_config'
  2285. p536
  2286. 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'}"
  2287. p537
  2288. sS'fix_newlines'
  2289. p538
  2290. S'<function fix_newlines>'
  2291. p539
  2292. sS'__name__'
  2293. p540
  2294. S"'__restricted__'"
  2295. p541
  2296. sS'GAE_APPCFG'
  2297. p542
  2298. S"'/usr/local/bin/appcfg.py'"
  2299. p543
  2300. sg56
  2301. S"<Storage {'function': 'site', 'body': <cStringIO...applications/admin/', 'post_vars': <Storage {}>}>"
  2302. p544
  2303. sS'difflib'
  2304. p545
  2305. S"<module 'difflib' from '/usr/lib/python2.7/difflib.py'>"
  2306. p546
  2307. sS'EMAIL_SENDER'
  2308. p547
  2309. p548
  2310. sS'DAL'
  2311. p549
  2312. S"<class 'gluon.dal.DAL'>"
  2313. p550
  2314. sS'IS_IN_SET'
  2315. p551
  2316. S"<class 'gluon.validators.IS_IN_SET'>"
  2317. p552
  2318. sS'TWITTER_HASH'
  2319. p553
  2320. S"'web2py'"
  2321. p554
  2322. sS'IS_UPLOAD_FILENAME'
  2323. p555
  2324. S"<class 'gluon.validators.IS_UPLOAD_FILENAME'>"
  2325. p556
  2326. sS'time'
  2327. p557
  2328. S"<module 'time' (built-in)>"
  2329. p558
  2330. sS'app_uninstall'
  2331. p559
  2332. S'<function app_uninstall>'
  2333. p560
  2334. sS'regex_extend'
  2335. p561
  2336. S'<_sre.SRE_Pattern object>'
  2337. p562
  2338. sS're'
  2339. p563
  2340. S"<module 're' from '/usr/lib/python2.7/re.py'>"
  2341. p564
  2342. sS'TFOOT'
  2343. p565
  2344. S"<class 'gluon.html.TFOOT'>"
  2345. p566
  2346. sssg323
  2347. 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'
  2348. p567
  2349. s.
Add Comment
Please, Sign In to add comment