tfr (Openerp) has proposed merging lp:~tfr/openobject-client/tfr-leak-dev into 
lp:openobject-client.

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

-- 
https://code.launchpad.net/~tfr/openobject-client/tfr-leak-dev/+merge/42626
Your team OpenERP sa GTK client R&D is requested to review the proposed merge 
of lp:~tfr/openobject-client/tfr-leak-dev into lp:openobject-client.
=== modified file 'bin/modules/action/main.py'
--- bin/modules/action/main.py	2010-11-19 09:46:41 +0000
+++ bin/modules/action/main.py	2010-12-03 14:45:36 +0000
@@ -106,7 +106,6 @@
                     view_ids=[x[0] for x in action['views']]
                     datas['view_mode']=",".join([x[1] for x in action['views']])
                 else:
-#                    view_ids=[(action['view_type']=='tree') and 1 or False,(action['view_type']=='form') and 1 or False]
                     if action.get('view_id', False):
                         view_ids=[action['view_id'][0]]
             elif action.get('view_id', False):

=== modified file 'bin/modules/action/wizard.py'
--- bin/modules/action/wizard.py	2010-10-07 10:14:57 +0000
+++ bin/modules/action/wizard.py	2010-12-03 14:45:36 +0000
@@ -90,6 +90,7 @@
             return (self.states[res], datas)
         else:
             self.dia.destroy()
+            self.screen.destroy()
             return False
 
 def execute(action, datas, state='init', parent=None, context=None):

=== modified file 'bin/modules/gui/main.py'
--- bin/modules/gui/main.py	2010-11-10 12:47:34 +0000
+++ bin/modules/gui/main.py	2010-12-03 14:45:36 +0000
@@ -42,6 +42,13 @@
 import xmlrpclib
 import base64
 
+
+import thread
+
+
+import gc
+
+
 RESERVED_KEYWORDS=['absolute', 'action', 'all', 'alter', 'analyse', 'analyze', 'and', 'any', 'as', 'asc', 'authorization', 'between', 'binary', 'both',
             'case', 'cast', 'check', 'collate', 'column','constraint', 'create', 'cross', 'current_date', 'current_time', 'current_timestamp',
             'current_user','default', 'deferrable', 'desc', 'distinct', 'do', 'else', 'end', 'except', 'false', 'for', 'foreign', 'freeze',
@@ -684,6 +691,7 @@
 
 class terp_main(service.Service):
     def __init__(self, name='gui.main', audience='gui.*'):
+     
         service.Service.__init__(self, name, audience)
         self.exportMethod(self.win_add)
 
@@ -924,7 +932,7 @@
             self.sb_company.push(id, '')
         return True
 
-    def sig_win_close(self, *args):
+    def sig_win_close(self, *args):        
         if len(args) >= 2:
             button = args[1].button
             if (isinstance(args[0], gtk.Button) and button in [1,2]) \
@@ -1159,7 +1167,7 @@
         if except_id and act_id == except_id:
             return act_id
         obj = service.LocalService('action.main')
-        win = obj.execute(act_id, {'window':self.window})
+        obj.execute(act_id, {'window':self.window})
         try:
             user = rpc.session.rpc_exec_auth_wo('/object', 'execute', 'res.users',
                     'read', [rpc.session.uid], [type,'name'], rpc.session.context)
@@ -1198,6 +1206,9 @@
         return True
 
     def win_add(self, win, datas):
+        """
+            Add a tab in client
+        """
         self.pages.append(win)
         box = gtk.HBox(False, 0)
 
@@ -1284,19 +1295,26 @@
                 self.buttons[x].set_sensitive(view and (x in view.handlers))
 
     def _win_del(self,page_num=None):
+        """
+            Del tab in Client
+        """
         if page_num is not None:
             pn = page_num
         else:
             pn = self.notebook.get_current_page()
         if pn != -1:
+            
             self.notebook.disconnect(self.sig_id)
             page = self.pages.pop(pn)
+            
             self.notebook.remove_page(pn)
             self.sig_id = self.notebook.connect_after('switch-page', self._sig_page_changed)
             self.sb_set()
-
-            #page.destroy()
-            #del page
+            page.destroy()
+            del page
+            gc.collect()
+            
+       
         return self.notebook.get_current_page() != -1
 
     def _wid_get(self,page_num=None):
@@ -1332,6 +1350,7 @@
                     self._update_attachment_button(wid)
             if button_name=='but_close' and res:
                 self._win_del(page_num)
+        
 
     def _sig_page_changed(self, widget=None, *args):
         self.last_page = self.current_page
@@ -1525,8 +1544,7 @@
         return (url,db,passwd)
 
     def _choose_db_ent(self):
-        dialog = glade.XML(common.terp_path("openerp.glade"), "win_db_ent",
-                gettext.textdomain())
+        dialog = glade.XML(common.terp_path("openerp.glade"), "win_db_ent", gettext.textdomain())
         win = dialog.get_widget('win_db_ent')
         win.set_icon(common.OPENERP_ICON)
         win.set_transient_for(self.window)

=== modified file 'bin/modules/gui/window/form.py'
--- bin/modules/gui/window/form.py	2010-10-28 09:58:30 +0000
+++ bin/modules/gui/window/form.py	2010-12-03 14:45:36 +0000
@@ -40,6 +40,8 @@
 import options
 import copy
 import gc
+import pprint
+pp = pprint.PrettyPrinter(indent=4)
 
 from observator import oregistry
 from widget.screen import Screen
@@ -195,18 +197,30 @@
         if response == gtk.RESPONSE_OK:
             self.get_resource(widget)
 
-
     def destroy(self):
+        """
+            Destroy the page object and all the child 
+            (or at least should do this)
+        """
         oregistry.remove_receiver('misc-message', self._misc_message)
         self.screen.signal_unconnect(self)
         self.screen.destroy()
+        self.widget.destroy()
+        self.sw.destroy()
         del self.screen
-        del self.glade
         del self.widget
-        self.sw.destroy()
         del self.sw
-        gc.collect()
-
+        
+        
+        del self.window    
+        del self.glade
+        del self.handlers
+        del self.context
+        del self.domain
+        del self.has_backup
+        del self.model
+        del self.name
+        
     def ids_get(self):
         return self.screen.ids_get()
 
@@ -463,7 +477,11 @@
         return True
 
     def sig_close(self, urgent=False):
-        return self.modified_save(reload=False)
-
+        res = self.modified_save(reload=False)
+        return res
+    
+  
+        
+    
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 

=== modified file 'bin/modules/gui/window/tree.py'
--- bin/modules/gui/window/tree.py	2010-12-03 09:31:10 +0000
+++ bin/modules/gui/window/tree.py	2010-12-03 14:45:36 +0000
@@ -31,6 +31,10 @@
 import options
 import win_export
 
+import gc
+import pprint
+pp = pprint.PrettyPrinter(indent=4)
+
 class tree(object):
     def __init__(self, view, model, res_id=False, domain=[], context={}, help={}, window=None, name=False):
         self.glade = glade.XML(common.terp_path("openerp.glade"),'win_tree_container',gettext.textdomain())
@@ -309,7 +313,8 @@
             return None
 
     def destroy(self):
-        pass
+        print "TODO destroy gui.window.tree"
+        pp.pprint(gc.get_referents(self))
 
     def sig_close(self, urgent=False):
         return True

=== modified file 'bin/modules/gui/window/win_list.py'
--- bin/modules/gui/window/win_list.py	2010-01-12 09:24:17 +0000
+++ bin/modules/gui/window/win_list.py	2010-12-03 14:45:36 +0000
@@ -44,7 +44,6 @@
         self.model_name = model
         view = rpc.session.rpc_exec_auth('/object', 'execute', model, 'fields_view_get', False, 'tree', context)
         self.view_data = view
-
         self.tree = widget.tree(view['arch'], view['fields'], model, sel_multi=sel_multi, search=search)
         self.tree.context = context
         self.fields = view['fields']
@@ -53,6 +52,7 @@
         self.fields_order = self.tree.fields_order
 
     def destroy(self):
+        print "destroy of win_list"
         self.tree.destroy()
         del self.fields_order
         del self.widget

=== modified file 'bin/modules/gui/window/win_search.py'
--- bin/modules/gui/window/win_search.py	2010-10-12 06:12:38 +0000
+++ bin/modules/gui/window/win_search.py	2010-12-03 14:45:36 +0000
@@ -103,6 +103,7 @@
     def destroy(self):
         self.window.present()
         self.dia.destroy()
+        self.screen.destroy()
 
 
 class win_search(object):

=== modified file 'bin/openerp-client.py'
--- bin/openerp-client.py	2010-10-11 13:19:15 +0000
+++ bin/openerp-client.py	2010-12-03 14:45:36 +0000
@@ -128,7 +128,7 @@
         factory.add('terp-'+iname, icon_set)
 
 try:
-    win = modules.gui.main.terp_main()
+    win = modules.gui.main.terp_main() #create service
     if options.options.rcexist:
         win.sig_login()
     if os.name == 'nt':

=== modified file 'bin/widget/model/field.py'
--- bin/widget/model/field.py	2010-11-16 13:11:20 +0000
+++ bin/widget/model/field.py	2010-12-03 14:45:36 +0000
@@ -22,6 +22,8 @@
 from rpc import RPCProxy
 import rpc
 
+
+
 try:
     set
 except NameError:
@@ -51,6 +53,16 @@
         self.name = attrs['name']
         self.internal = False
         self.default_attrs = {}
+        
+    def destroy(self):        
+        self.generic_destroy()
+        
+    def generic_destroy(self):
+        del self.attrs
+        del self.default_attrs
+        del self.name
+        del self.parent
+        del self.internal
 
     def sig_changed(self, model):
         if self.get_state_attrs(model).get('readonly', False):
@@ -163,6 +175,9 @@
         return model.state_attrs[self.name]
 
 class BinaryField(CharField):
+    def destroy(self):
+        super(BinaryField, self).generic_destroy()
+    
     def __check_model(self, model):
         assert self.name in model.mgroup.mfields
 
@@ -230,6 +245,10 @@
 
 
 class SelectionField(CharField):
+    
+    def destroy(self):
+        super(SelectionField, self).generic_destroy()
+        
     def set(self, model, value, test_state=True, modified=False):
         value = isinstance(value,(list,tuple)) and len(value) and value[0] or value
 
@@ -240,6 +259,9 @@
             super(SelectionField, self).set(model, value, test_state, modified)
 
 class FloatField(CharField):
+    def destroy(self):
+        super(FloatField, self).generic_destroy()
+    
     def validate(self, model):
         self.get_state_attrs(model)['valid'] = True
         return True
@@ -256,6 +278,9 @@
 
 class IntegerField(CharField):
 
+    def destroy(self):
+        super(IntegerField, self).generic_destroy()
+        
     def get(self, model, check_load=True, readonly=True, modified=False):
         return model.value.get(self.name, 0) or 0
 
@@ -280,6 +305,9 @@
     '''
     internal = (id, name)
     '''
+    
+    def destroy(self):
+        super(M2OField, self).generic_destroy()
 
     def create(self, model):
         return False
@@ -325,7 +353,11 @@
     def __init__(self, parent, attrs):
         super(M2MField, self).__init__(parent, attrs)
         self.limit = DEFAULT_PAGER_LIMIT
-
+        
+    def destroy(self):
+        super(M2MField, self).generic_destroy()
+        del self.limit
+        
     def create(self, model):
         return []
 
@@ -370,6 +402,11 @@
         super(O2MField, self).__init__(parent, attrs)
         self.context={}
         self.limit = DEFAULT_PAGER_LIMIT
+        
+    def destroy(self):
+        super(O2MField, self).generic_destroy()
+        del self.context
+        del self.limit
 
     def create(self, model):
         from widget.model.group import ModelRecordGroup
@@ -496,6 +533,9 @@
         if modified:
             model.modified = True
             model.modified_fields.setdefault(self.name)
+            
+    def destroy(self):
+        super(ReferenceField, self).generic_destroy()
 
 TYPES = {
     'char' : CharField,

=== modified file 'bin/widget/model/group.py'
--- bin/widget/model/group.py	2010-08-12 15:33:17 +0000
+++ bin/widget/model/group.py	2010-12-03 14:45:36 +0000
@@ -100,6 +100,27 @@
 
         self.list_parent = False
         self.list_group = False
+        
+    def destroy(self):        
+        for field in self.mfields.values():
+            field.destroy()
+            
+        if self.list_group:
+            self.list_group.destroy()
+        
+        for model in self.models:
+            model.destroy()
+            
+        del self.mfields
+        del self._context
+        del self.fields        
+        del self._readonly
+        del self.current_idx
+        del self.is_wizard
+        del self.list_group
+        del self.models
+        del self.resource
+        del self.rpc
 
     def index(self, model):
         return self.models.index(model)

=== modified file 'bin/widget/model/record.py'
--- bin/widget/model/record.py	2010-12-03 09:31:10 +0000
+++ bin/widget/model/record.py	2010-12-03 14:45:36 +0000
@@ -70,6 +70,31 @@
             if (new and val.attrs['type']=='one2many') and (val.attrs.get('mode', 'tree,form').startswith('form')):
                 mod = self.value[key].model_new()
                 self.value[key].model_add(mod)
+                
+    def destroy(self):
+        if self.destroy:
+            return   
+        
+        if hasattr(self, 'list_group'):
+            del self.list_group
+            
+        if hasattr(self, 'mgroup'):
+            del self.mgroup
+            
+        del self.mgroup
+        del self.value
+        del self.state_attrs
+        del self.rpc
+        del self._concurrency_check_data
+        del self._loaded
+        del self.id
+        del self.is_m2m_modified
+        del self.list_parent
+        del self.modified
+        del self.modified_fields
+        del self.pager_cache
+        del self.parent
+        del self.resource
 
     def __getitem__(self, name):
         return self.mgroup.mfields.get(name, False)

=== modified file 'bin/widget/screen/screen.py'
--- bin/widget/screen/screen.py	2010-11-16 06:03:54 +0000
+++ bin/widget/screen/screen.py	2010-12-03 14:45:36 +0000
@@ -40,7 +40,6 @@
 import common
 import copy
 
-
 class Screen(signal_event.signal_event):
 
     def __init__(self, model_name, view_ids=None, view_type=None,help={},
@@ -463,13 +462,70 @@
     current_model = property(_get_current_model, _set_current_model)
 
     def destroy(self):
+       
+        
         for view in self.views:
             view.destroy()
-            del view
-        #del self.current_model
+                    
+        if hasattr(self, 'filter_widget') and self.filter_widget:        
+            self.filter_widget.destroy()
+            del self.filter_widget
+        
+        self.widget.destroy()            
         self.models.signal_unconnect(self)
+        self.models.destroy()        
+        self.screen_container.destroy()
+        
         del self.models
+        del self.widget
+        
         del self.views
+        del self.fields
+        del self.view_fields
+        del self.search_view
+        del self._Screen__current_model
+        del self._Screen__current_view
+        del self._readonly       
+        del self.action_domain
+        del self.auto_search
+        del self.context
+        del self.context_init
+        del self.create_new
+        del self.domain
+        del self.domain_init
+        del self.dummy_cal
+        
+        del self.hassubmenu
+        del self.hastoolbar
+        del self.help_mode
+        del self.is_wizard
+        del self.latest_search
+        del self.limit
+        del self.name
+        del self.offset
+        del self.old_ctx
+        del self.old_limit
+     
+        del self.resource
+        del self.row_activate
+        del self.rpc
+        del self.screen_container
+        del self.search_count
+        del self.show_search
+        del self.sort
+        del self.tree_saves
+        del self.type
+        del self.view_ids
+        del self.view_to_load
+        del self.views_preload
+        
+        del self.win_search
+        del self.win_search_callback
+        del self.win_search_domain
+        del self.win_search_ids
+        del self.window
+
+        
 
     # mode: False = next view, value = open this view
     def switch_view(self, screen=None, mode=False):

=== modified file 'bin/widget/view/calendar.py'
--- bin/widget/view/calendar.py	2010-08-17 09:12:48 +0000
+++ bin/widget/view/calendar.py	2010-12-03 14:45:36 +0000
@@ -43,11 +43,6 @@
     def __getitem__(self, name):
         return None
 
-    def destroy(self):
-        self.widget.destroy()
-        del self.screen
-        del self.widget
-
     def set_value(self):
         pass
 
@@ -84,6 +79,11 @@
         # we don't set_cursor for now, as we're not showing selected
         # item in a special way
         pass
+    
+    def destroy(self):
+        self.widget.destroy()
+        del self.screen
+        del self.widget
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 

=== modified file 'bin/widget/view/diagram.py'
--- bin/widget/view/diagram.py	2010-08-17 09:12:48 +0000
+++ bin/widget/view/diagram.py	2010-12-03 14:45:36 +0000
@@ -42,11 +42,6 @@
     def __getitem__(self, name):
         return None
 
-    def destroy(self):
-        self.widget.destroy()
-        del self.screen
-        del self.widget
-
     def set_value(self):
         pass
 
@@ -74,6 +69,11 @@
 
     def set_cursor(self, new=False):
         pass
+    
+    def destroy(self):
+        self.widget.destroy()
+        del self.screen
+        del self.widget
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 

=== modified file 'bin/widget/view/form.py'
--- bin/widget/view/form.py	2010-12-03 09:31:10 +0000
+++ bin/widget/view/form.py	2010-12-03 14:45:36 +0000
@@ -302,7 +302,8 @@
     def __getitem__(self, name):
         return self.widgets[name]
 
-    def destroy(self):
+    def destroy(self): 
+        print "TODO destroy widget.view.form"
         self.widget.destroy()
         for widget in self.widgets.keys():
             self.widgets[widget].widget.destroy()

=== modified file 'bin/widget/view/form_gtk/many2one.py'
--- bin/widget/view/form_gtk/many2one.py	2010-11-19 10:29:39 +0000
+++ bin/widget/view/form_gtk/many2one.py	2010-12-03 14:45:36 +0000
@@ -121,6 +121,7 @@
     def destroy(self):
         self.window.present()
         self.dia.destroy()
+        self.screen.destroy()
 
 class Button(gtk.Button):
     def __init__(self, stock_id, callback, tooltips_string):

=== modified file 'bin/widget/view/gantt.py'
--- bin/widget/view/gantt.py	2010-08-17 09:12:48 +0000
+++ bin/widget/view/gantt.py	2010-12-03 14:45:36 +0000
@@ -41,11 +41,7 @@
     def __getitem__(self, name):
         return None
 
-    def destroy(self):
-        self.widget.destroy()
-        del self.screen
-        del self.widget
-
+    
     def set_value(self):
         pass
 
@@ -73,6 +69,12 @@
 
     def set_cursor(self, new=False):
         pass
+    
+    def destroy(self):
+        self.widget.destroy()
+        del self.screen
+        del self.widget
+
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 

=== modified file 'bin/widget/view/graph.py'
--- bin/widget/view/graph.py	2010-08-17 09:12:48 +0000
+++ bin/widget/view/graph.py	2010-12-03 14:45:36 +0000
@@ -23,6 +23,7 @@
 import gtk
 from interface import parser_view
 
+
 class ViewGraph(parser_view):
 
     def __init__(self, window, screen, widget, children=None, buttons=None,
@@ -73,6 +74,16 @@
 
     def set_cursor(self, new=False):
         pass
+    
+    def destroy(self):
+        self.widget.destroy()
+        
+        del self.screen        
+        del self.widget
+        del self.view
+        del self.window
+        del self.title
+        del self.view_type
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 

=== modified file 'bin/widget/view/graph_gtk/graph.py'
--- bin/widget/view/graph_gtk/graph.py	2010-11-02 11:30:56 +0000
+++ bin/widget/view/graph_gtk/graph.py	2010-12-03 14:45:36 +0000
@@ -35,6 +35,10 @@
 from widget.view import interface
 from widget.view.list import group_record
 
+import gc
+import pprint
+pp = pprint.PrettyPrinter(indent=4)
+
 DT_FORMAT = '%Y-%m-%d'
 DHM_FORMAT = '%Y-%m-%d %H:%M:%S'
 HM_FORMAT = '%H:%M:%S'
@@ -137,6 +141,10 @@
             self._canvas.queue_resize()
         except:
             pass
+        
+    def destroy(self):
+        print "TODO destroy GRAPH VIEW"
+        pp.pprint(gc.get_referents(self))
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 

=== modified file 'bin/widget/view/list.py'
--- bin/widget/view/list.py	2010-12-03 11:17:56 +0000
+++ bin/widget/view/list.py	2010-12-03 14:45:36 +0000
@@ -118,6 +118,17 @@
         self.sort_order = sort_order
         self.lst = []
         self.load()
+        
+    def destroy(self):
+        for model in self.lst:
+            model.destroy()
+            
+    
+        del self.context
+        del self.domain
+        del self.loaded
+        del self.mgroup
+        del self.lst
 
     def add_dummny_record(self, group_field):
         record = { group_field:'This group is now empty ! Please refresh the list.'}
@@ -827,3 +838,5 @@
             if col.name in self.screen.context.get('group_by',[]):
                 value = False
             col.set_visible(not value)
+            
+   

=== modified file 'bin/widget/view/screen_container.py'
--- bin/widget/view/screen_container.py	2010-10-21 05:36:26 +0000
+++ bin/widget/view/screen_container.py	2010-12-03 14:45:36 +0000
@@ -48,6 +48,56 @@
         self.domain = []
         self.context = {}
         self.handler_id = None
+        
+    def destroy(self):        
+        if hasattr(self, 'action_combo') and self.action_combo:
+            self.action_combo.destroy()
+            del self.action_combo
+
+        if hasattr(self, 'but_next') and self.but_next:
+            self.but_next.destroy()
+            del self.but_next
+        
+        if hasattr(self, 'but_previous') and self.but_previous:
+            self.but_previous.destroy()
+            del self.but_previous
+            
+        if hasattr(self, 'button') and self.button:
+            self.button.destroy()
+            del self.button
+            
+        if hasattr(self, 'button_dynamic') and self.button_dynamic:
+            self.button_dynamic.destroy()
+            del self.button_dynamic
+            
+        if hasattr(self, 'combo') and self.combo:
+            self.combo.destroy()
+            del self.combo
+            
+        if hasattr(self, 'filter_vbox') and self.filter_vbox:
+            self.filter_vbox.destroy()
+            del self.filter_vbox
+            
+        if hasattr(self, 'help_frame') and self.help_frame:
+            self.help_frame.destroy()
+            del self.help_frame
+    
+        self.sw.destroy()
+        self.vbox.destroy()
+        self.vp.destroy()
+        
+        if hasattr(self, 'action_list'):
+            del self.action_list
+        
+        if hasattr(self, 'limit_combo'):
+            del self.limit_combo
+        
+        del self.sw
+        del self.vbox
+        del self.vp
+        del self.handler_id
+        del self.help
+        del self.last_active_filter
 
     def widget_get(self):
         return self.vbox

=== modified file 'bin/widget_search/form.py'
--- bin/widget_search/form.py	2010-10-13 09:55:25 +0000
+++ bin/widget_search/form.py	2010-12-03 14:45:36 +0000
@@ -102,6 +102,15 @@
         wid_list.reverse()
         table.set_focus_chain(wid_list)
         return wid
+    
+    def destroy(self):
+        del self.col
+        del self.cont
+        del self.count
+        del self.flag
+        del self.max_width
+        del self.width
+        
 
 class parse(object):
     def __init__(self, parent, fields, model, col=6):
@@ -123,6 +132,21 @@
         self.col = col
         self.focusable = None
         self.add_widget_end = []
+        
+    def destroy(self):
+        self.container.destroy()
+        self.focusable.destroy()
+        self.widget.destroy()
+        del self.container
+        del self.col
+        del self.fields
+        del self.focusable
+        del self.model
+        del self.name_lst
+        del self.name_lst1
+        #'notebooks': [],
+        del self.parent
+        del self.widget
 
     def custom_remove(self, button, custom_panel):
         custom_panel.destroy()
@@ -401,6 +425,26 @@
                     domain = res1 + res2
         return {'domain':domain, 'context':context}
 
+    def destroy(self):
+        
+        self.focusable.destroy()
+        self.parser.destroy()
+        self.widget.destroy()
+        del self.call
+        del self.fields
+        del self.widgets 
+        del self.attrs
+        del self.focusable
+        del self.groupby
+        del self.model
+        del self.name
+        del self.parent
+        del self.parser
+        del self.rows
+        del self.widget
+        
+    
+    
     def _value_set(self, value):
         for x in value:
             if x in self.widgets:
@@ -409,6 +453,8 @@
                 self.custom_widgets[x][0].value = value[x]
 
     value = property(_value_get, _value_set, None, _('The content of the form or exception if not valid'))
+    
+    
 
 import calendar
 import spinbutton

_______________________________________________
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