diff --git a/odoo/addons/test_new_api/tests/test_onchange.py b/odoo/addons/test_new_api/tests/test_onchange.py index ea7d64d2676..57526d83fb3 100644 --- a/odoo/addons/test_new_api/tests/test_onchange.py +++ b/odoo/addons/test_new_api/tests/test_onchange.py @@ -498,13 +498,13 @@ class TestOnChange(SavepointCaseWithUserDemo): self.env.cache.invalidate() Message = self.env['test_new_api.related'] - result = Message.onchange(value, ['message', 'message_name', 'message_currency'], field_onchange) + result = Message.onchange(value, 'message', field_onchange) self.assertEqual(result['value'], onchange_result) self.env.cache.invalidate() Message = self.env(user=self.user_demo.id)['test_new_api.related'] - result = Message.onchange(value, ['message', 'message_name', 'message_currency'], field_onchange) + result = Message.onchange(value, 'message', field_onchange) self.assertEqual(result['value'], onchange_result) @@ -743,6 +743,16 @@ class TestComputeOnchange(common.TransactionCase): self.assertEqual(form.bar, "foo6r") self.assertEqual(form.baz, "baz5") + def test_onchange_default(self): + form = common.Form(self.env['test_new_api.compute.onchange'].with_context( + default_active=True, default_foo="foo", default_baz="baz", + )) + # 'baz' is computed editable, so when given a default value it should + # 'not be recomputed, even if a dependency also has a default value + self.assertEqual(form.foo, "foo") + self.assertEqual(form.bar, "foor") + self.assertEqual(form.baz, "baz") + def test_onchange_once(self): """ Modifies `foo` field which will trigger an onchange method and checks it was triggered only one time. """ diff --git a/odoo/models.py b/odoo/models.py index 5aaff716a02..4c06ea5b9b9 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -6216,16 +6216,10 @@ Fields: todo = list(unique(itertools.chain(names, nametree))) if first_call else list(names) done = set() - # dummy assignment: trigger invalidations on the record - for name in todo: - if name == 'id': - continue - value = record[name] - field = self._fields[name] - if field.type == 'many2one' and field.delegate and not value: - # do not nullify all fields of parent record for new records - continue - record[name] = value + # mark fields to do as modified to trigger recomputations + protected = [self._fields[name] for name in names] + with self.env.protecting(protected, record): + record.modified(todo) result = {'warnings': OrderedSet()}