diff --git a/odoo/addons/base/models/ir_fields.py b/odoo/addons/base/models/ir_fields.py
index 9a862f02eee..233c611478b 100644
--- a/odoo/addons/base/models/ir_fields.py
+++ b/odoo/addons/base/models/ir_fields.py
@@ -303,6 +303,7 @@ class IrFieldsConverter(models.AbstractModel):
id = None
warnings = []
+ error_msg = ''
action = {'type': 'ir.actions.act_window', 'target': 'new',
'view_mode': 'tree,form', 'view_type': 'form',
'views': [(False, 'tree'), (False, 'form')],
@@ -346,6 +347,13 @@ class IrFieldsConverter(models.AbstractModel):
_(u"Found multiple matches for field '%%(field)s' (%d matches)")
% (len(ids))))
id, _name = ids[0]
+ else:
+ 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)
+ except Exception as e:
+ error_msg = repr(e)
else:
raise self._format_import_error(
Exception,
@@ -354,10 +362,14 @@ class IrFieldsConverter(models.AbstractModel):
)
if id is None:
+ if error_msg:
+ message = _("No matching record found for %(field_type)s '%(value)s' in field '%%(field)s' and the following error was encountered when we attempted to create one: %(error_message)s")
+ else:
+ message = _("No matching record found for %(field_type)s '%(value)s' in field '%%(field)s'")
raise self._format_import_error(
ValueError,
- _(u"No matching record found for %(field_type)s '%(value)s' in field '%%(field)s'"),
- {'field_type': field_type, 'value': value},
+ message,
+ {'field_type': field_type, 'value': value, 'error_message': error_msg},
{'moreinfo': action})
return id, field_type, warnings
diff --git a/odoo/addons/test_impex/models.py b/odoo/addons/test_impex/models.py
index ddecc63b265..5a098936ccc 100644
--- a/odoo/addons/test_impex/models.py
+++ b/odoo/addons/test_impex/models.py
@@ -40,6 +40,7 @@ MODELS = [
for name, field in MODELS:
class NewModel(models.Model):
_name = 'export.%s' % name
+ _rec_name = 'value'
const = fields.Integer(default=4)
value = field
@@ -55,7 +56,6 @@ for name, field in MODELS:
else:
return []
-
class One2ManyChild(models.Model):
_name = 'export.one2many.child'
# FIXME: orm.py:1161, fix to name_get on m2o field
diff --git a/odoo/addons/test_impex/tests/test_load.py b/odoo/addons/test_impex/tests/test_load.py
index 817a56a1c9f..ff303eea407 100644
--- a/odoo/addons/test_impex/tests/test_load.py
+++ b/odoo/addons/test_impex/tests/test_load.py
@@ -675,6 +675,20 @@ class test_m2o(ImporterCase):
u"name, external id or database id")])
self.assertIs(result['ids'], False)
+ def test_name_create_enabled_m2o(self):
+ result = self.import_(['value'], [[101]])
+ self.assertEqual(result['messages'], [message(
+ u"No matching record found for name '101' "
+ u"in field 'Value'", moreinfo=moreaction(
+ res_model='export.integer'))])
+ self.assertIs(result['ids'], False)
+ context = {
+ 'name_create_enabled_fields': {'value': True},
+ }
+ result = self.import_(['value'], [[101]], context=context)
+ self.assertFalse(result['messages'])
+ self.assertEqual(len(result['ids']), 1)
+
class test_m2m(ImporterCase):
model_name = 'export.many2many'
diff --git a/odoo/fields.py b/odoo/fields.py
index ec3a16b0a71..213c5696063 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -2659,7 +2659,9 @@ class Many2many(_RelationalMulti):
elif act[0] in (5, 6):
if recs and recs[-1] == record:
flush()
- links.difference_update(pair for pair in links if pair[0] == record.id)
+ # must reify the RHS as Python can update the subject on
+ # the fly leading to "RuntimeError: Set changed size during iteration"
+ links.difference_update([pair for pair in links if pair[0] == record.id])
if act[0] == 6:
links.update((record.id, id2) for id2 in act[2])