diff options
| author | Raphael Collet <rco@odoo.com> | 2020-02-21 10:14:38 +0000 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2020-02-24 15:52:32 +0000 |
| commit | dfab454732c80c8092103a6e7f47a8654fd8ab8e (patch) | |
| tree | 97f2ae92e7c85ac06fb57fed0023812ec5ceeee2 /odoo | |
| parent | 4206c1f225f5b1c54a0cdd4913e1d8224a2e7889 (diff) | |
[IMP] fields: inherited field on new record are set on parent records
This makes the behavior of `onchange()` consistent in the case of
inherited models (with `_inherits`).
closes odoo/odoo#45910
Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
Diffstat (limited to 'odoo')
| -rw-r--r-- | odoo/addons/test_new_api/tests/test_new_fields.py | 14 | ||||
| -rw-r--r-- | odoo/fields.py | 18 |
2 files changed, 30 insertions, 2 deletions
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 0f6c7fe9bb5..b98b1a34c0f 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1216,6 +1216,20 @@ class TestFields(TransactionCaseWithUserDemo): # check that this does not generate an infinite recursion new_disc._convert_to_write(new_disc._cache) + def test_40_new_inherited_fields(self): + """ Test the behavior of new records with inherited fields. """ + email = self.env['test_new_api.emailmessage'].new({'body': 'XXX'}) + self.assertEqual(email.body, 'XXX') + self.assertEqual(email.message.body, 'XXX') + + email.body = 'YYY' + self.assertEqual(email.body, 'YYY') + self.assertEqual(email.message.body, 'YYY') + + email.message.body = 'ZZZ' + self.assertEqual(email.body, 'ZZZ') + self.assertEqual(email.message.body, 'ZZZ') + def test_40_new_ref_origin(self): """ Test the behavior of new records with ref/origin. """ Discussion = self.env['test_new_api.discussion'] diff --git a/odoo/fields.py b/odoo/fields.py index 64b8083df7c..bcf8bc6a8f0 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -1010,8 +1010,17 @@ class Field(MetaField('DummyField', (object,), {})): env.cache.set(record, self, value) elif (not record.id) and self.type == 'many2one' and self.delegate: - # special case: parent records are new as well - parent = record.env[self.comodel_name].new() + # the parent record is also a new record, with the same cached + # values as record for the corresponding inherited fields + def is_inherited_field(name): + field = record._fields[name] + return field.inherited and field.related[0] == self.name + + parent = record.env[self.comodel_name].new({ + name: value + for name, value in record._cache.items() + if is_inherited_field(name) + }) value = self.convert_to_cache(parent, record) env.cache.set(record, self, value) @@ -1089,6 +1098,11 @@ class Field(MetaField('DummyField', (object,), {})): if self.relational: new_records.modified([self.name]) + if self.inherited: + # special case: also assign parent records if they are new + parents = records[self.related[0]] + parents.filtered(lambda r: not r.id)[self.name] = value + if other_ids: # base case: full business logic records = records.browse(other_ids) |
