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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user