diff --git a/odoo/addons/base/models/ir_model.py b/odoo/addons/base/models/ir_model.py index ab413a764d4..06647266004 100644 --- a/odoo/addons/base/models/ir_model.py +++ b/odoo/addons/base/models/ir_model.py @@ -1381,8 +1381,15 @@ class IrModelSelection(models.Model): if not field or not field.store or Model._abstract: continue - ondelete = (field.ondelete or {}).get(selection.value) or 'set null' - if callable(ondelete): + ondelete = (field.ondelete or {}).get(selection.value) + # special case for custom fields + if ondelete is None and field.manual and not field.required: + ondelete = 'set null' + + if ondelete is None: + # nothing to do, the selection does not come from a field extension + continue + elif callable(ondelete): ondelete(selection._get_records()) elif ondelete == 'set null': selection._get_records().write({field.name: False}) diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 3e85a0aa314..ff60190704d 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -3056,6 +3056,16 @@ class TestSelectionOndelete(common.TransactionCase): self.assertFalse(rec.my_selection) + def test_required_base_selection_field(self): + # test that no ondelete action is executed on a required selection field that is not + # extended, only required fields that extend it with selection_add should + # have ondelete actions defined + rec = self.env[self.MODEL_REQUIRED].create({'my_selection': 'foo'}) + self.assertEqual(rec.my_selection, 'foo') + + self._unlink_option(self.MODEL_REQUIRED, 'foo') + self.assertEqual(rec.my_selection, 'foo') + @common.tagged('selection_ondelete_advanced') class TestSelectionOndeleteAdvanced(common.TransactionCase):