From 44e27bf65fd997e851779586aeec99c13bb477e1 Mon Sep 17 00:00:00 2001
From: ilvalle
Date: Thu, 8 Feb 2018 20:58:37 +0100
Subject: [PATCH 1/7] fix py3 languages decode added tests. close #1848, thanks
@bjquinn
---
gluon/languages.py | 5 ++++-
gluon/tests/test_languages.py | 24 +++++++++++++++++++++++-
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/gluon/languages.py b/gluon/languages.py
index 0d8bd4a2..6a0f22b1 100644
--- a/gluon/languages.py
+++ b/gluon/languages.py
@@ -434,7 +434,10 @@ class lazyT(object):
return str(self).encode(*a, **b)
def decode(self, *a, **b):
- return str(self).decode(*a, **b)
+ if PY2:
+ return str(self).decode(*a, **b)
+ else:
+ return str(self)
def read(self):
return str(self)
diff --git a/gluon/tests/test_languages.py b/gluon/tests/test_languages.py
index cb2fb6bc..7cc33723 100644
--- a/gluon/tests/test_languages.py
+++ b/gluon/tests/test_languages.py
@@ -12,7 +12,8 @@ import tempfile
import unittest
from gluon import languages
-from gluon._compat import PY2
+from gluon._compat import PY2, to_unicode
+from gluon.storage import Messages
MP_WORKING = 0
try:
@@ -108,6 +109,8 @@ class TestTranslations(unittest.TestCase):
T.force('it')
self.assertEqual(str(T('Hello World')),
'Salve Mondo')
+ self.assertEqual(to_unicode(T('Hello World')),
+ 'Salve Mondo')
class TestDummyApp(unittest.TestCase):
@@ -179,3 +182,22 @@ def index():
for key in ['hello', 'world', '%s %%{shop}', 'ahoy']:
self.assertTrue(key in en_dict)
self.assertTrue(key in pt_dict)
+
+class TestMessages(unittest.TestCase):
+
+ def setUp(self):
+ if os.path.isdir('gluon'):
+ self.langpath = 'applications/welcome/languages'
+ else:
+ self.langpath = os.path.realpath(
+ '../../applications/welcome/languages')
+ self.http_accept_language = 'en'
+
+ def tearDown(self):
+ pass
+
+ def test_decode(self):
+ T = languages.translator(self.langpath, self.http_accept_language)
+ messages = Messages(T)
+ messages.update({'email_sent':'Email sent', 'test': "ä"})
+ self.assertEqual(to_unicode(messages.email_sent, 'utf-8'), 'Email sent')
From 546440ece05b6ea10a7a3ddf7c745fc6a23d12ad Mon Sep 17 00:00:00 2001
From: Yi Liu
Date: Fri, 9 Feb 2018 11:48:00 -0800
Subject: [PATCH 2/7] Fix layout.html "Lost Password" link
---
applications/welcome/views/layout.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/applications/welcome/views/layout.html b/applications/welcome/views/layout.html
index 9f664c45..54dcf8d2 100644
--- a/applications/welcome/views/layout.html
+++ b/applications/welcome/views/layout.html
@@ -75,7 +75,7 @@
{{else:}}
{{=T('Login')}}
{{=T('Sign up')}}
- {{=T('Lost Password')}}
+ {{=T('Lost Password')}}
{{pass}}
From c3355b745710a2b5b13c38240b5c328eb12faf65 Mon Sep 17 00:00:00 2001
From: ilvalle
Date: Fri, 9 Feb 2018 20:56:16 +0100
Subject: [PATCH 3/7] fix missing reload py3, close #1760
---
gluon/utf8.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gluon/utf8.py b/gluon/utf8.py
index 21fd12c4..34bfa87f 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 gluon._compat import builtin as __builtin__, unicodeT, iteritems, to_unicode, to_native
+from gluon._compat import builtin as __builtin__, unicodeT, iteritems, to_unicode, to_native, reload
__all__ = ['Utf8']
From 7aafd05cbb0d29dfafe4d6976428272ebc8d9e45 Mon Sep 17 00:00:00 2001
From: Francisco Ribeiro
Date: Mon, 12 Feb 2018 11:36:34 +0000
Subject: [PATCH 4/7] patched flash function to prevent XSS
---
applications/admin/static/js/web2py.js | 2 +-
applications/examples/static/js/web2py.js | 2 +-
applications/welcome/static/js/web2py.js | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/applications/admin/static/js/web2py.js b/applications/admin/static/js/web2py.js
index 7131727d..22b9f253 100644
--- a/applications/admin/static/js/web2py.js
+++ b/applications/admin/static/js/web2py.js
@@ -617,7 +617,7 @@
flash: function (message, status) {
var flash = $('.w2p_flash');
web2py.hide_flash();
- flash.html(message).addClass(status);
+ flash.text(message).addClass(status);
if (flash.html()) flash.append(' × ')[animateIn]();
},
hide_flash: function () {
diff --git a/applications/examples/static/js/web2py.js b/applications/examples/static/js/web2py.js
index 7131727d..22b9f253 100644
--- a/applications/examples/static/js/web2py.js
+++ b/applications/examples/static/js/web2py.js
@@ -617,7 +617,7 @@
flash: function (message, status) {
var flash = $('.w2p_flash');
web2py.hide_flash();
- flash.html(message).addClass(status);
+ flash.text(message).addClass(status);
if (flash.html()) flash.append(' × ')[animateIn]();
},
hide_flash: function () {
diff --git a/applications/welcome/static/js/web2py.js b/applications/welcome/static/js/web2py.js
index 7131727d..22b9f253 100644
--- a/applications/welcome/static/js/web2py.js
+++ b/applications/welcome/static/js/web2py.js
@@ -617,7 +617,7 @@
flash: function (message, status) {
var flash = $('.w2p_flash');
web2py.hide_flash();
- flash.html(message).addClass(status);
+ flash.text(message).addClass(status);
if (flash.html()) flash.append(' × ')[animateIn]();
},
hide_flash: function () {
From fa31a6b61be02ed1f6ce8fd76c21776a1e09d82d Mon Sep 17 00:00:00 2001
From: ilvalle
Date: Sat, 10 Feb 2018 20:22:32 +0100
Subject: [PATCH 5/7] Added test for T used in HTML tags, fix language
encode(), close #1856
---
gluon/languages.py | 5 ++++-
gluon/tests/test_languages.py | 24 +++++++++++++++++++++++-
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/gluon/languages.py b/gluon/languages.py
index 6a0f22b1..293ecac9 100644
--- a/gluon/languages.py
+++ b/gluon/languages.py
@@ -431,7 +431,10 @@ class lazyT(object):
return str(self) if self.M else local_html_escape(str(self), quote=False)
def encode(self, *a, **b):
- return str(self).encode(*a, **b)
+ if PY2 and a[0] != 'utf8':
+ return to_unicode(str(self)).encode(*a, **b)
+ else:
+ return str(self)
def decode(self, *a, **b):
if PY2:
diff --git a/gluon/tests/test_languages.py b/gluon/tests/test_languages.py
index 7cc33723..c996bd6a 100644
--- a/gluon/tests/test_languages.py
+++ b/gluon/tests/test_languages.py
@@ -12,8 +12,9 @@ import tempfile
import unittest
from gluon import languages
-from gluon._compat import PY2, to_unicode
+from gluon._compat import PY2, to_unicode, to_bytes
from gluon.storage import Messages
+from gluon.html import SPAN
MP_WORKING = 0
try:
@@ -201,3 +202,24 @@ class TestMessages(unittest.TestCase):
messages = Messages(T)
messages.update({'email_sent':'Email sent', 'test': "ä"})
self.assertEqual(to_unicode(messages.email_sent, 'utf-8'), 'Email sent')
+
+class TestHTMLTag(unittest.TestCase):
+
+ def setUp(self):
+ if os.path.isdir('gluon'):
+ self.langpath = 'applications/welcome/languages'
+ else:
+ self.langpath = os.path.realpath(
+ '../../applications/welcome/languages')
+ self.http_accept_language = 'en'
+
+ def tearDown(self):
+ pass
+
+ def test_decode(self):
+ T = languages.translator(self.langpath, self.http_accept_language)
+ elem = SPAN(T("Complete"))
+ self.assertEqual(elem.flatten(), "Complete")
+ elem = SPAN(T("Cannot be empty", language="ru"))
+ self.assertEqual(elem.xml(), to_bytes('Пустое значение недопустимо'))
+ self.assertEqual(elem.flatten(), 'Пустое значение недопустимо')
From 419dc7b5fc92c6242590ef011bcfb8a598461776 Mon Sep 17 00:00:00 2001
From: dartg
Date: Tue, 20 Feb 2018 02:34:21 -0300
Subject: [PATCH 6/7] Replace the guppy library with Pympler
---
applications/welcome/controllers/appadmin.py | 21 ++++++++++----------
applications/welcome/views/appadmin.html | 6 +++---
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/applications/welcome/controllers/appadmin.py b/applications/welcome/controllers/appadmin.py
index 74240e59..0188ade9 100644
--- a/applications/welcome/controllers/appadmin.py
+++ b/applications/welcome/controllers/appadmin.py
@@ -392,12 +392,11 @@ def ccache():
cache.disk.clear()
session.flash += T("Disk Cleared")
redirect(URL(r=request))
-
+
try:
- from guppy import hpy
- hp = hpy()
+ from pympler.asizeof import asizeof
except ImportError:
- hp = False
+ asizeof = False
import shelve
import os
@@ -451,9 +450,9 @@ def ccache():
ram['ratio'] = 0
for key, value in iteritems(cache.ram.storage):
- if hp:
- ram['bytes'] += hp.iso(value[1]).size
- ram['objects'] += hp.iso(value[1]).count
+ if asizeof:
+ ram['bytes'] += asizeof(value[1])
+ ram['objects'] += 1
ram['entries'] += 1
if value[0] < ram['oldest']:
ram['oldest'] = value[0]
@@ -469,9 +468,9 @@ def ccache():
except (KeyError, ZeroDivisionError):
disk['ratio'] = 0
else:
- if hp:
- disk['bytes'] += hp.iso(value[1]).size
- disk['objects'] += hp.iso(value[1]).count
+ if asizeof:
+ disk['bytes'] += asizeof(value[1])
+ disk['objects'] += 1
disk['entries'] += 1
if value[0] < disk['oldest']:
disk['oldest'] = value[0]
@@ -511,7 +510,7 @@ def ccache():
total['keys'] = key_table(total['keys'])
return dict(form=form, total=total,
- ram=ram, disk=disk, object_stats=hp != False)
+ ram=ram, disk=disk, object_stats=asizeof != False)
def table_template(table):
diff --git a/applications/welcome/views/appadmin.html b/applications/welcome/views/appadmin.html
index 59b85563..8a9d3400 100644
--- a/applications/welcome/views/appadmin.html
+++ b/applications/welcome/views/appadmin.html
@@ -148,7 +148,7 @@
{{=T.M("(**%.0d MB**)", total['bytes'] / 1048576)}}
{{pass}}
{{else:}}
- {{=T.M("**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}}
+ {{=T.M("**not available** (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)")}}
{{pass}}
@@ -176,7 +176,7 @@
{{=T.M("(**%.0d MB**)", ram['bytes'] / 10485576)}}
{{pass}}
{{else:}}
- {{=T.M("``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}}
+ {{=T.M("``**not available**``:red (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)")}}
{{pass}}
@@ -205,7 +205,7 @@
{{=T.M("(**%.0d MB**)", disk['bytes'] / 1048576)}}
{{pass}}
{{else:}}
- {{=T.M("``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)")}}
+ {{=T.M("``**not available**``:red (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)")}}
{{pass}}
From 164a271ca8a8caf292f54779709b8ad13259d0a7 Mon Sep 17 00:00:00 2001
From: ilvalle
Date: Fri, 23 Feb 2018 19:43:34 +0100
Subject: [PATCH 7/7] fix PY3 rocket with bytes stream. ref web2py/pydal#516
---
gluon/rocket.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gluon/rocket.py b/gluon/rocket.py
index e3faf0bd..d76da94e 100644
--- a/gluon/rocket.py
+++ b/gluon/rocket.py
@@ -1750,7 +1750,7 @@ class WSGIWorker(Worker):
if self.request_method != 'HEAD':
try:
if self.chunked:
- self.conn.sendall(b('%x\r\n%s\r\n' % (len(data), data)))
+ self.conn.sendall(b'%x\r\n%s\r\n' % (len(data), to_bytes(data, 'ISO-8859-1')))
else:
self.conn.sendall(to_bytes(data))
except socket.timeout: