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
commit 6fdb783a37
1 changed files with 24 additions and 23 deletions

View File

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