summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2020-02-21 10:14:38 +0000
committerRaphael Collet <rco@odoo.com>2020-02-24 15:52:32 +0000
commitdfab454732c80c8092103a6e7f47a8654fd8ab8e (patch)
tree97f2ae92e7c85ac06fb57fed0023812ec5ceeee2 /odoo
parent4206c1f225f5b1c54a0cdd4913e1d8224a2e7889 (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.py14
-rw-r--r--odoo/fields.py18
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)