From a0b42c1f74b1ad36f625f1d6845050843a41137b Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Fri, 9 Sep 2011 12:49:27 +0200 Subject: [PATCH 1/8] [IMP] report available in header and foot in report_webkit bzr revid: nicolas.bessi@camptocamp.com-20110909104927-xy9mcytpteiwi02w --- addons/report_webkit/webkit_report.py | 35 ++++++++------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index 406013cef12..23d0b44507c 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -306,16 +306,11 @@ class WebKitParser(report_sxw): raise except_osv(_('Webkit render'), msg) head_mako_tpl = mako_template(header) try : - head = head_mako_tpl.render( - company=company, - time=time, - helper=helper, + head = head_mako_tpl.render(helper=helper, css=css, - formatLang=self.formatLang, - setLang=self.setLang, _=self.translate_call, - _debug=False - ) + _debug=False, + **self.parser_instance.localcontext) except Exception, e: raise except_osv(_('Webkit render'), exceptions.text_error_template().render()) @@ -323,31 +318,21 @@ class WebKitParser(report_sxw): if footer : foot_mako_tpl = mako_template(footer) try : - foot = foot_mako_tpl.render( - company=company, - time=time, - helper=helper, + foot = foot_mako_tpl.render(helper=helper, css=css, - formatLang=self.formatLang, - setLang=self.setLang, _=self.translate_call, - ) + **self.parser_instance.localcontext) 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 : try : - deb = head_mako_tpl.render( - company=company, - time=time, - helper=helper, - css=css, - _debug=tools.ustr(html), - formatLang=self.formatLang, - setLang=self.setLang, - _=self.translate_call, - ) + deb = head_mako_tpl.render(helper=helper, + css=css, + _debug=tools.ustr(html), + _=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) From 92b3106212de2a109a769d3442b1a9700c3e1cbd Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Fri, 9 Sep 2011 12:59:01 +0200 Subject: [PATCH 2/8] [IMP] Layer of report webkit bzr revid: nicolas.bessi@camptocamp.com-20110909105901-9odsx3p030znn6qc --- addons/report_webkit/header_view.xml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/report_webkit/header_view.xml b/addons/report_webkit/header_view.xml index d3e9363acd7..bc643a0a28c 100644 --- a/addons/report_webkit/header_view.xml +++ b/addons/report_webkit/header_view.xml @@ -24,13 +24,8 @@ - - - - - - - + + @@ -38,6 +33,15 @@ + + + + + + + + + From 4d26cf1cf0a77ef240fc8113868102c563d099c6 Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Wed, 21 Sep 2011 09:49:42 +0200 Subject: [PATCH 3/8] =?UTF-8?q?[IMP]=C2=A0support=20precise=20mode=20+=20g?= =?UTF-8?q?et=20ride=20of=20notify=20channel=20+=20small=20refactoring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bzr revid: nicolas.bessi@camptocamp.com-20110921074942-9zukri77gv8eeofd --- addons/report_webkit/ir_report.py | 3 + addons/report_webkit/ir_report_view.xml | 1 + .../security/ir.model.access.csv | 4 +- addons/report_webkit/webkit_report.py | 99 +++++++++---------- 4 files changed, 53 insertions(+), 54 deletions(-) diff --git a/addons/report_webkit/ir_report.py b/addons/report_webkit/ir_report.py index e6f4a81f9e7..e5b4156a348 100644 --- a/addons/report_webkit/ir_report.py +++ b/addons/report_webkit/ir_report.py @@ -130,6 +130,9 @@ class ReportXML(osv.osv): ), 'webkit_debug' : fields.boolean('Webkit debug', help="Enable the webkit engine debugger"), 'report_webkit_data': fields.text('Webkit Template', help="This template will be used if the main report file is not found"), + 'precise_mode':fields.boolean('Precise Mode', help='This mode allow more precise element \ + position as each object is printed on a separate HTML.\ + but memory and disk usage is wider') } ReportXML() diff --git a/addons/report_webkit/ir_report_view.xml b/addons/report_webkit/ir_report_view.xml index e92c5a5345b..1d60f6a873d 100644 --- a/addons/report_webkit/ir_report_view.xml +++ b/addons/report_webkit/ir_report_view.xml @@ -10,6 +10,7 @@ + diff --git a/addons/report_webkit/security/ir.model.access.csv b/addons/report_webkit/security/ir.model.access.csv index 850a202512e..6c626f9873e 100644 --- a/addons/report_webkit/security/ir.model.access.csv +++ b/addons/report_webkit/security/ir.model.access.csv @@ -1,3 +1,3 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_ir_header_webkit","ir.header_webkit","model_ir_header_webkit",,1,,, -"access_ir_header_img","ir.header_img","model_ir_header_img",,,,, +"access_ir_header_webkit","ir.header_webkit","model_ir_header_webkit",,1,,1, +"access_ir_header_img","ir.header_img","model_ir_header_img",,1,,1, \ No newline at end of file diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index 23d0b44507c..e72984ac96f 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -35,8 +35,11 @@ import os import report import tempfile import time +import logging + from mako.template import Template from mako import exceptions + import netsvc import pooler from report_helper import WebKitHelper @@ -46,6 +49,7 @@ import tools from tools.translate import _ from osv.osv import except_osv +logger = logging.getLogger('report_webkit') def mako_template(text): """Build a Mako template. @@ -186,7 +190,8 @@ class WebKitParser(report_sxw): def translate_call(self, src): """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) + 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 @@ -222,22 +227,20 @@ class WebKitParser(report_sxw): return lang_obj.format('%.' + str(digits) + 'f', value, grouping=grouping, monetary=monetary) - # override needed to keep the attachments' storing procedure + # override needed to keep the attachments storing procedure def create_single_pdf(self, cursor, uid, ids, data, report_xml, context=None): """generate the PDF""" if context is None: context={} - + htmls = [] 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, - context=context - ) + self.parser_instance = self.parser(cursor, + uid, + self.name2, + context=context) self.pool = pooler.get_pool(cursor.dbname) objs = self.getObjects(cursor, uid, ids, context) @@ -261,30 +264,10 @@ class WebKitParser(report_sxw): _('Please set a header in company settings') ) if not report_xml.header : - #I know it could be cleaner ... - header = u""" - - - - - - - - -""" + header = '' + defaut_head = addons.get_module_resource('report_webkit', 'default_header.html') + with open(defaut_head,'r') as f: + header = f.read() css = report_xml.webkit_header.css if not css : css = '' @@ -294,16 +277,30 @@ class WebKitParser(report_sxw): #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) - 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) + if report_xml.precise_mode: + for obj in objs: + self.parser_instance.localcontext['objects'] = [obj] + try : + html = body_mako_tpl.render(helper=helper, + css=css, + _=self.translate_call, + **self.parser_instance.localcontext) + htmls.append(html) + except Exception, e: + msg = exceptions.text_error_template().render() + logger.error(msg) + raise except_osv(_('Webkit render'), msg) + else: + try : + html = body_mako_tpl.render(helper=helper, + css=css, + _=self.translate_call, + **self.parser_instance.localcontext) + htmls.append(html) + except Exception, e: + msg = exceptions.text_error_template().render() + logger.error(msg) + raise except_osv(_('Webkit render'), msg) head_mako_tpl = mako_template(header) try : head = head_mako_tpl.render(helper=helper, @@ -324,7 +321,7 @@ class WebKitParser(report_sxw): **self.parser_instance.localcontext) except: msg = exceptions.text_error_template().render() - netsvc.Logger().notifyChannel('Webkit render', netsvc.LOG_ERROR, msg) + logger.error(msg) raise except_osv(_('Webkit render'), msg) if report_xml.webkit_debug : try : @@ -335,11 +332,11 @@ class WebKitParser(report_sxw): **self.parser_instance.localcontext) except Exception, e: msg = exceptions.text_error_template().render() - netsvc.Logger().notifyChannel('Webkit render', netsvc.LOG_ERROR, msg) + logger.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]) + pdf = self.generate_pdf(bin, report_xml, head, foot, htmls) return (pdf, 'pdf') @@ -352,12 +349,10 @@ class WebKitParser(report_sxw): [('report_name', '=', self.name[7:])], context=context) if report_xml_ids: - report_xml = ir_obj.browse( - cursor, - uid, - report_xml_ids[0], - context=context - ) + report_xml = ir_obj.browse(cursor, + uid, + report_xml_ids[0], + context=context) report_xml.report_rml = None report_xml.report_rml_content = None report_xml.report_sxw_content_data = None From 73adeb660c18890105d7747d2b54360016698eee Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Wed, 21 Sep 2011 10:14:51 +0200 Subject: [PATCH 4/8] [IMP] trailing spaces bzr revid: nicolas.bessi@camptocamp.com-20110921081451-9bdq6wvtjvxbqv3l --- addons/report_webkit/webkit_report.py | 50 +++++++++++++-------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index e72984ac96f..d91b8451075 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- ############################################################################## # -# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) +# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com) # All Right Reserved # # Author : Nicolas Bessi (Camptocamp) @@ -64,12 +64,12 @@ class WebKitParser(report_sxw): """Custom class that use webkit to render HTML reports Code partially taken from report openoffice. Thanks guys :) """ - - def __init__(self, name, table, rml=False, parser=False, + + 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, + report_sxw.__init__(self, name, table, rml, parser, header, store) def get_lib(self, cursor, uid, company) : @@ -85,7 +85,7 @@ class WebKitParser(report_sxw): ' http://code.google.com/p/wkhtmltopdf/downloads/list and set the'+ ' path to the executable on the Company form.'+ 'Minimal version is 0.9.9') - ) + ) if os.path.isabs(path) : if (os.path.exists(path) and os.access(path, os.X_OK)\ and os.path.basename(path).startswith('wkhtmltopdf')): @@ -122,7 +122,7 @@ class WebKitParser(report_sxw): head_file = file( os.path.join( tmp_dir, str(time.time()) + '.head.html' - ), + ), 'w' ) head_file.write(header) @@ -133,14 +133,14 @@ class WebKitParser(report_sxw): foot_file = file( os.path.join( tmp_dir, str(time.time()) + '.foot.html' - ), + ), 'w' ) foot_file.write(footer) foot_file.close() file_to_del.append(foot_file.name) command.extend(['--footer-html', foot_file.name]) - + if webkit_header.margin_top : command.extend(['--margin-top', str(webkit_header.margin_top).replace(',', '.')]) if webkit_header.margin_bottom : @@ -167,7 +167,7 @@ class WebKitParser(report_sxw): status = subprocess.call(command, stderr=subprocess.PIPE) # ignore stderr if status : raise except_osv( - _('Webkit raise an error' ), + _('Webkit raise an error' ), status ) except Exception: @@ -180,8 +180,8 @@ class WebKitParser(report_sxw): os.unlink(out) return pdf - - + + def setLang(self, lang): if not lang: lang = 'en_US' @@ -194,8 +194,8 @@ class WebKitParser(report_sxw): 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): """format using the know cursor, language from localcontext""" if digits is None: @@ -204,7 +204,7 @@ class WebKitParser(report_sxw): return '' pool_lang = self.pool.get('res.lang') lang = self.localcontext['lang'] - + lang_ids = pool_lang.search(self.parser_instance.cr, self.parser_instance.uid, [('code','=',lang)])[0] lang_obj = pool_lang.browse(self.parser_instance.cr, self.parser_instance.uid, lang_ids) @@ -230,7 +230,7 @@ class WebKitParser(report_sxw): # override needed to keep the attachments storing procedure def create_single_pdf(self, cursor, uid, ids, data, report_xml, context=None): """generate the PDF""" - + if context is None: context={} htmls = [] @@ -259,10 +259,10 @@ class WebKitParser(report_sxw): header = report_xml.webkit_header.html footer = report_xml.webkit_header.footer_html if not header and report_xml.header: - raise except_osv( - _('No header defined for this Webkit report!'), - _('Please set a header in company settings') - ) + raise except_osv( + _('No header defined for this Webkit report!'), + _('Please set a header in company settings') + ) if not report_xml.header : header = '' defaut_head = addons.get_module_resource('report_webkit', 'default_header.html') @@ -273,7 +273,7 @@ class WebKitParser(report_sxw): css = '' user = self.pool.get('res.users').browse(cursor, uid, uid) company= user.company_id - + #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) @@ -327,7 +327,7 @@ class WebKitParser(report_sxw): try : deb = head_mako_tpl.render(helper=helper, css=css, - _debug=tools.ustr(html), + _debug=tools.ustr("\n".join(htmls)), _=self.translate_call, **self.parser_instance.localcontext) except Exception, e: @@ -348,10 +348,10 @@ class WebKitParser(report_sxw): report_xml_ids = ir_obj.search(cursor, uid, [('report_name', '=', self.name[7:])], context=context) if report_xml_ids: - - report_xml = ir_obj.browse(cursor, - uid, - report_xml_ids[0], + + report_xml = ir_obj.browse(cursor, + uid, + report_xml_ids[0], context=context) report_xml.report_rml = None report_xml.report_rml_content = None From 97892fb72d21938cefe58b8095ece3e1962ef1aa Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Wed, 21 Sep 2011 10:15:46 +0200 Subject: [PATCH 5/8] [FIX] typo bzr revid: nicolas.bessi@camptocamp.com-20110921081546-uwwc9nx71pr6u742 --- addons/report_webkit/webkit_report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index d91b8451075..bda6c193af2 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -265,8 +265,8 @@ class WebKitParser(report_sxw): ) if not report_xml.header : header = '' - defaut_head = addons.get_module_resource('report_webkit', 'default_header.html') - with open(defaut_head,'r') as f: + default_head = addons.get_module_resource('report_webkit', 'default_header.html') + with open(default_head,'r') as f: header = f.read() css = report_xml.webkit_header.css if not css : From 31204f5247dedabd572e798ee44aa8d1c61e4f12 Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Wed, 21 Sep 2011 10:16:11 +0200 Subject: [PATCH 6/8] =?UTF-8?q?[ADD]=C2=A0default=20header.html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bzr revid: nicolas.bessi@camptocamp.com-20110921081611-3p75ty254t88xcg9 --- addons/report_webkit/default_header.html | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 addons/report_webkit/default_header.html diff --git a/addons/report_webkit/default_header.html b/addons/report_webkit/default_header.html new file mode 100644 index 00000000000..0798209a5b7 --- /dev/null +++ b/addons/report_webkit/default_header.html @@ -0,0 +1,22 @@ + + + + + + + + + \ No newline at end of file From 4772d465fd7c5df58ec7244deddd634426698477 Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Wed, 21 Sep 2011 10:44:13 +0200 Subject: [PATCH 7/8] =?UTF-8?q?[FIX]=C2=A0author?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bzr revid: nicolas.bessi@camptocamp.com-20110921084413-6cdm16i96ufwoelx --- addons/report_webkit/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/report_webkit/__openerp__.py b/addons/report_webkit/__openerp__.py index e593791f826..1e0e780786d 100644 --- a/addons/report_webkit/__openerp__.py +++ b/addons/report_webkit/__openerp__.py @@ -73,7 +73,7 @@ Web client WYSIWYG """, "version" : "0.9", "depends" : ["base"], - "author" : "Camptocamp SA - NBessi", + "author" : "Camptocamp", "category": "Tools", "url": "http://http://www.camptocamp.com/", "data": [ "security/ir.model.access.csv", From 339d6c856a4b08e87bb973f150002f8b626f4fb5 Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Wed, 12 Oct 2011 10:33:50 +0200 Subject: [PATCH 8/8] =?UTF-8?q?[FIX]=C2=A0translation=20and=20formatting?= =?UTF-8?q?=20support=20in=20report=5Fwebkit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bzr revid: nicolas.bessi@camptocamp.com-20111012083350-lgzjye93lqp2nhkr --- addons/report_webkit/webkit_report.py | 39 +-------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index bda6c193af2..8d6373e412b 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -181,52 +181,15 @@ class WebKitParser(report_sxw): os.unlink(out) return pdf - - def setLang(self, lang): - if not lang: - lang = 'en_US' - self.localcontext['lang'] = lang - def translate_call(self, src): """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) + self.name, 'report', self.parser_instance.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): - """format using the know cursor, language from localcontext""" - if digits is None: - digits = self.parser_instance.get_digits(value) - if isinstance(value, (str, unicode)) and not value: - return '' - pool_lang = self.pool.get('res.lang') - lang = self.localcontext['lang'] - - lang_ids = pool_lang.search(self.parser_instance.cr, self.parser_instance.uid, [('code','=',lang)])[0] - lang_obj = pool_lang.browse(self.parser_instance.cr, self.parser_instance.uid, lang_ids) - - if date or date_time: - if not str(value): - return '' - - date_format = lang_obj.date_format - parse_format = '%Y-%m-%d' - if date_time: - value=value.split('.')[0] - date_format = date_format + " " + lang_obj.time_format - parse_format = '%Y-%m-%d %H:%M:%S' - if not isinstance(value, time.struct_time): - return time.strftime(date_format, time.strptime(value, parse_format)) - - else: - date = datetime(*value.timetuple()[:6]) - return date.strftime(date_format) - - return lang_obj.format('%.' + str(digits) + 'f', value, grouping=grouping, monetary=monetary) - # override needed to keep the attachments storing procedure def create_single_pdf(self, cursor, uid, ids, data, report_xml, context=None): """generate the PDF"""