From f18b46fcded8a7bacda291436f1b60774cb4ba0c Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 1 Apr 2015 12:59:20 +0200 Subject: [PATCH] [FIX] base_import: ignore stripped empty lines Better fix for commit dab37df04d7f2ef1dc8ab6be491693294dea949b --- addons/base_import/models.py | 18 +++++++++++------- addons/base_import/tests/test_cases.py | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/addons/base_import/models.py b/addons/base_import/models.py index 80ee8fef595..9778391521a 100644 --- a/addons/base_import/models.py +++ b/addons/base_import/models.py @@ -136,7 +136,11 @@ class ir_import(orm.TransientModel): StringIO(record.file), quotechar=str(options['quoting']), delimiter=str(options['separator'])) - csv_nonempty = itertools.ifilter(None, csv_iterator) + + def nonempty(row): + return any(x for x in row if x.strip()) + + csv_nonempty = itertools.ifilter(nonempty, csv_iterator) # TODO: guess encoding with chardet? Or https://github.com/aadsm/jschardet encoding = options.get('encoding', 'utf-8') return itertools.imap( @@ -280,13 +284,13 @@ class ir_import(orm.TransientModel): if options.get('headers'): rows_to_import = itertools.islice( rows_to_import, 1, None) - - data = [] - for row in rows_to_import: + data = [ + row for row in itertools.imap(mapper, rows_to_import) # don't try inserting completely empty rows (e.g. from - # filtering out o2m fields - if any(f.strip() for f in row): - data.append(mapper(row)) + # filtering out o2m fields) + if any(row) + ] + return data, import_fields def do(self, cr, uid, id, fields, options, dryrun=False, context=None): diff --git a/addons/base_import/tests/test_cases.py b/addons/base_import/tests/test_cases.py index 768754df07c..873d749d55a 100644 --- a/addons/base_import/tests/test_cases.py +++ b/addons/base_import/tests/test_cases.py @@ -322,6 +322,28 @@ class test_convert_import_data(TransactionCase): ('', '6'), ]) + def test_empty_rows(self): + Import = self.registry('base_import.import') + id = Import.create(self.cr, self.uid, { + 'res_model': 'base_import.tests.models.preview', + 'file': 'name,Some Value\n' + 'foo,1\n' + '\n' + 'bar,2\n' + ' \n' + '\t \n' + }) + record = Import.browse(self.cr, self.uid, id) + data, fields = Import._convert_import_data( + record, ['name', 'somevalue'], + {'quoting': '"', 'separator': ',', 'headers': True,}) + + self.assertItemsEqual(fields, ['name', 'somevalue']) + self.assertItemsEqual(data, [ + ('foo', '1'), + ('bar', '2'), + ]) + def test_nofield(self): Import = self.registry('base_import.import')