Xavier ALT (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-client/trunk-imp-gtk_recursive_onchange-xal into 
lp:openobject-client.

Requested reviews:
  OpenERP sa GTK client R&D (openerp-dev-gtk)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-imp-gtk_recursive_onchange-xal/+merge/104498

Hi,

This improve the GTK to allow recursive "on_change" updating.

Regards,
Xavier
-- 
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-imp-gtk_recursive_onchange-xal/+merge/104498
Your team OpenERP sa GTK client R&D is requested to review the proposed merge 
of lp:~openerp-dev/openobject-client/trunk-imp-gtk_recursive_onchange-xal into 
lp:openobject-client.
=== modified file 'bin/widget/model/field.py'
--- bin/widget/model/field.py	2011-12-09 09:33:16 +0000
+++ bin/widget/model/field.py	2012-05-03 07:41:20 +0000
@@ -62,7 +62,7 @@
         if self.get_state_attrs(model).get('readonly', False):
             return
         if self.attrs.get('on_change',False):
-            model.on_change(self.attrs['on_change'])
+            model.on_change(self.name, self.attrs['on_change'])
         if self.attrs.get('change_default', False):
             model.cond_default(self.attrs['name'], self.get(model))
 
@@ -122,7 +122,7 @@
         res = self.set(model, value)
         model.cond_default(self.attrs['name'], self.get(model))
         if self.attrs.get('on_change',False):
-            model.on_change(self.attrs['on_change'])
+            model.on_change(self.name, self.attrs['on_change'])
         return res
 
     def get_default(self, model):

=== modified file 'bin/widget/model/record.py'
--- bin/widget/model/record.py	2011-11-14 06:07:24 +0000
+++ bin/widget/model/record.py	2012-05-03 07:41:20 +0000
@@ -300,7 +300,10 @@
         return val
 
     #XXX Shoud use changes of attributes (ro, ...)
-    def on_change(self, callback):
+    def on_change(self, fieldname, callback, processed=None):
+        if processed is None:
+            processed = []
+        processed.append(fieldname)
         match = re.match('^\s?(.*?)\((.*?)\)\s?$', callback)
         if not match:
             raise Exception, 'ERROR: Wrong on_change trigger: %s' % callback
@@ -310,7 +313,18 @@
         ids = self.id and [self.id] or []
         response = getattr(self.rpc, func_name)(ids, *args)
         if response:
-            self.set(response.get('value', {}), modified=True)
+            values = response.get('value', {})
+            if isinstance(values, dict):
+                for ocv_field, ocv_value in values.iteritems():
+                    if not ocv_field in self.mgroup.mfields:
+                        continue # ignore field not in current view/model
+                    field = self.mgroup.mfields[ocv_field]
+                    cur_value = field.get(self)
+                    if ocv_value != cur_value:
+                        self.set({ocv_field: ocv_value}, modified=True)
+                        if field.attrs.get('on_change',False) and ocv_field not in processed:
+                            # calling recursive on_change for field not already processed
+                            self.on_change(field.name, field.attrs.get('on_change',False), processed=processed)
             if 'domain' in response:
                 for fieldname, value in response['domain'].items():
                     if fieldname not in self.mgroup.mfields:

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to