Merge pull request #56 from yvaucher/7.0-fix-1319109

[FIX] report_webkit: avoid sharing parser instance globally and make it thread safe
This commit is contained in:
Martin Trigaux
2014-06-10 09:38:48 +02:00
+24 -23
View File
@@ -37,6 +37,7 @@ from openerp import report
import tempfile import tempfile
import time import time
import logging import logging
from functools import partial
from mako.template import Template from mako.template import Template
from mako.lookup import TemplateLookup from mako.lookup import TemplateLookup
@@ -68,7 +69,6 @@ class WebKitParser(report_sxw):
""" """
def __init__(self, name, table, rml=False, parser=False, def __init__(self, name, table, rml=False, parser=False,
header=True, store=False): header=True, store=False):
self.parser_instance = False
self.localcontext = {} self.localcontext = {}
report_sxw.__init__(self, name, table, rml, parser, report_sxw.__init__(self, name, table, rml, parser,
header, store) header, store)
@@ -179,16 +179,16 @@ class WebKitParser(report_sxw):
_logger.error('cannot remove file %s: %s', f_to_del, exc) _logger.error('cannot remove file %s: %s', f_to_del, exc)
return pdf return pdf
def translate_call(self, src): def translate_call(self, parser_instance, src):
"""Translate String.""" """Translate String."""
ir_translation = self.pool.get('ir.translation') ir_translation = self.pool['ir.translation']
name = self.tmpl and 'addons/' + self.tmpl or None name = self.tmpl and 'addons/' + self.tmpl or None
res = ir_translation._get_source(self.parser_instance.cr, self.parser_instance.uid, res = ir_translation._get_source(parser_instance.cr, parser_instance.uid,
name, 'report', self.parser_instance.localcontext.get('lang', 'en_US'), src) name, 'report', parser_instance.localcontext.get('lang', 'en_US'), src)
if res == src: if res == src:
# no translation defined, fallback on None (backward compatibility) # no translation defined, fallback on None (backward compatibility)
res = ir_translation._get_source(self.parser_instance.cr, self.parser_instance.uid, res = ir_translation._get_source(parser_instance.cr, parser_instance.uid,
None, 'report', self.parser_instance.localcontext.get('lang', 'en_US'), src) None, 'report', parser_instance.localcontext.get('lang', 'en_US'), src)
if not res : if not res :
return src return src
return res return res
@@ -203,14 +203,14 @@ class WebKitParser(report_sxw):
if report_xml.report_type != 'webkit': if report_xml.report_type != 'webkit':
return super(WebKitParser,self).create_single_pdf(cursor, uid, ids, data, report_xml, context=context) return super(WebKitParser,self).create_single_pdf(cursor, uid, ids, data, report_xml, context=context)
self.parser_instance = self.parser(cursor, parser_instance = self.parser(cursor,
uid, uid,
self.name2, self.name2,
context=context) context=context)
self.pool = pooler.get_pool(cursor.dbname) self.pool = pooler.get_pool(cursor.dbname)
objs = self.getObjects(cursor, uid, ids, context) objs = self.getObjects(cursor, uid, ids, context)
self.parser_instance.set_context(objs, data, ids, report_xml.report_type) parser_instance.set_context(objs, data, ids, report_xml.report_type)
template = False template = False
@@ -240,17 +240,18 @@ class WebKitParser(report_sxw):
if not css : if not css :
css = '' css = ''
translate_call = partial(self.translate_call, parser_instance)
#default_filters=['unicode', 'entity'] can be used to set global filter #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] parser_instance.localcontext['objects'] = [obj]
try : try :
html = body_mako_tpl.render(helper=helper, html = body_mako_tpl.render(helper=helper,
css=css, css=css,
_=self.translate_call, _=translate_call,
**self.parser_instance.localcontext) **parser_instance.localcontext)
htmls.append(html) htmls.append(html)
except Exception: except Exception:
msg = exceptions.text_error_template().render() msg = exceptions.text_error_template().render()
@@ -260,8 +261,8 @@ class WebKitParser(report_sxw):
try : try :
html = body_mako_tpl.render(helper=helper, html = body_mako_tpl.render(helper=helper,
css=css, css=css,
_=self.translate_call, _=translate_call,
**self.parser_instance.localcontext) **parser_instance.localcontext)
htmls.append(html) htmls.append(html)
except Exception: except Exception:
msg = exceptions.text_error_template().render() msg = exceptions.text_error_template().render()
@@ -271,9 +272,9 @@ class WebKitParser(report_sxw):
try : try :
head = head_mako_tpl.render(helper=helper, head = head_mako_tpl.render(helper=helper,
css=css, css=css,
_=self.translate_call, _=translate_call,
_debug=False, _debug=False,
**self.parser_instance.localcontext) **parser_instance.localcontext)
except Exception: except Exception:
raise except_osv(_('Webkit render!'), raise except_osv(_('Webkit render!'),
exceptions.text_error_template().render()) exceptions.text_error_template().render())
@@ -283,8 +284,8 @@ class WebKitParser(report_sxw):
try : try :
foot = foot_mako_tpl.render(helper=helper, foot = foot_mako_tpl.render(helper=helper,
css=css, css=css,
_=self.translate_call, _=translate_call,
**self.parser_instance.localcontext) **parser_instance.localcontext)
except: except:
msg = exceptions.text_error_template().render() msg = exceptions.text_error_template().render()
_logger.error(msg) _logger.error(msg)
@@ -294,8 +295,8 @@ class WebKitParser(report_sxw):
deb = head_mako_tpl.render(helper=helper, deb = head_mako_tpl.render(helper=helper,
css=css, css=css,
_debug=tools.ustr("\n".join(htmls)), _debug=tools.ustr("\n".join(htmls)),
_=self.translate_call, _=translate_call,
**self.parser_instance.localcontext) **parser_instance.localcontext)
except Exception: except Exception:
msg = exceptions.text_error_template().render() msg = exceptions.text_error_template().render()
_logger.error(msg) _logger.error(msg)