Make report_webkit thread safe by removing parser_instance attribute, as a WebkitParser instance can be shared by multiple thread and thus we don't want a thread to erase parser_instance of anorther thread.

This commit is contained in:
Yannick Vaucher 2014-05-13 18:23:48 +02:00
parent c16d0fc456
commit 72ab3e81a5
1 changed files with 21 additions and 20 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)
@ -189,16 +189,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
@ -213,14 +213,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,
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
@ -250,17 +250,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()
@ -270,8 +271,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()
@ -281,9 +282,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())
@ -293,8 +294,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)
@ -304,8 +305,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)