[IMP] fields: reset decimal precision on new-style fields
authorRaphael Collet <rco@openerp.com>
Thu, 18 Sep 2014 08:31:18 +0000 (10:31 +0200)
committerRaphael Collet <rco@openerp.com>
Thu, 18 Sep 2014 09:11:19 +0000 (11:11 +0200)
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
openerp/fields.py
openerp/modules/registry.py

index eeacab9..f06e88d 100644 (file)
@@ -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):
index e103ee1..1381a3d 100644 (file)
@@ -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'))
 
index c87d944..679fae0 100644 (file)
@@ -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: