From 764c5acd81f3793606f1b9f7db48cc27bb837102 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 18 Sep 2014 10:31:18 +0200 Subject: [PATCH] [IMP] fields: reset decimal precision on new-style fields When a decimal_precision record is created/modified, the float fields of the models in the registry must be reset. This was done on old-API columns only. It is now handled by the new-API fields. --- addons/decimal_precision/decimal_precision.py | 9 +++++---- openerp/fields.py | 9 ++++++++- openerp/modules/registry.py | 9 +++++---- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/addons/decimal_precision/decimal_precision.py b/addons/decimal_precision/decimal_precision.py index eeacab9203e..f06e88ddda1 100644 --- a/addons/decimal_precision/decimal_precision.py +++ b/addons/decimal_precision/decimal_precision.py @@ -48,10 +48,11 @@ class decimal_precision(orm.Model): def clear_cache(self, cr): """clear cache and update models. Notify other workers to restart their registry.""" self.precision_get.clear_cache(self) - for obj in self.pool.obj_list(): - for colname, col in self.pool.get(obj)._columns.items(): - if hasattr(col, 'digits_change'): - col.digits_change(cr) + env = openerp.api.Environment(cr, SUPERUSER_ID, {}) + for model in self.pool.values(): + for field in model._fields.values(): + if field.type == 'float': + field._setup_digits(env) RegistryManager.signal_caches_change(cr.dbname) def create(self, cr, uid, data, context=None): diff --git a/openerp/fields.py b/openerp/fields.py index e103ee14515..1381a3df844 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -933,9 +933,16 @@ class Float(Field): def __init__(self, string=None, digits=None, **kwargs): super(Float, self).__init__(string=string, _digits=digits, **kwargs) + def _setup_digits(self, env): + """ Setup the digits for `self` and its corresponding column """ + self.digits = self._digits(env.cr) if callable(self._digits) else self._digits + if self.store: + column = env[self.model_name]._columns[self.name] + column.digits_change(env.cr) + def _setup_regular(self, env): super(Float, self)._setup_regular(env) - self.digits = self._digits(env.cr) if callable(self._digits) else self._digits + self._setup_digits(env) _related_digits = property(attrgetter('digits')) diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py index c87d944bd7c..679fae0cfc2 100644 --- a/openerp/modules/registry.py +++ b/openerp/modules/registry.py @@ -415,10 +415,11 @@ class RegistryManager(object): # One possible reason caches have been invalidated is the # use of decimal_precision.write(), in which case we need # to refresh fields.float columns. - for model in registry.models.values(): - for column in model._columns.values(): - if hasattr(column, 'digits_change'): - column.digits_change(cr) + env = openerp.api.Environment(cr, SUPERUSER_ID, {}) + for model in registry.values(): + for field in model._fields.values(): + if field.type == 'float': + field._setup_digits(env) registry.base_registry_signaling_sequence = r registry.base_cache_signaling_sequence = c finally: