diff --git a/addons/report_webkit/ir_report.py b/addons/report_webkit/ir_report.py index b3155b25430..8f89fb51698 100644 --- a/addons/report_webkit/ir_report.py +++ b/addons/report_webkit/ir_report.py @@ -38,8 +38,12 @@ def register_report(name, model, tmpl_path, parser=rml_parse): "Register the report into the services" name = 'report.%s' % name if netsvc.Service._services.get(name, False): - if hasattr(netsvc.Service._services[name], 'parser'): - parser = netsvc.Service._services[name].parser + service = netsvc.Service._services[name] + if isinstance(service, WebKitParser): + #already instantiated properly, skip it + return + if hasattr(service, 'parser'): + parser = service.parser del netsvc.Service._services[name] WebKitParser(name, model, tmpl_path, parser=parser) diff --git a/addons/report_webkit/report_helper.py b/addons/report_webkit/report_helper.py index 80896fa4ba2..db0c1c372fc 100644 --- a/addons/report_webkit/report_helper.py +++ b/addons/report_webkit/report_helper.py @@ -51,7 +51,7 @@ class WebKitHelper(object): height = 'width="%spx"'%(height) else : height = ' ' - toreturn = ''%( + toreturn = ''%( width, height, type, diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index c95a9ce5e2e..2944b768643 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -35,7 +35,7 @@ import report import tempfile import time from mako.template import Template - +from mako import exceptions import netsvc import pooler from report_helper import WebKitHelper @@ -84,8 +84,10 @@ class WebKitParser(report_sxw): _('path to Wkhtmltopdf is not absolute'), 'for path %s'%(path) ) - def generate_pdf(self, comm_path, report_xml, header, footer, html_list): + def generate_pdf(self, comm_path, report_xml, header, footer, html_list, webkit_header=False): """Call webkit in order to generate pdf""" + if not webkit_header: + webkit_header = report_xml.webkit_header tmp_dir = tempfile.gettempdir() out = report_xml.name+str(time.time())+'.pdf' out = os.path.join(tmp_dir, out.replace(' ','')) @@ -95,7 +97,7 @@ class WebKitParser(report_sxw): command = [comm_path] else: command = ['wkhtmltopdf'] - + command.append('-q') if header : head_file = file( os.path.join( @@ -120,20 +122,22 @@ class WebKitParser(report_sxw): file_to_del.append(foot_file.name) command.append("--footer-html '%s'"%(foot_file.name)) - if report_xml.webkit_header.margin_top : - command.append('--margin-top %s'%(report_xml.webkit_header.margin_top)) - if report_xml.webkit_header.margin_bottom : - command.append('--margin-bottom %s'%(report_xml.webkit_header.margin_bottom)) - if report_xml.webkit_header.margin_left : - command.append('--margin-left %s'%(report_xml.webkit_header.margin_left)) - if report_xml.webkit_header.margin_right : - command.append('--margin-right %s'%(report_xml.webkit_header.margin_right)) - if report_xml.webkit_header.orientation : - command.append("--orientation '%s'"%(report_xml.webkit_header.orientation)) - if report_xml.webkit_header.format : - command.append(" --page-size '%s'"%(report_xml.webkit_header.format)) + if webkit_header.margin_top : + command.append('--margin-top %s'%(webkit_header.margin_top)) + if webkit_header.margin_bottom : + command.append('--margin-bottom %s'%(webkit_header.margin_bottom)) + if webkit_header.margin_left : + command.append('--margin-left %s'%(webkit_header.margin_left)) + if webkit_header.margin_right : + command.append('--margin-right %s'%(webkit_header.margin_right)) + if webkit_header.orientation : + command.append("--orientation '%s'"%(webkit_header.orientation)) + if webkit_header.format : + command.append(" --page-size '%s'"%(webkit_header.format)) + count = 0 for html in html_list : - html_file = file(os.path.join(tmp_dir, str(time.time()) + '.body.html'), 'w') + html_file = file(os.path.join(tmp_dir, str(time.time()) + str(count) +'.body.html'), 'w') + count += 1 html_file.write(html) html_file.close() file_to_del.append(html_file.name) @@ -168,6 +172,8 @@ class WebKitParser(report_sxw): """Translate String.""" ir_translation = self.pool.get('ir.translation') res = ir_translation._get_source(self.parser_instance.cr, self.parser_instance.uid, self.name, 'report', self.localcontext.get('lang', 'en_US'), src) + if not res : + return src return res def formatLang(self, value, digits=None, date=False, date_time=False, grouping=True, monetary=False): @@ -207,14 +213,14 @@ class WebKitParser(report_sxw): if context is None: context={} - + 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, + cursor, + uid, + self.name2, context=context ) @@ -272,45 +278,64 @@ class WebKitParser(report_sxw): #default_filters=['unicode', 'entity'] can be used to set global filter body_mako_tpl = Template(template ,input_encoding='utf-8') helper = WebKitHelper(cursor, uid, report_xml.id, context) - html = body_mako_tpl.render( helper=helper, - css=css, - _=self.translate_call, - **self.parser_instance.localcontext - ) + try : + html = body_mako_tpl.render( helper=helper, + css=css, + _=self.translate_call, + **self.parser_instance.localcontext + ) + except Exception, e: + msg = exceptions.text_error_template().render() + netsvc.Logger().notifyChannel('Webkit render', netsvc.LOG_ERROR, msg) + raise except_osv(_('Webkit render'), msg) head_mako_tpl = Template(header, input_encoding='utf-8') - head = head_mako_tpl.render( - company=company, - time=time, - helper=helper, - css=css, - formatLang=self.formatLang, - setLang=self.setLang, - _=self.translate_call, - _debug=False - ) + try : + head = head_mako_tpl.render( + company=company, + time=time, + helper=helper, + css=css, + formatLang=self.formatLang, + setLang=self.setLang, + _=self.translate_call, + _debug=False + ) + except Exception, e: + raise except_osv(_('Webkit render'), + exceptions.text_error_template().render()) foot = False if footer : foot_mako_tpl = Template(footer ,input_encoding='utf-8') - foot = foot_mako_tpl.render( - company=company, - time=time, - helper=helper, - css=css, - formatLang=self.formatLang, - setLang=self.setLang, - _=self.translate_call, - ) + try : + foot = foot_mako_tpl.render( + company=company, + time=time, + helper=helper, + css=css, + formatLang=self.formatLang, + setLang=self.setLang, + _=self.translate_call, + ) + except: + msg = exceptions.text_error_template().render() + netsvc.Logger().notifyChannel('Webkit render', netsvc.LOG_ERROR, msg) + raise except_osv(_('Webkit render'), msg) if report_xml.webkit_debug : - deb = head_mako_tpl.render( - company=company, - time=time, - helper=helper, - css=css, - _debug=html, - formatLang=self.formatLang, - setLang=self.setLang, - _=self.translate_call, - ) + try : + deb = head_mako_tpl.render( + company=company, + time=time, + helper=helper, + css=css, + _debug=html, + formatLang=self.formatLang, + setLang=self.setLang, + _=self.translate_call, + ) + except Exception, e: + msg = exceptions.text_error_template().render() + netsvc.Logger().notifyChannel('Webkit render', netsvc.LOG_ERROR, msg) + raise except_osv(_('Webkit render'), msg) return (deb, 'html') bin = self.get_lib(cursor, uid, company.id) pdf = self.generate_pdf(bin, report_xml, head, foot, [html])