diff options
Diffstat (limited to 'odoo')
| -rw-r--r-- | odoo/addons/test_new_api/models/test_new_api.py | 34 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/security/ir.model.access.csv | 2 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/tests/test_onchange.py | 44 | ||||
| -rw-r--r-- | odoo/fields.py | 2 |
4 files changed, 81 insertions, 1 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 b3407e40adc..8ae85479232 100644 --- a/odoo/addons/test_new_api/models/test_new_api.py +++ b/odoo/addons/test_new_api/models/test_new_api.py @@ -692,6 +692,40 @@ class ComputeUnassigned(models.Model): record.bares = record.foo +class ComputeOne2many(models.Model): + _name = 'test_new_api.one2many' + _description = "A computed editable one2many field with a domain" + + name = fields.Char() + line_ids = fields.One2many( + 'test_new_api.one2many.line', 'container_id', + compute='_compute_line_ids', store=True, readonly=False, + domain=[('count', '>', 0)], + ) + + @api.depends('name') + def _compute_line_ids(self): + # increment counter of line with the same name, or create a new line + for record in self: + if not record.name: + continue + for line in record.line_ids: + if line.name == record.name: + line.count += 1 + break + else: + record.line_ids = [(0, 0, {'name': record.name})] + + +class ComputeOne2manyLine(models.Model): + _name = 'test_new_api.one2many.line' + _description = "Line of a computed one2many" + + name = fields.Char() + count = fields.Integer(default=1) + container_id = fields.Many2one('test_new_api.one2many', required=True) + + class ModelBinary(models.Model): _name = 'test_new_api.model_binary' _description = 'Test Image field' 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 61785a225ea..53aa2d521a8 100644 --- a/odoo/addons/test_new_api/security/ir.model.access.csv +++ b/odoo/addons/test_new_api/security/ir.model.access.csv @@ -29,6 +29,8 @@ access_test_new_api_compute_onchange,access_test_new_api_compute_onchange,model_ 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_one2many,access_test_new_api_one2many,model_test_new_api_one2many,,1,1,1,1 +access_test_new_api_one2many_line,access_test_new_api_one2many_line,model_test_new_api_one2many_line,,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 access_test_new_api_monetary_related,access_test_new_api_monetary_related,model_test_new_api_monetary_related,,1,1,1,1 diff --git a/odoo/addons/test_new_api/tests/test_onchange.py b/odoo/addons/test_new_api/tests/test_onchange.py index 9ee567d777a..bc58db1dde5 100644 --- a/odoo/addons/test_new_api/tests/test_onchange.py +++ b/odoo/addons/test_new_api/tests/test_onchange.py @@ -823,3 +823,47 @@ class TestComputeOnchange(common.TransactionCase): ] result = record.onchange({'line_ids': line_ids}, 'line_ids', spec) self.assertEqual(result, expected) + + def test_computed_editable_one2many_domain(self): + """ Test a computed, editable one2many field with a domain. """ + record = self.env['test_new_api.one2many'].create({'name': 'foo'}) + self.assertRecordValues(record.line_ids, [ + {'name': 'foo', 'count': 1}, + ]) + + # trigger recomputation by changing name + record.name = 'bar' + self.assertRecordValues(record.line_ids, [ + {'name': 'foo', 'count': 1}, + {'name': 'bar', 'count': 1}, + ]) + + # manually adding a line should not trigger recomputation + record.line_ids.create({'name': 'baz', 'container_id': record.id}) + self.assertRecordValues(record.line_ids, [ + {'name': 'foo', 'count': 1}, + {'name': 'bar', 'count': 1}, + {'name': 'baz', 'count': 1}, + ]) + + # changing the field in the domain should not trigger recomputation... + record.line_ids[-1].count = 2 + self.assertRecordValues(record.line_ids, [ + {'name': 'foo', 'count': 1}, + {'name': 'bar', 'count': 1}, + {'name': 'baz', 'count': 2}, + ]) + + # ...and may show cache inconsistencies + record.line_ids[-1].count = 0 + self.assertRecordValues(record.line_ids, [ + {'name': 'foo', 'count': 1}, + {'name': 'bar', 'count': 1}, + {'name': 'baz', 'count': 0}, + ]) + record.flush() + record.invalidate_cache() + self.assertRecordValues(record.line_ids, [ + {'name': 'foo', 'count': 1}, + {'name': 'bar', 'count': 1}, + ]) diff --git a/odoo/fields.py b/odoo/fields.py index 0396437a446..64f2cb01edd 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -3021,7 +3021,7 @@ class _RelationalMulti(_Relational): def _setup_regular_full(self, model): super(_RelationalMulti, self)._setup_regular_full(model) - if isinstance(self.domain, list): + if not self.compute and isinstance(self.domain, list): self.depends = tuple(unique(itertools.chain(self.depends, ( self.name + '.' + arg[0] for arg in self.domain |
