summaryrefslogtreecommitdiff
path: root/odoo/addons
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/addons')
-rw-r--r--odoo/addons/base/models/res_config.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/odoo/addons/base/models/res_config.py b/odoo/addons/base/models/res_config.py
index fd9ddec2693..1abaf76663e 100644
--- a/odoo/addons/base/models/res_config.py
+++ b/odoo/addons/base/models/res_config.py
@@ -749,3 +749,35 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin)
if (action_id):
return RedirectWarning(msg % values, action_id, _('Go to the configuration panel'))
return UserError(msg % values)
+
+ @api.model
+ def create(self, values):
+ # Optimisation: saving a res.config.settings even without changing any
+ # values will trigger the write of all related values. This in turn may
+ # trigger chain of further recomputation. To avoid it, delete values
+ # that were not changed.
+ for field in self._fields.values():
+ if not (field.name in values and field.related and not field.readonly):
+ continue
+ # we write on a related field like
+ # qr_code = fields.Boolean(related='company_id.qr_code', readonly=False)
+ fname0 = field.related[0]
+ if fname0 not in values:
+ continue
+
+ # determine the current value
+ field0 = self._fields[fname0]
+ old_value = field0.convert_to_record(
+ field0.convert_to_cache(values[fname0], self), self)
+ for fname in field.related[1:]:
+ old_value = next(iter(old_value), old_value)[fname]
+
+ # determine the new value
+ new_value = field.convert_to_record(
+ field.convert_to_cache(values[field.name], self), self)
+
+ # drop if the value is the same
+ if old_value == new_value:
+ values.pop(field.name)
+
+ return super(ResConfigSettings, self).create(values)