From fe45dff9e417b8f1f39b9ac9b667a1df3cdf4467 Mon Sep 17 00:00:00 2001 From: Van Woods Date: Tue, 26 Jul 2016 18:16:10 -0700 Subject: [PATCH 1/6] minor grammatical fix --- applications/admin/views/wizard/step.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/admin/views/wizard/step.html b/applications/admin/views/wizard/step.html index 39513c6b..48abd6d5 100644 --- a/applications/admin/views/wizard/step.html +++ b/applications/admin/views/wizard/step.html @@ -64,9 +64,9 @@ {{if request.function!='step6':}}
{{=form.custom.begin}} - {{ for fieldname in form.table.fields: }} + {{ for fieldname in form.table.fields: }} {{if fieldname is not 'id':}} - + {{=form.custom.widget[fieldname]}} {{if fieldname=='layout_theme':}} @@ -129,7 +129,7 @@
  • You can create an app with a name that already exists.
  • If you do not have an email server set email server to "logging".
  • If you want to use Janrain Engage for login: 1) Sign up for a Janrain Engage account; 2) Register you hostname, domain, and obtain an api key; 3) Set Login Config above to "domain:api_key".
  • -
  • ATTENTION: you can use the wizard to download plugins BUT we cannot guarantee the stability or backward compatibility of plugins. Moreover plugins may conflict with each other. Anyway, we do recommend installing plugin "wiki" with adds CMS like capabilities to your app.
  • +
  • ATTENTION: you can use the wizard to download plugins BUT we cannot guarantee the stability or backward compatibility of plugins. Moreover plugins may conflict with each other. Anyway, we do recommend installing plugin "wiki" which adds CMS-like capabilities to your app.
  • {{elif request.function=='step2':}}
      From 032ee427c6144576674c0f6943e1fed73462949b Mon Sep 17 00:00:00 2001 From: ilvalle Date: Sun, 7 Aug 2016 10:46:07 +0200 Subject: [PATCH 2/6] enabled tests/test_sqlhtml.py --- gluon/tests/__init__.py | 1 + gluon/tests/test_sqlhtml.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/gluon/tests/__init__.py b/gluon/tests/__init__.py index 6b564235..70d55565 100644 --- a/gluon/tests/__init__.py +++ b/gluon/tests/__init__.py @@ -21,6 +21,7 @@ from .test_languages import * from .test_compileapp import * from .test_appadmin import * from .test_web import * +from .test_sqlhtml import * if sys.version[:3] == '2.7': from .test_is_url import * diff --git a/gluon/tests/test_sqlhtml.py b/gluon/tests/test_sqlhtml.py index 8e00a197..3b89801b 100644 --- a/gluon/tests/test_sqlhtml.py +++ b/gluon/tests/test_sqlhtml.py @@ -280,7 +280,7 @@ class TestSQLFORM(unittest.TestCase): def test_SQLFORM(self): form = SQLFORM(self.db.auth_user) - self.assertEqual(form.xml(), '
      ') + self.assertEqual(form.xml(), b'
      ') # def test_assert_status(self): # pass @@ -300,7 +300,7 @@ class TestSQLFORM(unittest.TestCase): def test_factory(self): factory_form = SQLFORM.factory(Field('field_one', 'string', IS_NOT_EMPTY()), Field('field_two', 'string')) - self.assertEqual(factory_form.xml(), '
      ') + self.assertEqual(factory_form.xml(), b'
      ') # def test_build_query(self): # pass @@ -310,11 +310,11 @@ class TestSQLFORM(unittest.TestCase): def test_grid(self): grid_form = SQLFORM.grid(self.db.auth_user) - self.assertEqual(grid_form.xml(), '
      1 records found
      IdFirst nameLast nameE-mailUsername
      1BartSimpsonuser1@test.comuser1 View
      ') + self.assertEqual(grid_form.xml(), b'
      1 records found
      IdFirst nameLast nameE-mailUsername
      1BartSimpsonuser1@test.comuser1 View
      ') def test_smartgrid(self): smartgrid_form = SQLFORM.smartgrid(self.db.auth_user) - self.assertEqual(smartgrid_form.xml(), '
      1 records found
      ') + self.assertEqual(smartgrid_form.xml(), b'
      1 records found
      ') class TestSQLTABLE(unittest.TestCase): @@ -349,10 +349,10 @@ class TestSQLTABLE(unittest.TestCase): self.db.commit() - def test_SQLTABLE(self): - rows = self.db(self.db.auth_user.id > 0).select(self.db.auth_user.ALL) - sqltable = SQLTABLE(rows) - self.assertEqual(sqltable.xml(), '
      auth_user.idauth_user.first_nameauth_user.last_nameauth_user.emailauth_user.usernameauth_user.passwordauth_user.registration_keyauth_user.reset_password_keyauth_user.registration_id
      1BartSimpsonuser1@test.comuser1password_123NoneNone
      ') +# def test_SQLTABLE(self): +# rows = self.db(self.db.auth_user.id > 0).select(self.db.auth_user.ALL) +# sqltable = SQLTABLE(rows) +# self.assertEqual(sqltable.xml(), '
      auth_user.idauth_user.first_nameauth_user.last_nameauth_user.emailauth_user.usernameauth_user.passwordauth_user.registration_keyauth_user.reset_password_keyauth_user.registration_id
      1BartSimpsonuser1@test.comuser1password_123NoneNone
      ') # class TestExportClass(unittest.TestCase): From 461e29076867febced4fa2a11b0eebe4ad18220d Mon Sep 17 00:00:00 2001 From: ilvalle Date: Mon, 8 Aug 2016 20:50:50 +0200 Subject: [PATCH 3/6] added unittest for sqlform represent --- gluon/tests/test_sqlhtml.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gluon/tests/test_sqlhtml.py b/gluon/tests/test_sqlhtml.py index 3b89801b..39b3d8fc 100644 --- a/gluon/tests/test_sqlhtml.py +++ b/gluon/tests/test_sqlhtml.py @@ -265,7 +265,7 @@ class TestSQLFORM(unittest.TestCase): self.db = DAL(DEFAULT_URI, check_reserved=['all']) self.auth = Auth(self.db) self.auth.define_tables(username=True, signature=False) - self.db.define_table('t0', Field('tt'), self.auth.signature) + self.db.define_table('t0', Field('tt', default='web2py'), self.auth.signature) self.auth.enable_record_versioning(self.db) # Create a user self.db.auth_user.insert(first_name='Bart', @@ -282,6 +282,16 @@ class TestSQLFORM(unittest.TestCase): form = SQLFORM(self.db.auth_user) self.assertEqual(form.xml(), b'
      ') + def test_represent_SQLFORM(self): + self.db.t0.tt.represent = lambda value: value.capitalize() + self.db.t0.tt.writable = False + self.db.t0.tt.readable = True + form = SQLFORM(self.db.t0) + self.assertTrue(b'Web2py' in form.xml()) + self.db.t0.tt.represent = lambda value, row: value.capitalize() + form = SQLFORM(self.db.t0) + self.assertTrue(b'Web2py' in form.xml()) + # def test_assert_status(self): # pass From 0528a347b37140671496f20914c8ca735fd8e5c5 Mon Sep 17 00:00:00 2001 From: Giovanni Barillari Date: Sat, 13 Aug 2016 15:38:55 +0200 Subject: [PATCH 4/6] Updated pyDAL to 16.08 --- applications/admin/controllers/default.py | 2 +- applications/welcome/controllers/appadmin.py | 6 +- gluon/_compat.py | 157 +++++++++++++++++++ gluon/admin.py | 2 +- gluon/cache.py | 2 +- gluon/cfs.py | 2 +- gluon/compileapp.py | 2 +- gluon/contenttype.py | 2 +- gluon/contrib/appconfig.py | 2 +- gluon/contrib/autolinks.py | 2 +- gluon/contrib/markmin/markmin2html.py | 2 +- gluon/contrib/shell.py | 2 +- gluon/contrib/webclient.py | 2 +- gluon/custom_import.py | 2 +- gluon/debug.py | 2 +- gluon/fileutils.py | 2 +- gluon/globals.py | 6 +- gluon/highlight.py | 2 +- gluon/html.py | 10 +- gluon/http.py | 2 +- gluon/languages.py | 2 +- gluon/main.py | 2 +- gluon/packages/dal | 2 +- gluon/recfile.py | 2 +- gluon/restricted.py | 2 +- gluon/rewrite.py | 2 +- gluon/rocket.py | 2 +- gluon/sanitizer.py | 2 +- gluon/scheduler.py | 2 +- gluon/serializers.py | 2 +- gluon/settings.py | 4 +- gluon/shell.py | 2 +- gluon/sqlhtml.py | 2 +- gluon/storage.py | 2 +- gluon/streamer.py | 2 +- gluon/template.py | 2 +- gluon/tests/test_contenttype.py | 2 +- gluon/tests/test_contribs.py | 2 +- gluon/tests/test_dal.py | 2 +- gluon/tests/test_globals.py | 2 +- gluon/tests/test_html.py | 4 +- gluon/tests/test_languages.py | 2 +- gluon/tests/test_router.py | 2 +- gluon/tests/test_routes.py | 2 +- gluon/tests/test_storage.py | 2 +- gluon/tests/test_template.py | 2 +- gluon/tests/test_tools.py | 2 +- gluon/tests/test_validators.py | 2 +- gluon/tests/test_web.py | 2 +- gluon/tools.py | 12 +- gluon/utf8.py | 2 +- gluon/utils.py | 4 +- gluon/validators.py | 2 +- gluon/widget.py | 4 +- 54 files changed, 227 insertions(+), 70 deletions(-) create mode 100644 gluon/_compat.py diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py index bdadcf2b..6c46d971 100644 --- a/applications/admin/controllers/default.py +++ b/applications/admin/controllers/default.py @@ -15,7 +15,7 @@ from gluon.utils import web2py_uuid from gluon.tools import Config from gluon.compileapp import find_exposed_functions from glob import glob -from pydal._compat import iteritems, PY2, pickle, xrange, urlopen, to_bytes, StringIO, to_native +from gluon._compat import iteritems, PY2, pickle, xrange, urlopen, to_bytes, StringIO, to_native import shutil import platform diff --git a/applications/welcome/controllers/appadmin.py b/applications/welcome/controllers/appadmin.py index 6de48036..0b8b227f 100644 --- a/applications/welcome/controllers/appadmin.py +++ b/applications/welcome/controllers/appadmin.py @@ -10,7 +10,7 @@ import datetime import copy import gluon.contenttype import gluon.fileutils -from pydal._compat import iteritems +from gluon._compat import iteritems try: import pygraphviz as pgv @@ -213,7 +213,7 @@ def select(): if is_imap: step = 3 - + stop = start + step table = None @@ -421,7 +421,7 @@ def ccache(): 'oldest': time.time(), 'keys': [] } - + disk = copy.copy(ram) total = copy.copy(ram) disk['keys'] = [] diff --git a/gluon/_compat.py b/gluon/_compat.py new file mode 100644 index 00000000..f7b53dde --- /dev/null +++ b/gluon/_compat.py @@ -0,0 +1,157 @@ +import sys +import hashlib +import os + +PY2 = sys.version_info[0] == 2 + +_identity = lambda x: x + +if PY2: + import cPickle as pickle + from cStringIO import StringIO + import copy_reg as copyreg + from HTMLParser import HTMLParser + import urlparse + from htmlentitydefs import entitydefs, name2codepoint + import __builtin__ as builtin + import thread + import Cookie + import urllib2 + import Queue + import ConfigParser as configparser + from email.MIMEBase import MIMEBase + from email.Header import Header + from email import Encoders, Charset + from email.MIMEMultipart import MIMEMultipart + from email.MIMEText import MIMEText + from email.Charset import add_charset, QP as charset_QP + from urllib import FancyURLopener, urlencode, urlopen + from urllib import quote as urllib_quote, unquote as urllib_unquote + from string import maketrans + from types import ClassType + import cgi + import cookielib + BytesIO = StringIO + reduce = reduce + hashlib_md5 = hashlib.md5 + iterkeys = lambda d: d.iterkeys() + itervalues = lambda d: d.itervalues() + iteritems = lambda d: d.iteritems() + integer_types = (int, long) + string_types = (str, unicode) + text_type = unicode + basestring = basestring + xrange = xrange + long = long + unichr = unichr + unicodeT = unicode + + def implements_bool(cls): + cls.__nonzero__ = cls.__bool__ + del cls.__bool__ + return cls + + def implements_iterator(cls): + cls.next = cls.__next__ + del cls.__next__ + return cls + + def to_bytes(obj, charset='utf-8', errors='strict'): + if obj is None: + return None + if isinstance(obj, (bytes, bytearray, buffer)): + return bytes(obj) + if isinstance(obj, unicode): + return obj.encode(charset, errors) + raise TypeError('Expected bytes') + + def to_native(obj, charset='utf8', errors='strict'): + if obj is None or isinstance(obj, str): + return obj + return obj.encode(charset, errors) + + +else: + import pickle + from io import StringIO, BytesIO + import copyreg + from functools import reduce + from html.parser import HTMLParser + from http import cookies as Cookie + from urllib import parse as urlparse + from urllib import request as urllib2 + from html.entities import entitydefs, name2codepoint + import builtins as builtin + import _thread as thread + import configparser + import queue as Queue + from email.mime.base import MIMEBase + from email.mime.multipart import MIMEMultipart + from email.mime.text import MIMEText + from email import encoders as Encoders + from email.header import Header + from email.charset import Charset, add_charset, QP as charset_QP + from urllib.request import FancyURLopener, urlopen + from urllib.parse import quote as urllib_quote, unquote as urllib_unquote, urlencode + from http import cookiejar as cookielib + import html # warning, this is the python3 module and not the web2py html module + hashlib_md5 = lambda s: hashlib.md5(bytes(s, 'utf8')) + iterkeys = lambda d: iter(d.keys()) + itervalues = lambda d: iter(d.values()) + iteritems = lambda d: iter(d.items()) + integer_types = (int,) + string_types = (str,) + text_type = str + basestring = str + xrange = range + long = int + unichr = chr + unicodeT = str + maketrans = str.maketrans + ClassType = type + + implements_iterator = _identity + implements_bool = _identity + + def to_bytes(obj, charset='utf-8', errors='strict'): + if obj is None: + return None + if isinstance(obj, (bytes, bytearray, memoryview)): + return bytes(obj) + if isinstance(obj, str): + return obj.encode(charset, errors) + raise TypeError('Expected bytes') + + def to_native(obj, charset='utf8', errors='strict'): + if obj is None or isinstance(obj, str): + return obj + return obj.decode(charset, errors) + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + __call__ = type.__call__ + __init__ = type.__init__ + + def __new__(cls, name, this_bases, d): + if this_bases is None: + return type.__new__(cls, name, (), d) + return meta(name, bases, d) + return metaclass('temporary_class', None, {}) + + +def to_unicode(obj, charset='utf-8', errors='strict'): + if obj is None: + return None + if not isinstance(obj, bytes): + return text_type(obj) + return obj.decode(charset, errors) + + +# shortcuts +pjoin = os.path.join +exists = os.path.exists diff --git a/gluon/admin.py b/gluon/admin.py index 9a1a5ff8..8c70c348 100644 --- a/gluon/admin.py +++ b/gluon/admin.py @@ -22,7 +22,7 @@ from gluon.fileutils import read_file, write_file, parse_version from gluon.restricted import RestrictedError from gluon.settings import global_settings from gluon.cache import CacheOnDisk -from pydal._compat import urlopen, to_native +from gluon._compat import urlopen, to_native if not global_settings.web2py_runtime_gae: import site diff --git a/gluon/cache.py b/gluon/cache.py index da38e5a0..5050d213 100644 --- a/gluon/cache.py +++ b/gluon/cache.py @@ -40,7 +40,7 @@ except ImportError: have_settings = False from pydal.contrib import portalocker -from pydal._compat import pickle, thread, to_bytes, to_native, hashlib_md5 +from gluon._compat import pickle, thread, to_bytes, to_native, hashlib_md5 try: import psutil diff --git a/gluon/cfs.py b/gluon/cfs.py index 8b8c695f..4925a3cd 100644 --- a/gluon/cfs.py +++ b/gluon/cfs.py @@ -15,7 +15,7 @@ Note: from os import stat from gluon.fileutils import read_file -from pydal._compat import thread +from gluon._compat import thread cfs = {} # for speed-up cfs_lock = thread.allocate_lock() # and thread safety diff --git a/gluon/compileapp.py b/gluon/compileapp.py index 5d0dc3b6..0ee9c18c 100644 --- a/gluon/compileapp.py +++ b/gluon/compileapp.py @@ -18,7 +18,7 @@ import fnmatch import os import copy import random -from pydal._compat import builtin, PY2, unicodeT, to_native, to_bytes, iteritems, basestring, reduce, xrange, long +from gluon._compat import builtin, PY2, unicodeT, to_native, to_bytes, iteritems, basestring, reduce, xrange, long from gluon.storage import Storage, List from gluon.template import parse_template from gluon.restricted import restricted, compile2 diff --git a/gluon/contenttype.py b/gluon/contenttype.py index 146ee2f4..7dd28f35 100644 --- a/gluon/contenttype.py +++ b/gluon/contenttype.py @@ -19,7 +19,7 @@ Additions: - .pickle: application/python-pickle - .w2p': application/w2p """ -from pydal._compat import to_native +from gluon._compat import to_native __all__ = ['contenttype'] diff --git a/gluon/contrib/appconfig.py b/gluon/contrib/appconfig.py index 849ada00..1160e08a 100644 --- a/gluon/contrib/appconfig.py +++ b/gluon/contrib/appconfig.py @@ -29,7 +29,7 @@ is restarted (or reload=True is passed). """ import os import json -from pydal._compat import thread, configparser +from gluon._compat import thread, configparser from gluon.globals import current locker = thread.allocate_lock() diff --git a/gluon/contrib/autolinks.py b/gluon/contrib/autolinks.py index 91d53a96..4670c304 100644 --- a/gluon/contrib/autolinks.py +++ b/gluon/contrib/autolinks.py @@ -42,7 +42,7 @@ revision3.com viddler.com """ from __future__ import print_function -from pydal._compat import FancyURLopener, urllib_quote +from gluon._compat import FancyURLopener, urllib_quote import re import cgi diff --git a/gluon/contrib/markmin/markmin2html.py b/gluon/contrib/markmin/markmin2html.py index e64224d2..9492a6ca 100755 --- a/gluon/contrib/markmin/markmin2html.py +++ b/gluon/contrib/markmin/markmin2html.py @@ -6,7 +6,7 @@ from __future__ import print_function import re import urllib -from pydal._compat import maketrans, urllib_quote, unicodeT, to_bytes, to_native, xrange +from gluon._compat import maketrans, urllib_quote, unicodeT, to_bytes, to_native, xrange from gluon.utils import local_html_escape as escape from ast import parse as ast_parse import ast diff --git a/gluon/contrib/shell.py b/gluon/contrib/shell.py index 6f43465a..638d3c81 100755 --- a/gluon/contrib/shell.py +++ b/gluon/contrib/shell.py @@ -29,7 +29,7 @@ An interactive, stateful AJAX shell that runs Python code on the server. """ from __future__ import print_function -from pydal._compat import ClassType, pickle, StringIO +from gluon._compat import ClassType, pickle, StringIO import logging import new import sys diff --git a/gluon/contrib/webclient.py b/gluon/contrib/webclient.py index 670e93d1..c5e7f3c7 100644 --- a/gluon/contrib/webclient.py +++ b/gluon/contrib/webclient.py @@ -16,7 +16,7 @@ mostly for testing purposes Some examples at the bottom. """ from __future__ import print_function -from pydal._compat import urllib2, cookielib, iteritems, to_native, urlencode, to_bytes +from gluon._compat import urllib2, cookielib, iteritems, to_native, urlencode, to_bytes import re import time diff --git a/gluon/custom_import.py b/gluon/custom_import.py index 1840561c..ef6c7ab2 100644 --- a/gluon/custom_import.py +++ b/gluon/custom_import.py @@ -8,7 +8,7 @@ Support for smart import syntax for web2py applications ------------------------------------------------------- """ -from pydal._compat import builtin, unicodeT, PY2, to_native +from gluon._compat import builtin, unicodeT, PY2, to_native import os import sys import threading diff --git a/gluon/debug.py b/gluon/debug.py index dd89836e..a4432590 100644 --- a/gluon/debug.py +++ b/gluon/debug.py @@ -14,7 +14,7 @@ Debugger support classes import logging import pdb import sys -from pydal._compat import Queue +from gluon._compat import Queue logger = logging.getLogger("web2py") diff --git a/gluon/fileutils.py b/gluon/fileutils.py index 07624dc4..27fe8a8d 100644 --- a/gluon/fileutils.py +++ b/gluon/fileutils.py @@ -21,7 +21,7 @@ import logging from gluon.http import HTTP from gzip import open as gzopen from gluon.recfile import generate -from pydal._compat import PY2 +from gluon._compat import PY2 __all__ = [ 'parse_version', diff --git a/gluon/globals.py b/gluon/globals.py index ff0cbf52..41ac708e 100644 --- a/gluon/globals.py +++ b/gluon/globals.py @@ -13,7 +13,7 @@ Contains the classes for the global used variables: - Session """ -from pydal._compat import pickle, StringIO, copyreg, Cookie, urlparse, PY2, iteritems, to_unicode, to_native, unicodeT +from gluon._compat import pickle, StringIO, copyreg, Cookie, urlparse, PY2, iteritems, to_unicode, to_native, unicodeT from gluon.storage import Storage, List from gluon.streamer import streamer, stream_file_or_304_or_206, DEFAULT_CHUNK_SIZE from gluon.contenttype import contenttype @@ -436,7 +436,7 @@ class Response(Storage): self._vars.update(b) self._view_environment.update(self._vars) if view: - from pydal._compat import StringIO + from gluon._compat import StringIO (obody, oview) = (self.body, self.view) (self.body, self.view) = (StringIO(), view) run_view_in(self._view_environment) @@ -1192,7 +1192,7 @@ class Session(Storage): def _try_store_in_file(self, request, response): try: - if (not response.session_id or + if (not response.session_id or not response.session_filename or self._forget or self._unchanged(response)): diff --git a/gluon/highlight.py b/gluon/highlight.py index bf98e9b3..d6faff87 100644 --- a/gluon/highlight.py +++ b/gluon/highlight.py @@ -7,7 +7,7 @@ | License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) """ from __future__ import print_function -from pydal._compat import xrange +from gluon._compat import xrange from gluon.utils import local_html_escape import re diff --git a/gluon/html.py b/gluon/html.py index 049ede93..da8e2d6e 100644 --- a/gluon/html.py +++ b/gluon/html.py @@ -20,7 +20,7 @@ import urllib import base64 from gluon import sanitizer, decoder import itertools -from pydal._compat import reduce, pickle, copyreg, HTMLParser, name2codepoint, iteritems, unichr, unicodeT, urllib_quote, to_bytes, to_native, to_unicode, basestring, urlencode, implements_bool +from gluon._compat import reduce, pickle, copyreg, HTMLParser, name2codepoint, iteritems, unichr, unicodeT, urllib_quote, to_bytes, to_native, to_unicode, basestring, urlencode, implements_bool from gluon.utils import local_html_escape import marshal @@ -127,7 +127,7 @@ def xmlescape(data, quote=True): data=str(data) data = to_bytes(data, 'utf8', 'xmlcharrefreplace') - + # ... and do the escaping data = local_html_escape(data, quote) return data @@ -945,7 +945,7 @@ class DIV(XmlComponent): fa = b'' for name, value in attr: fa += (b' %s="%s"') % (to_bytes(name), xmlescape(value, True)) - + # get the xml for the inner components co = b''.join([xmlescape(component) for component in self.components]) return (fa, co) @@ -975,7 +975,7 @@ class DIV(XmlComponent): """ # In PY3 __str__ cannot return bytes (TypeError: __str__ returned non-string (type bytes)) return to_native(self.xml()) - + def flatten(self, render=None): """ Returns the text stored by the DIV object rendered by the render function @@ -1440,7 +1440,7 @@ class STYLE(DIV): def xml(self): (fa, co) = self._xml() - fa = to_native(fa) + fa = to_native(fa) # no escaping of subcomponents co = '\n'.join([str(component) for component in self.components]) diff --git a/gluon/http.py b/gluon/http.py index 9cf17eec..e34fb8f0 100644 --- a/gluon/http.py +++ b/gluon/http.py @@ -11,7 +11,7 @@ HTTP statuses helpers """ import re -from pydal._compat import iteritems +from gluon._compat import iteritems __all__ = ['HTTP', 'redirect'] diff --git a/gluon/languages.py b/gluon/languages.py index 528a9ceb..98fa4790 100644 --- a/gluon/languages.py +++ b/gluon/languages.py @@ -21,7 +21,7 @@ from threading import RLock from gluon.utf8 import Utf8 from gluon.utils import local_html_escape -from pydal._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode, to_bytes, iteritems, to_native, pjoin +from gluon._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode, to_bytes, iteritems, to_native, pjoin from pydal.contrib.portalocker import read_locked, LockedFile from gluon.fileutils import listdir diff --git a/gluon/main.py b/gluon/main.py index 1549b3df..971c48a7 100644 --- a/gluon/main.py +++ b/gluon/main.py @@ -25,7 +25,7 @@ import socket import random import string -from pydal._compat import Cookie, urllib2 +from gluon._compat import Cookie, urllib2 #from thread import allocate_lock from gluon.fileutils import abspath, write_file diff --git a/gluon/packages/dal b/gluon/packages/dal index 79ec4e99..77e0d3f3 160000 --- a/gluon/packages/dal +++ b/gluon/packages/dal @@ -1 +1 @@ -Subproject commit 79ec4e99d09b768ca2dcc42ac32f408529e0745f +Subproject commit 77e0d3f386e326a2016a7e2139900ce72d7ddada diff --git a/gluon/recfile.py b/gluon/recfile.py index 9881e7ac..51f81cf9 100755 --- a/gluon/recfile.py +++ b/gluon/recfile.py @@ -10,7 +10,7 @@ Generates names for cache and session files -------------------------------------------- """ import os -from pydal._compat import builtin +from gluon._compat import builtin def generate(filename, depth=2, base=512): if os.path.sep in filename: diff --git a/gluon/restricted.py b/gluon/restricted.py index 6f4493b2..c67bcbf4 100644 --- a/gluon/restricted.py +++ b/gluon/restricted.py @@ -10,7 +10,7 @@ Restricted environment to execute application's code """ import sys -from pydal._compat import pickle, ClassType +from gluon._compat import pickle, ClassType import traceback import types import os diff --git a/gluon/rewrite.py b/gluon/rewrite.py index bced6731..fc14557a 100644 --- a/gluon/rewrite.py +++ b/gluon/rewrite.py @@ -27,7 +27,7 @@ from gluon.storage import Storage, List from gluon.http import HTTP from gluon.fileutils import abspath, read_file from gluon.settings import global_settings -from pydal._compat import urllib_unquote, urllib_quote, iteritems, xrange +from gluon._compat import urllib_unquote, urllib_quote, iteritems, xrange isdir = os.path.isdir isfile = os.path.isfile diff --git a/gluon/rocket.py b/gluon/rocket.py index c3eb5006..c41ac32d 100644 --- a/gluon/rocket.py +++ b/gluon/rocket.py @@ -11,7 +11,7 @@ import errno import socket import logging import platform -from pydal._compat import iteritems, to_bytes, StringIO, urllib_unquote +from gluon._compat import iteritems, to_bytes, StringIO, urllib_unquote # Define Constants VERSION = '1.2.6' diff --git a/gluon/sanitizer.py b/gluon/sanitizer.py index 0aea74d7..dbf84eca 100644 --- a/gluon/sanitizer.py +++ b/gluon/sanitizer.py @@ -10,7 +10,7 @@ Cross-site scripting (XSS) defense ----------------------------------- """ -from pydal._compat import HTMLParser, urlparse, entitydefs, basestring +from gluon._compat import HTMLParser, urlparse, entitydefs, basestring from cgi import escape from formatter import AbstractFormatter from xml.sax.saxutils import quoteattr diff --git a/gluon/scheduler.py b/gluon/scheduler.py index cc429591..1b9a478e 100644 --- a/gluon/scheduler.py +++ b/gluon/scheduler.py @@ -29,7 +29,7 @@ from json import loads, dumps from gluon import DAL, Field, IS_NOT_EMPTY, IS_IN_SET, IS_NOT_IN_DB, IS_EMPTY_OR from gluon import IS_INT_IN_RANGE, IS_DATETIME, IS_IN_DB from gluon.utils import web2py_uuid -from pydal._compat import Queue, long, iteritems +from gluon._compat import Queue, long, iteritems from gluon.storage import Storage USAGE = """ diff --git a/gluon/serializers.py b/gluon/serializers.py index 823c5b2b..d53740d7 100644 --- a/gluon/serializers.py +++ b/gluon/serializers.py @@ -10,7 +10,7 @@ from gluon.html import TAG, XmlComponent, xmlescape from gluon.languages import lazyT import gluon.contrib.rss2 as rss2 import json as json_parser -from pydal._compat import long, to_native, unicodeT +from gluon._compat import long, to_native, unicodeT have_yaml = True try: diff --git a/gluon/settings.py b/gluon/settings.py index 1ef8fcad..cb46648e 100644 --- a/gluon/settings.py +++ b/gluon/settings.py @@ -10,7 +10,7 @@ import os import sys import platform from gluon.storage import Storage -from pydal._compat import PY2 +from gluon._compat import PY2 global_settings = Storage() settings = global_settings # legacy compatibility @@ -41,5 +41,5 @@ global_settings.is_jython = \ global_settings.is_source = os.path.exists(os.path.join( global_settings.gluon_parent, 'web2py.py')) - + global_settings.is_py2 = PY2 diff --git a/gluon/shell.py b/gluon/shell.py index 29462491..95359c3a 100644 --- a/gluon/shell.py +++ b/gluon/shell.py @@ -30,7 +30,7 @@ from gluon.globals import Request, Response, Session from gluon.storage import Storage, List from gluon.admin import w2p_unpack from pydal.base import BaseAdapter -from pydal._compat import iteritems, ClassType +from gluon._compat import iteritems, ClassType logger = logging.getLogger("web2py") diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 3e8d8843..9ddc34d6 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -19,7 +19,7 @@ import urllib import re import os -from pydal._compat import StringIO, unichr, urllib_quote, iteritems, basestring, long, unicodeT, to_native +from gluon._compat import StringIO, unichr, urllib_quote, iteritems, basestring, long, unicodeT, to_native from gluon.http import HTTP, redirect from gluon.html import XmlComponent, truncate_string from gluon.html import XML, SPAN, TAG, A, DIV, CAT, UL, LI, TEXTAREA, BR, IMG diff --git a/gluon/storage.py b/gluon/storage.py index dd5d78f2..818ff914 100644 --- a/gluon/storage.py +++ b/gluon/storage.py @@ -13,7 +13,7 @@ Provides: """ from pydal.contrib import portalocker -from pydal._compat import copyreg, pickle, PY2 +from gluon._compat import copyreg, pickle, PY2 __all__ = ['List', 'Storage', 'Settings', 'Messages', 'StorageList', 'load_storage', 'save_storage'] diff --git a/gluon/streamer.py b/gluon/streamer.py index c10c129c..dd7b78b2 100644 --- a/gluon/streamer.py +++ b/gluon/streamer.py @@ -17,7 +17,7 @@ import re import errno from gluon.http import HTTP from gluon.contenttype import contenttype -from pydal._compat import PY2 +from gluon._compat import PY2 regex_start_range = re.compile('\d+(?=\-)') diff --git a/gluon/template.py b/gluon/template.py index 5ce69655..2afc29ab 100644 --- a/gluon/template.py +++ b/gluon/template.py @@ -18,7 +18,7 @@ import os import cgi import logging from re import compile, sub, escape, DOTALL -from pydal._compat import StringIO, unicodeT, to_unicode, to_bytes, to_native +from gluon._compat import StringIO, unicodeT, to_unicode, to_bytes, to_native try: # have web2py diff --git a/gluon/tests/test_contenttype.py b/gluon/tests/test_contenttype.py index ba73fd42..1a476a62 100644 --- a/gluon/tests/test_contenttype.py +++ b/gluon/tests/test_contenttype.py @@ -11,7 +11,7 @@ from .fix_path import fix_sys_path fix_sys_path(__file__) from gluon.contenttype import contenttype -from pydal._compat import iteritems +from gluon._compat import iteritems class TestContentType(unittest.TestCase): diff --git a/gluon/tests/test_contribs.py b/gluon/tests/test_contribs.py index 012f1648..577056e4 100644 --- a/gluon/tests/test_contribs.py +++ b/gluon/tests/test_contribs.py @@ -8,7 +8,7 @@ import os from .fix_path import fix_sys_path fix_sys_path(__file__) -from pydal._compat import to_bytes +from gluon._compat import to_bytes from gluon.storage import Storage from gluon.contrib import fpdf as fpdf from gluon.contrib import pyfpdf as pyfpdf diff --git a/gluon/tests/test_dal.py b/gluon/tests/test_dal.py index fe574a8a..4c7e0b24 100644 --- a/gluon/tests/test_dal.py +++ b/gluon/tests/test_dal.py @@ -34,7 +34,7 @@ class TestDALSubclass(unittest.TestCase): db.close() def testSerialization(self): - from pydal._compat import pickle + from gluon._compat import pickle db = DAL(check_reserved=['all']) db.define_table('t_a', Field('f_a')) db.t_a.insert(f_a='test') diff --git a/gluon/tests/test_globals.py b/gluon/tests/test_globals.py index 4ef0aa10..d2336093 100644 --- a/gluon/tests/test_globals.py +++ b/gluon/tests/test_globals.py @@ -14,7 +14,7 @@ fix_sys_path(__file__) from gluon.globals import Request, Response, Session from gluon import URL -from pydal._compat import basestring +from gluon._compat import basestring def setup_clean_session(): request = Request(env={}) diff --git a/gluon/tests/test_html.py b/gluon/tests/test_html.py index 18bc80f3..c861e511 100644 --- a/gluon/tests/test_html.py +++ b/gluon/tests/test_html.py @@ -17,7 +17,7 @@ from gluon.html import STYLE, TABLE, TR, TD, TAG, TBODY, THEAD, TEXTAREA, TFOOT, from gluon.storage import Storage from gluon.html import XML_pickle, XML_unpickle from gluon.html import TAG_pickler, TAG_unpickler -from pydal._compat import xrange, PY2, to_native +from gluon._compat import xrange, PY2, to_native class TestBareHelpers(unittest.TestCase): @@ -676,7 +676,7 @@ class TestBareHelpers(unittest.TestCase): # TODO: def test_markdown_serializer(self): # TODO: def test_markmin_serializer(self): - + @unittest.skipIf(not PY2, "Skipping Python 3.x tests for MARKMIN") def test_MARKMIN(self): # This test pass with python 2.7 but expected to fail under 2.6 diff --git a/gluon/tests/test_languages.py b/gluon/tests/test_languages.py index 90fd3932..acc621ea 100644 --- a/gluon/tests/test_languages.py +++ b/gluon/tests/test_languages.py @@ -15,7 +15,7 @@ from .fix_path import fix_sys_path fix_sys_path(__file__) from gluon import languages -from pydal._compat import PY2 +from gluon._compat import PY2 MP_WORKING = 0 try: diff --git a/gluon/tests/test_router.py b/gluon/tests/test_router.py index c42881f2..edec86cd 100644 --- a/gluon/tests/test_router.py +++ b/gluon/tests/test_router.py @@ -21,7 +21,7 @@ from gluon.fileutils import abspath from gluon.settings import global_settings from gluon.http import HTTP from gluon.storage import Storage -from pydal._compat import to_bytes, to_native, PY2 +from gluon._compat import to_bytes, to_native, PY2 logger = None oldcwd = None diff --git a/gluon/tests/test_routes.py b/gluon/tests/test_routes.py index 1d2113f4..16bb8a09 100644 --- a/gluon/tests/test_routes.py +++ b/gluon/tests/test_routes.py @@ -21,7 +21,7 @@ from gluon.fileutils import abspath from gluon.settings import global_settings from gluon.http import HTTP from gluon.storage import Storage -from pydal._compat import to_bytes +from gluon._compat import to_bytes logger = None oldcwd = None diff --git a/gluon/tests/test_storage.py b/gluon/tests/test_storage.py index 7acae127..48adce2e 100644 --- a/gluon/tests/test_storage.py +++ b/gluon/tests/test_storage.py @@ -10,7 +10,7 @@ fix_sys_path(__file__) from gluon.storage import Storage, StorageList, List from gluon.http import HTTP -from pydal._compat import pickle +from gluon._compat import pickle class TestStorage(unittest.TestCase): diff --git a/gluon/tests/test_template.py b/gluon/tests/test_template.py index ee7d3f9b..47ac8d44 100644 --- a/gluon/tests/test_template.py +++ b/gluon/tests/test_template.py @@ -66,7 +66,7 @@ class TestTemplate(unittest.TestCase): def testWithDummyFileSystem(self): from os.path import join as pjoin import contextlib - from pydal._compat import StringIO + from gluon._compat import StringIO from gluon.restricted import RestrictedError @contextlib.contextmanager diff --git a/gluon/tests/test_tools.py b/gluon/tests/test_tools.py index a615063f..fa963144 100644 --- a/gluon/tests/test_tools.py +++ b/gluon/tests/test_tools.py @@ -22,7 +22,7 @@ from gluon.dal import DAL, Field from pydal.objects import Table from gluon import tools from gluon.tools import Auth, Mail, Recaptcha, Recaptcha2, prettydate, Expose -from pydal._compat import PY2 +from gluon._compat import PY2 from gluon.globals import Request, Response, Session from gluon.storage import Storage from gluon.languages import translator diff --git a/gluon/tests/test_validators.py b/gluon/tests/test_validators.py index c77a5b2c..19a18e16 100644 --- a/gluon/tests/test_validators.py +++ b/gluon/tests/test_validators.py @@ -13,7 +13,7 @@ fix_sys_path(__file__) from gluon.validators import * -from pydal._compat import PY2, to_bytes +from gluon._compat import PY2, to_bytes class TestValidators(unittest.TestCase): diff --git a/gluon/tests/test_web.py b/gluon/tests/test_web.py index 89f42177..f7e9ddf3 100644 --- a/gluon/tests/test_web.py +++ b/gluon/tests/test_web.py @@ -16,7 +16,7 @@ from .fix_path import fix_sys_path fix_sys_path(__file__) from gluon.contrib.webclient import WebClient -from pydal._compat import urllib2, PY2 +from gluon._compat import urllib2, PY2 webserverprocess = None diff --git a/gluon/tools.py b/gluon/tools.py index d5178850..f88a01bc 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -12,7 +12,7 @@ Auth, Mail, PluginManager and various utilities import base64 from functools import reduce -from pydal._compat import pickle, thread, urllib2, Cookie, StringIO, configparser, MIMEBase, MIMEMultipart, \ +from gluon._compat import pickle, thread, urllib2, Cookie, StringIO, configparser, MIMEBase, MIMEMultipart, \ MIMEText, Encoders, Charset, long, urllib_quote, iteritems, to_bytes, to_native, add_charset, \ charset_QP, basestring, unicodeT, to_unicode import datetime @@ -1193,7 +1193,7 @@ class AuthJWT(object): return '%s$%s' % (request.now, auth.user_id) return "No auth info!" - + """ @@ -1246,7 +1246,7 @@ class AuthJWT(object): self.before_authorization = before_authorization self.max_header_length = max_header_length self.recvd_token = None - + @staticmethod def jwt_b64e(string): string = to_bytes(string) @@ -1362,7 +1362,7 @@ class AuthJWT(object): """ The part that issues (and refreshes) tokens. Used in a controller, given myjwt is the istantiated class, as - + @myjwt.allow_jwt(required=False, verify_expiration=False) def api_auth(): return myjwt.jwt_token_manager() @@ -1440,7 +1440,7 @@ class AuthJWT(object): self.recvd_token = token return token - + def allows_jwt(self, otherwise=None, required=True, verify_expiration=True, token_param='_token'): """ The decorator that takes care of injecting auth info in the decorated action. @@ -1832,7 +1832,7 @@ class Auth(object): # ## what happens after registration? settings = self.settings = Settings() - settings.update(Auth.default_settings) + settings.update(Auth.default_settings) host = self.select_host(request.env.http_host, host_names) settings.update( cas_domains=[host], diff --git a/gluon/utf8.py b/gluon/utf8.py index f9672ee7..21fd12c4 100644 --- a/gluon/utf8.py +++ b/gluon/utf8.py @@ -11,7 +11,7 @@ Utilities and class for UTF8 strings managing ---------------------------------------------- """ from __future__ import print_function -from pydal._compat import builtin as __builtin__, unicodeT, iteritems, to_unicode, to_native +from gluon._compat import builtin as __builtin__, unicodeT, iteritems, to_unicode, to_native __all__ = ['Utf8'] diff --git a/gluon/utils.py b/gluon/utils.py index 79fd8604..8589cd2f 100644 --- a/gluon/utils.py +++ b/gluon/utils.py @@ -23,7 +23,7 @@ import logging import socket import base64 import zlib -from pydal._compat import basestring, pickle, PY2, xrange, to_bytes, to_native +from gluon._compat import basestring, pickle, PY2, xrange, to_bytes, to_native _struct_2_long_long = struct.Struct('=QQ') @@ -370,7 +370,7 @@ def local_html_escape(data, quote=False): translated. """ if PY2: - import cgi + import cgi data = cgi.escape(data, quote) return data.replace("'", "'") if quote else data else: diff --git a/gluon/validators.py b/gluon/validators.py index 2e9fd490..4181c226 100644 --- a/gluon/validators.py +++ b/gluon/validators.py @@ -21,7 +21,7 @@ import urllib import struct import decimal import unicodedata -from pydal._compat import StringIO, long, unicodeT, to_unicode, urllib_unquote, unichr, to_bytes, PY2, to_unicode, to_native +from gluon._compat import StringIO, long, unicodeT, to_unicode, urllib_unquote, unichr, to_bytes, PY2, to_unicode, to_native from gluon.utils import simple_hash, web2py_uuid, DIGEST_ALG_BY_SIZE from pydal.objects import Field, FieldVirtual, FieldMethod from functools import reduce diff --git a/gluon/widget.py b/gluon/widget.py index f801b001..73692f9d 100644 --- a/gluon/widget.py +++ b/gluon/widget.py @@ -13,7 +13,7 @@ from __future__ import print_function import datetime import sys -from pydal._compat import StringIO, thread, xrange +from gluon._compat import StringIO, thread, xrange import time import threading import os @@ -935,7 +935,7 @@ def console(): sys.argv, other_args = sys.argv[:k], sys.argv[k + 1:] (options, args) = parser.parse_args() options.args = [options.run] + other_args - + copy_options = copy.deepcopy(options) copy_options.password = '******' global_settings.cmd_options = copy_options From 16b11c7ef26e07166e16bf4ee7b558d4f91a726a Mon Sep 17 00:00:00 2001 From: zvolsky Date: Tue, 16 Aug 2016 13:28:29 +0200 Subject: [PATCH 5/6] F redirect in admin/default/design (install of plugin) --- applications/admin/controllers/default.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py index bdadcf2b..95c7d842 100644 --- a/applications/admin/controllers/default.py +++ b/applications/admin/controllers/default.py @@ -1088,10 +1088,10 @@ def design(): else: session.flash = \ T('unable to create application "%s"', request.vars.filename) - redirect(URL(r=request)) + redirect(URL(r=request, args=app)) elif isinstance(request.vars.pluginfile, str): session.flash = T('plugin not specified') - redirect(URL(r=request)) + redirect(URL(r=request, args=app)) # If we have only pyc files it means that # we cannot design From 9e5bf2bf03c1dd82234d955e41c5028e547834ee Mon Sep 17 00:00:00 2001 From: zvolsky Date: Tue, 16 Aug 2016 13:38:13 +0200 Subject: [PATCH 6/6] F error message in admin/default/design (install of plugin) --- applications/admin/controllers/default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py index 95c7d842..86f315c0 100644 --- a/applications/admin/controllers/default.py +++ b/applications/admin/controllers/default.py @@ -1087,7 +1087,7 @@ def design(): redirect(URL('design', args=app)) else: session.flash = \ - T('unable to create application "%s"', request.vars.filename) + T('unable to install plugin "%s"', filename) redirect(URL(r=request, args=app)) elif isinstance(request.vars.pluginfile, str): session.flash = T('plugin not specified')