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:
commit
6fdb783a37
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue