From 6243d1885239961846f499f6cf8ef27dc2a7d9fe Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 31 Mar 2014 17:17:49 +0200 Subject: [PATCH 1/3] [FIX] export: Excel data should be in raw format to be handle correctly lp bug: https://launchpad.net/bugs/844569 fixed bzr revid: mat@openerp.com-20140331151749-cx333j01f1hw5ya8 --- addons/web/controllers/main.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index fb6cded7c2d..21e27a63d08 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -32,7 +32,7 @@ except ImportError: import openerp import openerp.modules.registry from openerp.tools.translate import _ -from openerp import http +from openerp import http, tools from openerp.http import request, serialize_exception as _serialize_exception @@ -1679,6 +1679,8 @@ class Export(http.Controller): for k, v in self.fields_info(model, export_fields).iteritems()) class ExportFormat(object): + raw_data = True + @property def content_type(self): """ Provides the format's content type """ @@ -1711,7 +1713,7 @@ class ExportFormat(object): ids = ids or Model.search(domain, 0, False, False, request.context) field_names = map(operator.itemgetter('name'), fields) - import_data = Model.export_data(ids, field_names, request.context).get('datas',[]) + import_data = Model.export_data(ids, field_names, self.raw_data, context=request.context).get('datas',[]) if import_compat: columns_headers = field_names @@ -1764,6 +1766,8 @@ class CSVExport(ExportFormat, http.Controller): return data class ExcelExport(ExportFormat, http.Controller): + # Excel needs raw data to correctly handle numbers and date values + raw_data = True @http.route('/web/export/xls', type='http', auth="user") @serialize_exception @@ -1785,14 +1789,20 @@ class ExcelExport(ExportFormat, http.Controller): worksheet.write(0, i, fieldname) worksheet.col(i).width = 8000 # around 220 pixels - style = xlwt.easyxf('align: wrap yes') + base_style = xlwt.easyxf('align: wrap yes') + date_style = xlwt.easyxf('align: wrap yes', num_format_str=tools.DEFAULT_SERVER_DATE_FORMAT) + datetime_style = xlwt.easyxf('align: wrap yes', num_format_str=tools.DEFAULT_SERVER_DATETIME_FORMAT) for row_index, row in enumerate(rows): for cell_index, cell_value in enumerate(row): + cell_style = base_style if isinstance(cell_value, basestring): cell_value = re.sub("\r", " ", cell_value) - if cell_value is False: cell_value = None - worksheet.write(row_index + 1, cell_index, cell_value, style) + elif isinstance(cell_value, datetime.date): + cell_style = date_style + elif isinstance(cell_value, datetime.datetime): + cell_style = datetime_style + worksheet.write(row_index + 1, cell_index, cell_value, cell_style) fp = StringIO() workbook.save(fp) From a85d1168725feda5b8ebfa04af028c8c5be1cdec Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Tue, 1 Apr 2014 12:07:52 +0200 Subject: [PATCH 2/3] [FIX] default is False, style format is different than DEFAULT_SERVER_DATE{TIME}_FORMAT, datetime is instance of date bzr revid: mat@openerp.com-20140401100752-twixfgj2gmggy922 --- addons/web/controllers/main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 21e27a63d08..8e52cb64717 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1679,7 +1679,7 @@ class Export(http.Controller): for k, v in self.fields_info(model, export_fields).iteritems()) class ExportFormat(object): - raw_data = True + raw_data = False @property def content_type(self): @@ -1790,18 +1790,18 @@ class ExcelExport(ExportFormat, http.Controller): worksheet.col(i).width = 8000 # around 220 pixels base_style = xlwt.easyxf('align: wrap yes') - date_style = xlwt.easyxf('align: wrap yes', num_format_str=tools.DEFAULT_SERVER_DATE_FORMAT) - datetime_style = xlwt.easyxf('align: wrap yes', num_format_str=tools.DEFAULT_SERVER_DATETIME_FORMAT) + date_style = xlwt.easyxf('align: wrap yes', num_format_str='YYYY-MM-DD') + datetime_style = xlwt.easyxf('align: wrap yes', num_format_str='YYYY-MM-DD HH:mm:SS') for row_index, row in enumerate(rows): for cell_index, cell_value in enumerate(row): cell_style = base_style if isinstance(cell_value, basestring): cell_value = re.sub("\r", " ", cell_value) - elif isinstance(cell_value, datetime.date): - cell_style = date_style elif isinstance(cell_value, datetime.datetime): cell_style = datetime_style + elif isinstance(cell_value, datetime.date): + cell_style = date_style worksheet.write(row_index + 1, cell_index, cell_value, cell_style) fp = StringIO() From 269f92998b5ff225cd5f7555f745e709578f3052 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Tue, 1 Apr 2014 14:30:52 +0200 Subject: [PATCH 3/3] [IMP] remove useless import bzr revid: mat@openerp.com-20140401123052-01ylsjx5q3vkoxbq --- addons/web/controllers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 8e52cb64717..2771c658270 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -32,7 +32,7 @@ except ImportError: import openerp import openerp.modules.registry from openerp.tools.translate import _ -from openerp import http, tools +from openerp import http from openerp.http import request, serialize_exception as _serialize_exception