From a82c18661195fe0cb0ef6faa238c1f5ece5e5793 Mon Sep 17 00:00:00 2001 From: Simon Lejeune Date: Thu, 27 Feb 2014 15:48:10 +0100 Subject: [PATCH] [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 --- addons/report/controllers/main.py | 27 +++++++++++++++++-- addons/report/models/report.py | 4 ++- .../report/static/src/js/qwebactionmanager.js | 20 +++++++++----- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/addons/report/controllers/main.py b/addons/report/controllers/main.py index 082bcc01c04..fb0f4c40afd 100644 --- a/addons/report/controllers/main.py +++ b/addons/report/controllers/main.py @@ -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 diff --git a/addons/report/models/report.py b/addons/report/models/report.py index e54e2b9a6a2..8a2bc21b3b0 100644 --- a/addons/report/models/report.py +++ b/addons/report/models/report.py @@ -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) diff --git a/addons/report/static/src/js/qwebactionmanager.js b/addons/report/static/src/js/qwebactionmanager.js index 615b3677c30..b2cc8313d7c 100644 --- a/addons/report/static/src/js/qwebactionmanager.js +++ b/addons/report/static/src/js/qwebactionmanager.js @@ -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);