From 0122c05eff9525a8d79fec0460f5de8bf14c2eca Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 20 Jul 2016 13:52:06 +0200 Subject: [PATCH] [FIX] web: avoid report with invalid sheet name This commit does not fix any bug in odoo/odoo but helps fixing #12788 Needed for odoo/enterprise#433 --- addons/web/controllers/main.py | 7 +------ addons/web/controllers/pivot.py | 7 ++----- openerp/tools/misc.py | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index e864ccb5d5d..c6b8015267b 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -25,11 +25,6 @@ import werkzeug.utils import werkzeug.wrappers from openerp.api import Environment -try: - import xlwt -except ImportError: - xlwt = None - import openerp import openerp.modules.registry from openerp.addons.base.ir.ir_qweb import AssetsBundle, QWebTemplateNotFound @@ -37,7 +32,7 @@ from openerp.modules import get_resource_path from openerp.tools import topological_sort from openerp.tools.translate import _ from openerp.tools import ustr -from openerp.tools.misc import str2bool +from openerp.tools.misc import str2bool, xlwt from openerp import http from openerp.http import request, serialize_exception as _serialize_exception from openerp.exceptions import AccessError diff --git a/addons/web/controllers/pivot.py b/addons/web/controllers/pivot.py index 571cff94229..41c113bbbdd 100644 --- a/addons/web/controllers/pivot.py +++ b/addons/web/controllers/pivot.py @@ -1,13 +1,10 @@ from openerp import http import json from openerp.http import request, serialize_exception as _serialize_exception +from openerp.tools.misc import xlwt from cStringIO import StringIO from collections import deque -try: - import xlwt -except ImportError: - xlwt = None class TableExporter(http.Controller): @@ -21,7 +18,7 @@ class TableExporter(http.Controller): jdata = json.loads(data) nbr_measures = jdata['nbr_measures'] workbook = xlwt.Workbook() - worksheet = workbook.add_sheet(jdata['title'][:30]) + worksheet = workbook.add_sheet(jdata['title']) header_bold = xlwt.easyxf("font: bold on; pattern: pattern solid, fore_colour gray25;") header_plain = xlwt.easyxf("pattern: pattern solid, fore_colour gray25;") bold = xlwt.easyxf("font: bold on;") diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index a9f1398ca72..d59c46eebeb 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -14,6 +14,7 @@ import subprocess import logging import os import passlib.utils +import re import socket import sys import threading @@ -323,6 +324,26 @@ def topological_sort(elems): return result +try: + import xlwt + + # add some sanitizations to respect the excel sheet name restrictions + # as the sheet name is often translatable, can not control the input + class PatchedWorkbook(xlwt.Workbook): + def add_sheet(self, name): + # invalid Excel character: []:*?/\ + name = re.sub(r'[\[\]:*?/\\]', '', name) + + # maximum size is 31 characters + name = name[:31] + return super(PatchedWorkbook, self).add_sheet(name) + + xlwt.Workbook = PatchedWorkbook + +except ImportError: + xlwt = None + + class UpdateableStr(local): """ Class that stores an updateable string (used in wizards) """