diff --git a/odoo/addons/base/tests/test_ir_model.py b/odoo/addons/base/tests/test_ir_model.py index 385bca0284e..0ea1341daa8 100644 --- a/odoo/addons/base/tests/test_ir_model.py +++ b/odoo/addons/base/tests/test_ir_model.py @@ -312,6 +312,20 @@ class TestIrModel(TransactionCase): }] self.assertEqual(groups, expected, 'should include 2 empty ripeness stages') + def test_rec_name_deletion(self): + """Check that deleting 'x_name' does not crash.""" + record = self.env['x_bananas'].create({'x_name': "Ifan Ben-Mezd"}) + self.assertEqual(record._rec_name, 'x_name') + self.assertEqual(record._fields['display_name'].depends, ('x_name',)) + self.assertEqual(record.display_name, "Ifan Ben-Mezd") + + # unlinking x_name should fixup _rec_name and display_name + self.env['ir.model.fields']._get('x_bananas', 'x_name').unlink() + record = self.env['x_bananas'].browse(record.id) + self.assertEqual(record._rec_name, None) + self.assertEqual(record._fields['display_name'].depends, ()) + self.assertEqual(record.display_name, f"x_bananas,{record.id}") + @tagged('test_eval_context') class TestEvalContext(TransactionCase): diff --git a/odoo/models.py b/odoo/models.py index 8b9c656cad0..5487606f1c3 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -412,6 +412,10 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): field = cls._fields.pop(name, None) if hasattr(cls, name): delattr(cls, name) + if cls._rec_name == name: + # fixup _rec_name and display_name's dependencies + cls._rec_name = None + cls.display_name.depends = tuple(dep for dep in cls.display_name.depends if dep != name) return field @api.model @@ -2862,14 +2866,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): raise for name in bad_fields: - del cls._fields[name] - delattr(cls, name) - - # fix up _rec_name - if 'x_name' in bad_fields and cls._rec_name == 'x_name': - cls._rec_name = None - field = cls._fields['display_name'] - field.depends = tuple(name for name in field.depends if name != 'x_name') + self._pop_field(name) @api.model def _setup_complete(self):