summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Trigaux <mat@odoo.com>2016-07-20 13:52:06 +0200
committerMartin Trigaux <mat@odoo.com>2016-08-19 15:28:27 +0200
commit0122c05eff9525a8d79fec0460f5de8bf14c2eca (patch)
tree7c2c4e225280cd85342354922ab3265502d75fe0
parentf571ba373a88fbe0c176de922aca7363298d1c07 (diff)
[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
-rw-r--r--addons/web/controllers/main.py7
-rw-r--r--addons/web/controllers/pivot.py7
-rw-r--r--openerp/tools/misc.py21
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)
"""