diff --git a/addons/report_webkit/__init__.py b/addons/report_webkit/__init__.py index dd44517e787..2c23fd8ed90 100644 --- a/addons/report_webkit/__init__.py +++ b/addons/report_webkit/__init__.py @@ -36,5 +36,6 @@ import webkit_report import ir_report import wizard import convert +import report # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/report_webkit/report/__init__.py b/addons/report_webkit/report/__init__.py new file mode 100644 index 00000000000..d94586fedb1 --- /dev/null +++ b/addons/report_webkit/report/__init__.py @@ -0,0 +1,2 @@ + +import webkit_report_demo diff --git a/addons/report_webkit/report/webkit_report_demo.mako b/addons/report_webkit/report/webkit_report_demo.mako index 1729fe4217e..8e3b6094806 100644 --- a/addons/report_webkit/report/webkit_report_demo.mako +++ b/addons/report_webkit/report/webkit_report_demo.mako @@ -11,6 +11,7 @@ % endfor +

The administrator name is: ${admin_name}

If this report does not contain headers, it is because you have a badly compiled wkhtmltopdf. Consider installing the static version distributed on the official web site: https://code.google.com/p/wkhtmltopdf/.

diff --git a/addons/report_webkit/report/webkit_report_demo.py b/addons/report_webkit/report/webkit_report_demo.py new file mode 100644 index 00000000000..2d826c26ab5 --- /dev/null +++ b/addons/report_webkit/report/webkit_report_demo.py @@ -0,0 +1,11 @@ + + +from openerp.addons.report_webkit.webkit_report import webkit_report_extender +from openerp import SUPERUSER_ID + +@webkit_report_extender("report_webkit.webkit_demo_report") +def extend_demo(pool, cr, uid, localcontext, context): + admin = pool.get("res.users").browse(cr, uid, SUPERUSER_ID, context) + localcontext.update({ + "admin_name": admin.name, + }) diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index 3e4306f2690..f4f65e56596 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -87,6 +87,32 @@ def mako_template(text): return mako_template_env.from_string(text) +_extender_functions = {} + +def webkit_report_extender(report_name): + """ + A decorator to define functions to extend the context used in a template rendering. + report_name must be the xml id of the desired report (it is mandatory to indicate the + module in that xml id). + + The given function will be called at the creation of the report. The following arguments + will be passed to it (in this order): + - pool The model pool. + - cr The cursor. + - uid The user id. + - localcontext The context given to the template engine to render the templates for the + current report. This is the context that should be modified. + - context The OpenERP context. + """ + def fct1(fct): + lst = _extender_functions.get(report_name) + if not lst: + lst = [] + _extender_functions[report_name] = lst + lst.append(fct) + return fct + return fct1 + class WebKitParser(report_sxw): """Custom class that use webkit to render HTML reports Code partially taken from report openoffice. Thanks guys :) @@ -227,6 +253,17 @@ class WebKitParser(report_sxw): def create_single_pdf(self, cursor, uid, ids, data, report_xml, context=None): """generate the PDF""" + # just try to find an xml id for the report + cr = cursor + import openerp.pooler as pooler + pool = pooler.get_pool(cr.dbname) + found_xml_ids = pool.get("ir.model.data").search(cr, uid, [["model", "=", "ir.actions.report.xml"], \ + ["res_id", "=", report_xml.id]], context=context) + xml_id = None + if found_xml_ids: + xml_id = pool.get("ir.model.data").read(cr, uid, found_xml_ids[0], ["module", "name"]) + xml_id = "%s.%s" % (xml_id["module"], xml_id["name"]) + if context is None: context={} htmls = [] @@ -270,14 +307,22 @@ class WebKitParser(report_sxw): body_mako_tpl = mako_template(template) helper = WebKitHelper(cursor, uid, report_xml.id, context) + self.parser_instance.localcontext['helper'] = helper + self.parser_instance.localcontext['css'] = css + self.parser_instance.localcontext['_'] = self.translate_call + + # apply extender functions + additional = {} + if xml_id in _extender_functions: + for fct in _extender_functions[xml_id]: + fct(pool, cr, uid, self.parser_instance.localcontext, context) + if report_xml.precise_mode: - for obj in objs: - self.parser_instance.localcontext['objects'] = [obj] + ctx = dict(self.parser_instance.localcontext) + for obj in self.parser_instance.localcontext['objects']: + ctx['objects'] = [obj] try : - html = body_mako_tpl.render(dict({"helper":helper, - "css":css, - "_":self.translate_call}, - **self.parser_instance.localcontext)) + html = body_mako_tpl.render(dict(ctx)) htmls.append(html) except Exception, e: msg = u"%s" % e @@ -285,10 +330,7 @@ class WebKitParser(report_sxw): raise except_osv(_('Webkit render!'), msg) else: try : - html = body_mako_tpl.render(dict({"helper":helper, - "css":css, - "_":self.translate_call}, - **self.parser_instance.localcontext)) + html = body_mako_tpl.render(dict(self.parser_instance.localcontext)) htmls.append(html) except Exception: msg = u"%s" % e @@ -296,20 +338,14 @@ class WebKitParser(report_sxw): raise except_osv(_('Webkit render!'), msg) head_mako_tpl = mako_template(header) try : - head = head_mako_tpl.render(dict({"helper":helper, - "css":css, - "_":self.translate_call, - "_debug":False}, - **self.parser_instance.localcontext)) + head = head_mako_tpl.render(dict(self.parser_instance.localcontext, _debug=False)) except Exception, e: raise except_osv(_('Webkit render!'), u"%s" % e) foot = False if footer : foot_mako_tpl = mako_template(footer) try : - foot = foot_mako_tpl.render(dict({"helper":helper, - "css":css, - "_":self.translate_call}, + foot = foot_mako_tpl.render(dict({}, **self.parser_instance.localcontext)) except Exception, e: msg = u"%s" % e @@ -317,11 +353,7 @@ class WebKitParser(report_sxw): raise except_osv(_('Webkit render!'), msg) if report_xml.webkit_debug : try : - deb = head_mako_tpl.render(dict({"helper":helper, - "css":css, - "_":self.translate_call, - "_debug":tools.ustr("\n".join(htmls))}, - **self.parser_instance.localcontext)) + deb = head_mako_tpl.render(dict(self.parser_instance.localcontext, _debug=tools.ustr("\n".join(htmls)))) except Exception, e: msg = u"%s" % e _logger.error(msg)