diff --git a/odoo/addons/base/models/ir_fields.py b/odoo/addons/base/models/ir_fields.py index 38c37e7e104..89f174058f8 100644 --- a/odoo/addons/base/models/ir_fields.py +++ b/odoo/addons/base/models/ir_fields.py @@ -470,7 +470,8 @@ class IrFieldsConverter(models.AbstractModel): name_create_enabled_fields = self.env.context.get('name_create_enabled_fields') or {} if name_create_enabled_fields.get(field.name): try: - id, _name = RelatedModel.name_create(name=value) + with self.env.cr.savepoint(): + id, _name = RelatedModel.name_create(name=value) except (Exception, psycopg2.IntegrityError): error_msg = _(u"Cannot create new '%s' records from their name alone. Please create those records manually and try importing again.", RelatedModel._description) else: diff --git a/odoo/addons/test_impex/ir.model.access.csv b/odoo/addons/test_impex/ir.model.access.csv index 9dc4d082572..9c5ea893e11 100644 --- a/odoo/addons/test_impex/ir.model.access.csv +++ b/odoo/addons/test_impex/ir.model.access.csv @@ -28,3 +28,5 @@ access_export_inherits_parent,access_export_inherits_parent,model_export_inherit access_export_inherits_child,access_export_inherits_child,model_export_inherits_child,base.group_user,1,1,1,1 access_export_m2o_str,access_export_m2o_str,model_export_m2o_str,base.group_user,1,1,1,1 access_export_m2o_str_child,access_export_m2o_str_child,model_export_m2o_str_child,base.group_user,1,1,1,1 +access_export_with_required_field,access_export_with_required_field,model_export_with_required_field,base.group_user,1,1,1,1 +access_export_many2one_required_subfield,access_export_many2one_required_subfield,model_export_many2one_required_subfield,base.group_user,1,1,1,1 diff --git a/odoo/addons/test_impex/models.py b/odoo/addons/test_impex/models.py index 136798c7bea..e28faeea540 100644 --- a/odoo/addons/test_impex/models.py +++ b/odoo/addons/test_impex/models.py @@ -190,3 +190,14 @@ class ChidToString(models.Model): _name = _description = 'export.m2o.str.child' name = fields.Char() + +class WithRequiredField(models.Model): + _name = _description = 'export.with.required.field' + + name = fields.Char() + value = fields.Integer(required=True) + +class Many2OneRequiredSubfield(models.Model): + _name = _description = 'export.many2one.required.subfield' + + name = fields.Many2one('export.with.required.field') diff --git a/odoo/addons/test_impex/tests/test_load.py b/odoo/addons/test_impex/tests/test_load.py index 64c3b69e6f1..d1269d00e3f 100644 --- a/odoo/addons/test_impex/tests/test_load.py +++ b/odoo/addons/test_impex/tests/test_load.py @@ -720,6 +720,20 @@ class test_m2o(ImporterCase): self.assertFalse(result['messages']) self.assertEqual(len(result['ids']), 1) + @mute_logger('odoo.sql_db') + def test_name_create_enabled_m2o_required_field(self): + self.model = self.env['export.many2one.required.subfield'] + self.env['export.with.required.field'].create({'name': 'ipsum', 'value': 10}) + context = {'name_create_enabled_fields': {'name': True}} + result = self.import_(['name'], [['lorem'], ['ipsum']], context=context) + messages = result['messages'] + self.assertTrue(messages) + self.assertEqual(len(messages), 1) + self.assertEqual(messages[0]['message'], + "No matching record found for name 'lorem' in field 'Name' and the following error was " + "encountered when we attempted to create one: Cannot create new 'export.with.required.field' " + "records from their name alone. Please create those records manually and try importing again.") + class TestInvalidStrings(ImporterCase): model_name = 'export.m2o.str'