diff --git a/trytond/trytond/ir/message.xml b/trytond/trytond/ir/message.xml index 7f603fd0bd..19a4e4da59 100644 --- a/trytond/trytond/ir/message.xml +++ b/trytond/trytond/ir/message.xml @@ -151,6 +151,12 @@ this repository contains the full copyright notices and license terms. --> This record is part of the base configuration. + + Missing values for last column. + + + Missing values for %(n)s last columns. + Relation not found: %(value)r in "%(model)s" (%(column)s). diff --git a/trytond/trytond/model/modelstorage.py b/trytond/trytond/model/modelstorage.py index a848473cd6..93afbede0f 100644 --- a/trytond/trytond/model/modelstorage.py +++ b/trytond/trytond/model/modelstorage.py @@ -1050,12 +1050,16 @@ class ModelStorage(Model): todo = set() prefix_len = len(prefix) many2many = set() + if len(fields_names) > len(line): + n = len(fields_names) - len(line) + if n > 1: + raise ImportDataError(gettext( + 'ir.msg_import_data_missing_columns', n=n)) + else: + raise ImportDataError(gettext( + 'ir.msg_import_data_missing_column')) # Import normal fields_names for i, field in enumerate(fields_names): - if i >= len(line): - raise Exception('ImportError', - 'Please check that all your lines have %d cols.' - % len(fields_names)) is_prefix_len = (len(field) == (prefix_len + 1)) value = line[i] column = '/'.join(field) @@ -1155,8 +1159,6 @@ class ModelStorage(Model): ModelData = pool.get('ir.model.data') - len_fields_names = len(fields_names) - assert all(len(x) == len_fields_names for x in data) fields_names = [x.split('/') for x in fields_names] fields_def = cls.fields_get() diff --git a/trytond/trytond/tests/import_data.py b/trytond/trytond/tests/import_data.py index e5eef27c22..c824eaf3c9 100644 --- a/trytond/trytond/tests/import_data.py +++ b/trytond/trytond/tests/import_data.py @@ -5,6 +5,13 @@ from trytond.model import ModelSQL, fields from trytond.pool import Pool +class ImportData(ModelSQL): + "Import Data" + __name__ = 'test.import_data' + name = fields.Char("Name") + value = fields.Integer("Value") + + class ImportDataBoolean(ModelSQL): "Import Data Boolean" __name__ = 'test.import_data.boolean' @@ -176,6 +183,7 @@ class ImportDataUpdate(ModelSQL): def register(module): Pool.register( + ImportData, ImportDataBoolean, ImportDataInteger, ImportDataFloat, diff --git a/trytond/trytond/tests/test_importdata.py b/trytond/trytond/tests/test_importdata.py index cb781a4ac0..d95347725d 100644 --- a/trytond/trytond/tests/test_importdata.py +++ b/trytond/trytond/tests/test_importdata.py @@ -18,6 +18,18 @@ class ImportDataTestCase(unittest.TestCase): def setUpClass(cls): activate_module('tests') + @with_transaction() + def test_missing_values(self): + "Test error is raised when missing values" + pool = Pool() + Model = pool.get('test.import_data') + + with self.assertRaisesRegex(ImportDataError, "for last column"): + Model.import_data(['name'], [["Test"], []]) + + with self.assertRaisesRegex(ImportDataError, "for 2 last column"): + Model.import_data(['name', 'value'], [["Test", 1], []]) + @with_transaction() def test_boolean(self): 'Test boolean'