diff options
Diffstat (limited to 'odoo/addons/base/models/res_config.py')
| -rw-r--r-- | odoo/addons/base/models/res_config.py | 32 |
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) |
