diff options
| author | Raphael Collet <rco@odoo.com> | 2020-09-17 12:22:22 +0000 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2020-09-21 12:40:19 +0000 |
| commit | aebe9a76c9b35e84eda1f46bec3ef6da152b1539 (patch) | |
| tree | 43f10cb1fecc98e041f455b6fbc7c0b9e8ca030a /odoo/addons/test_new_api | |
| parent | dc591641f3bf8dee50f172134ffd686edc571bd3 (diff) | |
[FIX] core: always evaluate field.depends upon setup
This is necessary when a field's dependencies are given by a callable.
This functionality was broken with the support for an explicit parameter
`depends` in the fields' definition, because the implementation could
not distinguish between the field parameter `depends` and the `depends`
evaluated from compute functions.
The fix consists in storing the field parameter `depends` into
`field._depends`, and the result of the setup into `field.depends`.
closes odoo/odoo#58127
X-original-commit: d4d7925d69c9a37f099ddd3a8929004f17e162eb
Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
Diffstat (limited to 'odoo/addons/test_new_api')
| -rw-r--r-- | odoo/addons/test_new_api/models/test_new_api.py | 21 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/security/ir.model.access.csv | 1 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/tests/test_new_fields.py | 12 |
3 files changed, 34 insertions, 0 deletions
diff --git a/odoo/addons/test_new_api/models/test_new_api.py b/odoo/addons/test_new_api/models/test_new_api.py index c0f7615f9d3..47df3602baa 100644 --- a/odoo/addons/test_new_api/models/test_new_api.py +++ b/odoo/addons/test_new_api/models/test_new_api.py @@ -595,6 +595,27 @@ class ComputeOnchangeLine(models.Model): required=True, ondelete='cascade') +class ComputeDynamicDepends(models.Model): + _name = 'test_new_api.compute.dynamic.depends' + _description = "Computed field with dynamic dependencies" + + name1 = fields.Char() + name2 = fields.Char() + name3 = fields.Char() + full_name = fields.Char(compute='_compute_full_name') + + def _get_full_name_fields(self): + # the fields to use are stored in a config parameter + depends = self.env['ir.config_parameter'].get_param('test_new_api.full_name', '') + return depends.split(',') if depends else [] + + @api.depends(lambda self: self._get_full_name_fields()) + def _compute_full_name(self): + fnames = self._get_full_name_fields() + for record in self: + record.full_name = ", ".join(filter(None, (record[fname] for fname in fnames))) + + class ComputeUnassigned(models.Model): _name = 'test_new_api.compute.unassigned' _description = "Model with computed fields left unassigned" diff --git a/odoo/addons/test_new_api/security/ir.model.access.csv b/odoo/addons/test_new_api/security/ir.model.access.csv index 37b088db27e..466b014f213 100644 --- a/odoo/addons/test_new_api/security/ir.model.access.csv +++ b/odoo/addons/test_new_api/security/ir.model.access.csv @@ -26,6 +26,7 @@ access_test_new_api_cascade,access_test_new_api_cascade,model_test_new_api_casca access_test_new_api_compute_readwrite,access_test_new_api_compute_readwrite,model_test_new_api_compute_readwrite,,1,1,1,1 access_test_new_api_compute_onchange,access_test_new_api_compute_onchange,model_test_new_api_compute_onchange,,1,1,1,1 access_test_new_api_compute_onchange_line,access_test_new_api_compute_onchange_line,model_test_new_api_compute_onchange_line,,1,1,1,1 +access_test_new_api_compute_dynamic_depends,access_test_new_api_compute_dynamic_depends,model_test_new_api_compute_dynamic_depends,,1,1,1,1 access_test_new_api_compute_unassigned,access_test_new_api_compute_unassigned,model_test_new_api_compute_unassigned,,1,1,1,1 access_test_new_api_binary_svg,access_test_new_api_binary_svg,model_test_new_api_binary_svg,,1,1,1,1 access_test_new_api_monetary_base,access_test_new_api_monetary_base,model_test_new_api_monetary_base,,1,1,1,1 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 3fb741f98b9..10993c52668 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -456,6 +456,18 @@ class TestFields(TransactionCaseWithUserDemo): record.foo = "Ho" self.assertEqual(record.baz, "<[Ho]>") + def test_12_dynamic_depends(self): + Model = self.registry['test_new_api.compute.dynamic.depends'] + self.assertEqual(Model.full_name.depends, ()) + + # the dependencies of full_name are stored in a config parameter + self.env['ir.config_parameter'].set_param('test_new_api.full_name', 'name1,name2') + + # this must re-evaluate the field's dependencies + self.env['base'].flush() + self.registry.setup_models(self.cr) + self.assertEqual(Model.full_name.depends, ('name1', 'name2')) + def test_13_inverse(self): """ test inverse computation of fields """ Category = self.env['test_new_api.category'] |
