[IMP] Added a route to check presence and version of wkhtmltopdf. If the soft is not present, qweb-pdf fallback on qweb-html mode.

bzr revid: sle@openerp.com-20140227144810-d14iwu5pudmrshh9
This commit is contained in:
Simon Lejeune 2014-02-27 15:48:10 +01:00
parent c8ebe2dc8a
commit a82c186611
3 changed files with 42 additions and 9 deletions

View File

@ -39,6 +39,7 @@ except ImportError:
import psutil
import signal
import os
from distutils.version import LooseVersion
from pyPdf import PdfFileWriter, PdfFileReader
@ -270,7 +271,7 @@ class Report(http.Controller):
:param save_in_attachment: dict of reports to save/load in/from the db
:returns: Content of the pdf as a string
"""
command = ['wkhtmltopdf-0.12']
command = ['wkhtmltopdf']
tmp_dir = tempfile.gettempdir()
command_args = []
@ -345,7 +346,7 @@ class Report(http.Controller):
if process.returncode != 0:
raise except_osv(_('Report (PDF)'),
_('wkhtmltopdf-0.12 failed with error code = %s. '
_('wkhtmltopdf failed with error code = %s. '
'Message: %s') % (str(process.returncode), err))
# Save the pdf in attachment if marked
@ -511,3 +512,25 @@ class Report(http.Controller):
response.headers.add('Content-Length', len(file))
response.set_cookie('fileToken', token)
return response
@http.route('/report/check_wkhtmltopdf/', type='json', auth="user")
def check_wkhtmltopdf(self):
"""Check the presence of wkhtmltopdf and return its version. If wkhtmltopdf
cannot be found, return False.
"""
try:
process = subprocess.Popen(['wkhtmltopdf', '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if err:
raise
version = out.splitlines()[1].strip()
version = version.split(' ')[1]
if LooseVersion(version) < LooseVersion('0.12.0'):
_logger.warning('Upgrade WKHTMLTOPDF to (at least) 0.12.0')
return True
except:
_logger.error('You need WKHTMLTOPDF to print a pdf version of this report.')
return False

View File

@ -258,8 +258,10 @@ class report(osv.Model):
dict_param[key] = False
elif value.lower() == 'true':
dict_param[key] = True
elif ',' in value or '%2C' in value:
elif ',' in value:
dict_param[key] = [int(i) for i in value.split(',')]
elif '%2C' in value:
dict_param[key] = [int(i) for i in value.split('%2C')]
else:
try:
i = int(value)

View File

@ -58,13 +58,21 @@ openerp.report = function(instance) {
response[0] = report_url
response[1] = action.report_type
this.session.get_file({
url: '/report/download',
data: {data: JSON.stringify(response)},
complete: openerp.web.unblockUI,
error: c.rpc_error.bind(c)
openerp.session.rpc('/report/check_wkhtmltopdf').then(function (presence) {
// Fallback of qweb-pdf if wkhtmltopdf is not installed
if (!presence && action.report_type == 'qweb-pdf') {
window.open(report_url.substring(12), '_blank', 'height=768,width=1024');
instance.web.unblockUI();
}
else {
self.session.get_file({
url: '/report/download',
data: {data: JSON.stringify(response)},
complete: openerp.web.unblockUI,
error: c.rpc_error.bind(c)
});
}
});
return;
}
} else {
return self._super(action, options);