Switched to jinja

bzr revid: nicolas.vanhoren@openerp.com-20130226135917-vkxa2gaxyxy1v7b0
This commit is contained in:
niv-openerp 2013-02-26 14:59:17 +01:00
parent 63346192fc
commit 49b1fa4b52
2 changed files with 69 additions and 45 deletions

View File

@ -55,7 +55,7 @@
<body style="border:0; margin: 0;" onload="subst()"> <body style="border:0; margin: 0;" onload="subst()">
<table class="header" style="border-bottom: 0px solid black; width: 100%"> <table class="header" style="border-bottom: 0px solid black; width: 100%">
<tr> <tr>
<td>${helper.embed_company_logo()|n}</td> <td>${helper.embed_company_logo()|safe}</td>
<td style="text-align:right"> </td> <td style="text-align:right"> </td>
</tr> </tr>
<tr> <tr>
@ -63,21 +63,21 @@
<td style="text-align:right"> </td> <td style="text-align:right"> </td>
</tr> </tr>
<tr> <tr>
<td>${company.partner_id.name |entity}</td> <td>${company.partner_id.name}</td>
<td/> <td/>
</tr> </tr>
<tr> <tr>
<td >${company.partner_id.street or ''|entity}</td> <td >${company.partner_id.street or ''}</td>
<td/> <td/>
</tr> </tr>
<tr> <tr>
<td>Phone: ${company.partner_id.phone or ''|entity} </td> <td>Phone: ${company.partner_id.phone or ''} </td>
<td/> <td/>
</tr> </tr>
<tr> <tr>
<td>Mail: ${company.partner_id.email or ''|entity}<br/></td> <td>Mail: ${company.partner_id.email or ''}<br/></td>
</tr> </tr>
</table> ${_debug or ''|n} </body> </table> ${_debug or ''|safe} </body>
</html>]]> </html>]]>
</field> </field>
<field eval="55.0" name="margin_top"/> <field eval="55.0" name="margin_top"/>

View File

@ -38,10 +38,6 @@ import tempfile
import time import time
import logging import logging
from mako.template import Template
from mako.lookup import TemplateLookup
from mako import exceptions
from openerp import netsvc from openerp import netsvc
from openerp import pooler from openerp import pooler
from report_helper import WebKitHelper from report_helper import WebKitHelper
@ -50,16 +46,46 @@ from openerp import addons
from openerp import tools from openerp import tools
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp.osv.osv import except_osv from openerp.osv.osv import except_osv
from urllib import urlencode, quote as quote
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
try:
# We use a jinja2 sandboxed environment to render mako templates.
# Note that the rendering does not cover all the mako syntax, in particular
# arbitrary Python statements are not accepted, and not all expressions are
# allowed: only "public" attributes (not starting with '_') of objects may
# be accessed.
# This is done on purpose: it prevents incidental or malicious execution of
# Python code that may break the security of the server.
from jinja2.sandbox import SandboxedEnvironment
mako_template_env = SandboxedEnvironment(
block_start_string="<%",
block_end_string="%>",
variable_start_string="${",
variable_end_string="}",
comment_start_string="<%doc>",
comment_end_string="</%doc>",
line_statement_prefix="%",
line_comment_prefix="##",
trim_blocks=True, # do not output newline after blocks
autoescape=True, # XML/HTML automatic escaping
)
mako_template_env.globals.update({
'str': str,
'quote': quote,
'urlencode': urlencode,
})
except ImportError:
_logger.warning("jinja2 not available, templating features will not work!")
def mako_template(text): def mako_template(text):
"""Build a Mako template. """Build a Mako template.
This template uses UTF-8 encoding This template uses UTF-8 encoding
""" """
tmp_lookup = TemplateLookup() #we need it in order to allow inclusion and inheritance
return Template(text, input_encoding='utf-8', output_encoding='utf-8', lookup=tmp_lookup) return mako_template_env.from_string(text)
class WebKitParser(report_sxw): class WebKitParser(report_sxw):
"""Custom class that use webkit to render HTML reports """Custom class that use webkit to render HTML reports
@ -242,64 +268,62 @@ class WebKitParser(report_sxw):
if not css : if not css :
css = '' css = ''
#default_filters=['unicode', 'entity'] can be used to set global filter
body_mako_tpl = mako_template(template) body_mako_tpl = mako_template(template)
helper = WebKitHelper(cursor, uid, report_xml.id, context) helper = WebKitHelper(cursor, uid, report_xml.id, context)
if report_xml.precise_mode: if report_xml.precise_mode:
for obj in objs: for obj in objs:
self.parser_instance.localcontext['objects'] = [obj] self.parser_instance.localcontext['objects'] = [obj]
try : try :
html = body_mako_tpl.render(helper=helper, html = body_mako_tpl.render(dict({"helper":helper,
css=css, "css":css,
_=self.translate_call, "_":self.translate_call},
**self.parser_instance.localcontext) **self.parser_instance.localcontext))
htmls.append(html) htmls.append(html)
except Exception: except Exception, e:
msg = exceptions.text_error_template().render() msg = u"%s" % e
_logger.error(msg) _logger.error(msg)
raise except_osv(_('Webkit render!'), msg) raise except_osv(_('Webkit render!'), msg)
else: else:
try : try :
html = body_mako_tpl.render(helper=helper, html = body_mako_tpl.render(dict({"helper":helper,
css=css, "css":css,
_=self.translate_call, "_":self.translate_call},
**self.parser_instance.localcontext) **self.parser_instance.localcontext))
htmls.append(html) htmls.append(html)
except Exception: except Exception:
msg = exceptions.text_error_template().render() msg = u"%s" % e
_logger.error(msg) _logger.error(msg)
raise except_osv(_('Webkit render!'), msg) raise except_osv(_('Webkit render!'), msg)
head_mako_tpl = mako_template(header) head_mako_tpl = mako_template(header)
try : try :
head = head_mako_tpl.render(helper=helper, head = head_mako_tpl.render(dict({"helper":helper,
css=css, "css":css,
_=self.translate_call, "_":self.translate_call,
_debug=False, "_debug":False},
**self.parser_instance.localcontext) **self.parser_instance.localcontext))
except Exception: except Exception, e:
raise except_osv(_('Webkit render!'), raise except_osv(_('Webkit render!'), u"%s" % e)
exceptions.text_error_template().render())
foot = False foot = False
if footer : if footer :
foot_mako_tpl = mako_template(footer) foot_mako_tpl = mako_template(footer)
try : try :
foot = foot_mako_tpl.render(helper=helper, foot = foot_mako_tpl.render(dict({"helper":helper,
css=css, "css":css,
_=self.translate_call, "_":self.translate_call},
**self.parser_instance.localcontext) **self.parser_instance.localcontext))
except: except Exception, e:
msg = exceptions.text_error_template().render() msg = u"%s" % e
_logger.error(msg) _logger.error(msg)
raise except_osv(_('Webkit render!'), msg) raise except_osv(_('Webkit render!'), msg)
if report_xml.webkit_debug : if report_xml.webkit_debug :
try : try :
deb = head_mako_tpl.render(helper=helper, deb = head_mako_tpl.render(dict({"helper":helper,
css=css, "css":css,
_debug=tools.ustr("\n".join(htmls)), "_":self.translate_call,
_=self.translate_call, "_debug":tools.ustr("\n".join(htmls))},
**self.parser_instance.localcontext) **self.parser_instance.localcontext))
except Exception: except Exception, e:
msg = exceptions.text_error_template().render() msg = u"%s" % e
_logger.error(msg) _logger.error(msg)
raise except_osv(_('Webkit render!'), msg) raise except_osv(_('Webkit render!'), msg)
return (deb, 'html') return (deb, 'html')