[MERGE+FIX] merged improvements to report_webkit from Nicolas Bessi (C2C), after review

Also made the report_webkit registration system be less eager to replace the report instances, so report instances can override the engine sometimes

bzr revid: odo@openerp.com-20101207182154-pqw7ny8cpmodr0lv
This commit is contained in:
Olivier Dony 2010-12-07 19:21:54 +01:00
commit 3af41c626c
3 changed files with 86 additions and 57 deletions

View File

@ -38,8 +38,12 @@ def register_report(name, model, tmpl_path, parser=rml_parse):
"Register the report into the services" "Register the report into the services"
name = 'report.%s' % name name = 'report.%s' % name
if netsvc.Service._services.get(name, False): if netsvc.Service._services.get(name, False):
if hasattr(netsvc.Service._services[name], 'parser'): service = netsvc.Service._services[name]
parser = netsvc.Service._services[name].parser if isinstance(service, WebKitParser):
#already instantiated properly, skip it
return
if hasattr(service, 'parser'):
parser = service.parser
del netsvc.Service._services[name] del netsvc.Service._services[name]
WebKitParser(name, model, tmpl_path, parser=parser) WebKitParser(name, model, tmpl_path, parser=parser)

View File

@ -51,7 +51,7 @@ class WebKitHelper(object):
height = 'width="%spx"'%(height) height = 'width="%spx"'%(height)
else : else :
height = ' ' height = ' '
toreturn = '<img %s %s src="data:image/%s;base64,%s">'%( toreturn = '<img %s %s src="data:image/%s;base64,%s" />'%(
width, width,
height, height,
type, type,

View File

@ -35,7 +35,7 @@ import report
import tempfile import tempfile
import time import time
from mako.template import Template from mako.template import Template
from mako import exceptions
import netsvc import netsvc
import pooler import pooler
from report_helper import WebKitHelper from report_helper import WebKitHelper
@ -84,8 +84,10 @@ class WebKitParser(report_sxw):
_('path to Wkhtmltopdf is not absolute'), _('path to Wkhtmltopdf is not absolute'),
'for path %s'%(path) '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""" """Call webkit in order to generate pdf"""
if not webkit_header:
webkit_header = report_xml.webkit_header
tmp_dir = tempfile.gettempdir() tmp_dir = tempfile.gettempdir()
out = report_xml.name+str(time.time())+'.pdf' out = report_xml.name+str(time.time())+'.pdf'
out = os.path.join(tmp_dir, out.replace(' ','')) out = os.path.join(tmp_dir, out.replace(' ',''))
@ -95,7 +97,7 @@ class WebKitParser(report_sxw):
command = [comm_path] command = [comm_path]
else: else:
command = ['wkhtmltopdf'] command = ['wkhtmltopdf']
command.append('-q') command.append('-q')
if header : if header :
head_file = file( os.path.join( head_file = file( os.path.join(
@ -120,20 +122,22 @@ class WebKitParser(report_sxw):
file_to_del.append(foot_file.name) file_to_del.append(foot_file.name)
command.append("--footer-html '%s'"%(foot_file.name)) command.append("--footer-html '%s'"%(foot_file.name))
if report_xml.webkit_header.margin_top : if webkit_header.margin_top :
command.append('--margin-top %s'%(report_xml.webkit_header.margin_top)) command.append('--margin-top %s'%(webkit_header.margin_top))
if report_xml.webkit_header.margin_bottom : if webkit_header.margin_bottom :
command.append('--margin-bottom %s'%(report_xml.webkit_header.margin_bottom)) command.append('--margin-bottom %s'%(webkit_header.margin_bottom))
if report_xml.webkit_header.margin_left : if webkit_header.margin_left :
command.append('--margin-left %s'%(report_xml.webkit_header.margin_left)) command.append('--margin-left %s'%(webkit_header.margin_left))
if report_xml.webkit_header.margin_right : if webkit_header.margin_right :
command.append('--margin-right %s'%(report_xml.webkit_header.margin_right)) command.append('--margin-right %s'%(webkit_header.margin_right))
if report_xml.webkit_header.orientation : if webkit_header.orientation :
command.append("--orientation '%s'"%(report_xml.webkit_header.orientation)) command.append("--orientation '%s'"%(webkit_header.orientation))
if report_xml.webkit_header.format : if webkit_header.format :
command.append(" --page-size '%s'"%(report_xml.webkit_header.format)) command.append(" --page-size '%s'"%(webkit_header.format))
count = 0
for html in html_list : 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.write(html)
html_file.close() html_file.close()
file_to_del.append(html_file.name) file_to_del.append(html_file.name)
@ -168,6 +172,8 @@ class WebKitParser(report_sxw):
"""Translate String.""" """Translate String."""
ir_translation = self.pool.get('ir.translation') 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) 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 return res
def formatLang(self, value, digits=None, date=False, date_time=False, grouping=True, monetary=False): 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: if context is None:
context={} context={}
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( self.parser_instance = self.parser(
cursor, cursor,
uid, uid,
self.name2, self.name2,
context=context context=context
) )
@ -272,45 +278,64 @@ class WebKitParser(report_sxw):
#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 = Template(template ,input_encoding='utf-8') body_mako_tpl = Template(template ,input_encoding='utf-8')
helper = WebKitHelper(cursor, uid, report_xml.id, context) helper = WebKitHelper(cursor, uid, report_xml.id, context)
html = body_mako_tpl.render( helper=helper, try :
css=css, html = body_mako_tpl.render( helper=helper,
_=self.translate_call, css=css,
**self.parser_instance.localcontext _=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_mako_tpl = Template(header, input_encoding='utf-8')
head = head_mako_tpl.render( try :
company=company, head = head_mako_tpl.render(
time=time, company=company,
helper=helper, time=time,
css=css, helper=helper,
formatLang=self.formatLang, css=css,
setLang=self.setLang, formatLang=self.formatLang,
_=self.translate_call, setLang=self.setLang,
_debug=False _=self.translate_call,
) _debug=False
)
except Exception, e:
raise except_osv(_('Webkit render'),
exceptions.text_error_template().render())
foot = False foot = False
if footer : if footer :
foot_mako_tpl = Template(footer ,input_encoding='utf-8') foot_mako_tpl = Template(footer ,input_encoding='utf-8')
foot = foot_mako_tpl.render( try :
company=company, foot = foot_mako_tpl.render(
time=time, company=company,
helper=helper, time=time,
css=css, helper=helper,
formatLang=self.formatLang, css=css,
setLang=self.setLang, formatLang=self.formatLang,
_=self.translate_call, 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 : if report_xml.webkit_debug :
deb = head_mako_tpl.render( try :
company=company, deb = head_mako_tpl.render(
time=time, company=company,
helper=helper, time=time,
css=css, helper=helper,
_debug=html, css=css,
formatLang=self.formatLang, _debug=html,
setLang=self.setLang, formatLang=self.formatLang,
_=self.translate_call, 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') return (deb, 'html')
bin = self.get_lib(cursor, uid, company.id) bin = self.get_lib(cursor, uid, company.id)
pdf = self.generate_pdf(bin, report_xml, head, foot, [html]) pdf = self.generate_pdf(bin, report_xml, head, foot, [html])