summaryrefslogtreecommitdiff
path: root/odoo/addons/test_new_api
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2020-09-17 12:22:22 +0000
committerRaphael Collet <rco@odoo.com>2020-09-21 12:40:19 +0000
commitaebe9a76c9b35e84eda1f46bec3ef6da152b1539 (patch)
tree43f10cb1fecc98e041f455b6fbc7c0b9e8ca030a /odoo/addons/test_new_api
parentdc591641f3bf8dee50f172134ffd686edc571bd3 (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.py21
-rw-r--r--odoo/addons/test_new_api/security/ir.model.access.csv1
-rw-r--r--odoo/addons/test_new_api/tests/test_new_fields.py12
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']