diff --git a/odoo/addons/test_new_api/ir.model.access.csv b/odoo/addons/test_new_api/ir.model.access.csv index 0dd4efcda7271..03ec40061ce1f 100644 --- a/odoo/addons/test_new_api/ir.model.access.csv +++ b/odoo/addons/test_new_api/ir.model.access.csv @@ -14,5 +14,6 @@ access_test_new_api_foo,access_test_new_api_foo,model_test_new_api_foo,,1,1,1,1 access_test_new_api_bar,access_test_new_api_bar,model_test_new_api_bar,,1,1,1,1 access_test_new_api_related,access_test_new_api_related,model_test_new_api_related,,1,1,1,1 access_test_new_api_company,access_test_new_api_company,model_test_new_api_company,,1,1,1,1 +access_test_new_api_company_attr,access_test_new_api_company_attr,model_test_new_api_company_attr,,1,1,1,1 access_test_new_api_sparse,access_test_new_api_sparse,model_test_new_api_sparse,,1,1,1,1 access_test_new_api_compute_inverse,access_test_new_api_compute_inverse,model_test_new_api_compute_inverse,,1,1,1,1 diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py index 2c174db6c85db..e7de33f8aa6cc 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models.py @@ -338,6 +338,17 @@ class CompanyDependent(models.Model): foo = fields.Char(company_dependent=True) +class CompanyDependentAttribute(models.Model): + _name = 'test_new_api.company.attr' + + company = fields.Many2one('test_new_api.company') + quantity = fields.Integer() + bar = fields.Char(compute='_compute_bar', store=True) + + @api.depends('quantity', 'company.foo') + def _compute_bar(self): + for record in self: + record.bar = (record.company.foo or '') * record.quantity class Sparse(models.Model): _name = 'test_new_api.sparse' 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 84b77d5852d0f..1326eb3da394a 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -498,6 +498,25 @@ def test_27_company_dependent(self): self.assertEqual(record.sudo(user1).foo, 'alpha') self.assertEqual(record.sudo(user2).foo, 'default') + # create company record and attribute + company_record = self.env['test_new_api.company'].create({'foo': 'ABC'}) + attribute_record = self.env['test_new_api.company.attr'].create({ + 'company': company_record.id, + 'quantity': 1, + }) + self.assertEqual(attribute_record.bar, 'ABC') + + # change quantity, 'bar' should recompute to 'ABCABC' + attribute_record.quantity = 2 + self.assertEqual(attribute_record.bar, 'ABCABC') + self.assertFalse(self.env.has_todo()) + + # change company field 'foo', 'bar' should recompute to 'DEFDEF' + company_record.foo = 'DEF' + self.assertEqual(attribute_record.company.foo, 'DEF') + self.assertEqual(attribute_record.bar, 'DEFDEF') + self.assertFalse(self.env.has_todo()) + def test_28_sparse(self): """ test sparse fields. """ record = self.env['test_new_api.sparse'].create({}) diff --git a/odoo/models.py b/odoo/models.py index fb0d35225b1e1..51494a5d99559 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -3556,12 +3556,17 @@ def write(self, vals): if new_vals: # put the values of pure new-style fields into cache, and inverse them + self.modified(set(new_vals) - set(old_vals)) for record in self: record._cache.update(record._convert_to_cache(new_vals, update=True)) for key in new_vals: self._fields[key].determine_inverse(self) + self.modified(set(new_vals) - set(old_vals)) # check Python constraints for inversed fields self._validate_fields(set(new_vals) - set(old_vals)) + # recompute new-style fields + if self.env.recompute and self._context.get('recompute', True): + self.recompute() return True @@ -3815,14 +3820,19 @@ def create(self, vals): # create record with old-style fields record = self.browse(self._create(old_vals)) - # put the values of pure new-style fields into cache, and inverse them - record._cache.update(record._convert_to_cache(new_vals)) protected_fields = map(self._fields.get, new_vals) with self.env.protecting(protected_fields, record): + # put the values of pure new-style fields into cache, and inverse them + record.modified(set(new_vals) - set(old_vals)) + record._cache.update(record._convert_to_cache(new_vals)) for key in new_vals: self._fields[key].determine_inverse(record) + record.modified(set(new_vals) - set(old_vals)) # check Python constraints for inversed fields record._validate_fields(set(new_vals) - set(old_vals)) + # recompute new-style fields + if self.env.recompute and self._context.get('recompute', True): + self.recompute() return record