From dda0f64cf7dae49347f4360e115e5d51294bdf6d Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Thu, 15 Jun 2023 13:12:04 +0000 Subject: [PATCH] [FIX] base: avoid cache_invalidation on settings A cache invalidation was triggered when displaying the settings page because of a write on ir.property return call_kw(request.env[model], method, args, kwargs) File "/home/xdo/osrc/master/odoo/odoo/api.py", line 461, in call_kw result = _call_kw_multi(method, model, args, kwargs) File "/home/xdo/osrc/master/odoo/odoo/api.py", line 448, in _call_kw_multi result = method(recs, *args, **kwargs) File "/home/xdo/osrc/master/odoo/odoo/models.py", line 6689, in onchange record._onchange_eval(name, field_onchange[name], result) File "/home/xdo/osrc/master/odoo/odoo/models.py", line 6403, in _onchange_eval res = method(self) File "/home/xdo/osrc/master/enterprise/sale_stock_renting/models/res_config_settings.py", line 17, in _onchange_padding_time self.env['ir.property']._set_default("preparation_time", "product.template", self.padding_time) File "/home/xdo/osrc/master/odoo/odoo/addons/base/models/ir_property.py", line 203, in _set_default prop.write({'value': value}) This commit will avoid this by checking the current value. Part-of: odoo/odoo#119813 --- odoo/addons/base/models/ir_property.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/odoo/addons/base/models/ir_property.py b/odoo/addons/base/models/ir_property.py index 19664fe75e8..8a7d4fd6f83 100644 --- a/odoo/addons/base/models/ir_property.py +++ b/odoo/addons/base/models/ir_property.py @@ -113,14 +113,17 @@ class Property(models.Model): # if any of the records we're writing on has a res_id=False *or* # we're writing a res_id=False on any record default_set = False - if self._ids: - self.env.cr.execute( - 'SELECT EXISTS (SELECT 1 FROM ir_property WHERE id in %s AND res_id IS NULL)', [self._ids]) - default_set = self.env.cr.rowcount == 1 or any( - v.get('res_id') is False - for v in values - ) - r = super(Property, self).write(self._update_values(values)) + + values = self._update_values(values) + default_set = ( + # turning a record value into a fallback value + values.get('res_id') is False and any(record.res_id for record in self) + ) or any( + # changing a fallback value + not record.res_id and any(record[fname] != self._fields[fname].convert_to_record(value, self) for fname, value in values.items()) + for record in self + ) + r = super().write(values) if default_set: # DLE P44: test `test_27_company_dependent` # Easy solution, need to flush write when changing a property.