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"""