summaryrefslogtreecommitdiff
path: root/addons/web_editor/models/ir_qweb.py
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-08-24 13:17:53 +0200
committerChristophe Simonis <chs@odoo.com>2017-08-24 13:17:53 +0200
commit017ee5eab376b4f09beb62812c1cbc682009ed86 (patch)
tree2af185b0604cd8ce9129c39137bbf39d21d7be89 /addons/web_editor/models/ir_qweb.py
parent006c16198f7f68c9dc8b895defd013f33008840a (diff)
parent877e7098719195ed2934fc9c3b5c3bd8ad8bab07 (diff)
[MERGE] forward port branch saas-17 up to 877e7098719
Diffstat (limited to 'addons/web_editor/models/ir_qweb.py')
-rw-r--r--addons/web_editor/models/ir_qweb.py30
1 files changed, 19 insertions, 11 deletions
diff --git a/addons/web_editor/models/ir_qweb.py b/addons/web_editor/models/ir_qweb.py
index 4cceec10421..f2132c596f0 100644
--- a/addons/web_editor/models/ir_qweb.py
+++ b/addons/web_editor/models/ir_qweb.py
@@ -9,7 +9,8 @@ Also, adds methods to convert values back to Odoo models.
"""
import ast
-import cStringIO
+import base64
+import io
import itertools
import json
import logging
@@ -47,7 +48,10 @@ class QWeb(models.AbstractModel):
el.set('t-call', el.attrib.pop('t-snippet'))
name = self.env['ir.ui.view'].search([('key', '=', el.attrib.get('t-call'))]).display_name
thumbnail = el.attrib.pop('t-thumbnail', "oe-thumbnail")
- div = u'<div name="%s" data-oe-type="snippet" data-oe-thumbnail="%s">' % (escape(ir_qweb.unicodifier(name)), escape(ir_qweb.unicodifier(thumbnail)))
+ div = u'<div name="%s" data-oe-type="snippet" data-oe-thumbnail="%s">' % (
+ escape(pycompat.to_text(name)),
+ escape(pycompat.to_text(thumbnail))
+ )
return [self._append(ast.Str(div))] + self._compile_node(el, options) + [self._append(ast.Str(u'</div>'))]
def _compile_directive_install(self, el, options):
@@ -57,7 +61,11 @@ class QWeb(models.AbstractModel):
return []
name = el.attrib.get('string') or 'Snippet'
thumbnail = el.attrib.pop('t-thumbnail', 'oe-thumbnail')
- div = u'<div name="%s" data-oe-type="snippet" data-module-id="%s" data-oe-thumbnail="%s"><section/></div>' % (escape(ir_qweb.unicodifier(name)), module.id, escape(ir_qweb.unicodifier(thumbnail)))
+ div = u'<div name="%s" data-oe-type="snippet" data-module-id="%s" data-oe-thumbnail="%s"><section/></div>' % (
+ escape(pycompat.to_text(name)),
+ module.id,
+ escape(pycompat.to_text(thumbnail))
+ )
return [self._append(ast.Str(div))]
else:
return []
@@ -201,7 +209,7 @@ class DateTime(models.AbstractModel):
def attributes(self, record, field_name, options, values):
attrs = super(DateTime, self).attributes(record, field_name, options, values)
value = record[field_name]
- if isinstance(value, basestring):
+ if isinstance(value, pycompat.string_types):
value = fields.Datetime.from_string(value)
if value:
# convert from UTC (server timezone) to user timezone
@@ -274,7 +282,7 @@ class HTML(models.AbstractModel):
content = []
if element.text:
content.append(element.text)
- content.extend(html.tostring(child)
+ content.extend(html.tostring(child, encoding='unicode')
for child in element.iterchildren(tag=etree.Element))
return '\n'.join(content)
@@ -307,7 +315,7 @@ class Image(models.AbstractModel):
if max_width or max_height:
max_size = '%sx%s' % (max_width, max_height)
- sha = hashlib.sha1(getattr(record, '__last_update')).hexdigest()[0:7]
+ sha = hashlib.sha1(getattr(record, '__last_update').encode('utf-8')).hexdigest()[0:7]
max_size = '' if max_size is None else '/%s' % max_size
src = '/web/image/%s/%s/%s%s?unique=%s' % (record._name, record.id, field_name, max_size, sha)
@@ -325,7 +333,7 @@ class Image(models.AbstractModel):
img = '<img class="%s" src="%s" style="%s"%s%s/>' % \
(classes, src, options.get('style', ''), ' alt="%s"' % alt if alt else '', ' data-zoom="1" data-zoom-image="%s"' % src_zoom if src_zoom else '')
- return ir_qweb.unicodifier(img)
+ return pycompat.to_text(img)
local_url_re = re.compile(r'^/(?P<module>[^]]+)/static/(?P<rest>.+)$')
@@ -374,7 +382,7 @@ class Image(models.AbstractModel):
image = I.open(f)
image.load()
f.seek(0)
- return f.read().encode('base64')
+ return base64.b64encode(f.read())
except Exception:
logger.exception("Failed to load local image %r", url)
return None
@@ -390,7 +398,7 @@ class Image(models.AbstractModel):
req = requests.get(url, timeout=REMOTE_CONNECTION_TIMEOUT)
# PIL needs a seekable file-like image so wrap result in IO buffer
- image = I.open(cStringIO.StringIO(req.content))
+ image = I.open(io.BytesIO(req.content))
# force a complete load of the image data to validate it
image.load()
except Exception:
@@ -399,9 +407,9 @@ class Image(models.AbstractModel):
# don't use original data in case weird stuff was smuggled in, with
# luck PIL will remove some of it?
- out = cStringIO.StringIO()
+ out = io.BytesIO()
image.save(out, image.format)
- return out.getvalue().encode('base64')
+ return base64.b64encode(out.getvalue())
class Monetary(models.AbstractModel):