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