1
##############################################################################
3
# Copyright (c) 2004 TINY SPRL. (http://tiny.be) All Rights Reserved.
4
# Fabien Pinckaers <fp@tiny.Be>
6
# WARNING: This program as such is intended to be used by professional
7
# programmers who take the whole responsability of assessing all potential
8
# consequences resulting from its eventual inadequacies and bugs
9
# End users who are looking for a ready-to-use solution with commercial
10
# garantees and support are strongly adviced to contract a Free Software
13
# This program is Free Software; you can redistribute it and/or
14
# modify it under the terms of the GNU General Public License
15
# as published by the Free Software Foundation; either version 2
16
# of the License, or (at your option) any later version.
18
# This program is distributed in the hope that it will be useful,
19
# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
# GNU General Public License for more details.
23
# You should have received a copy of the GNU General Public License
24
# along with this program; if not, write to the Free Software
25
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27
##############################################################################
41
def __init__(self, view, model, res_id=False, domain=[], context={}):
42
self.glade = glade.XML(common.terp_path("terp.glade"),'win_tree_container',gettext.textdomain())
43
self.widget = self.glade.get_widget('win_tree_container')
44
self.widget.show_all()
45
self.model = view['model']
47
if view.get('field_parent', False):
53
ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', self.domain2)
56
self.tree_res = view_tree.view_tree(view, [], res_id, True, context=context)
57
self.tree_res.view.connect('row-activated', self.sig_open)
59
sel = self.tree_res.view.get_selection()
60
sel.connect('changed', self.expand_one)
62
self.name = self.tree_res.name
63
self.vp = self.glade.get_widget('main_tree_sw')
65
wid = self.glade.get_widget('widget_vbox')
66
if options.options['client.modepda']:
71
widget_sc = self.glade.get_widget('win_tree_sc')
73
imagename = 'tinyerp.png'
75
widget_sc.connect('row-activated', self.sc_go)
76
self.tree_sc = view_tree.view_tree_sc(widget_sc, self.model)
78
'but_reload': (_('Reload'),self.sig_reload),
79
'but_switch': (_('Switch View'),self.sig_edit),
80
'but_chroot': (_('Changt root'),self.sig_chroot),
81
'but_open': (_('Open'),self.sig_open),
82
'but_action': (_('Open'),self.sig_action),
83
'but_print': (_('Print'),self.sig_print),
84
'but_print_html': (_('Print'),self.sig_print_html),
85
'but_close': (_('Close'),self.sig_close)
88
'on_but_sc_go_clicked': self.sc_go,
89
'on_but_sc_add_clicked': self.sc_add,
90
'on_but_sc_del_clicked': self.sc_del
93
self.vp.add(self.tree_res.widget_get())
94
if self.tree_res.toolbar:
97
wid = self.glade.get_widget('tree_toolbar')
99
c.update(rpc.session.context)
100
res_ids = rpc.session.rpc_exec_auth_try('/object', 'execute', self.view['model'], 'read', ids, ['name',icon_name], c)
103
rb = gtk.RadioToolButton(group=rb)
104
l = gtk.Label(r['name'])
105
rb.set_label_widget(l)
108
if r[icon_name].startswith('STOCK_'):
109
icon.set_from_stock(getattr(gtk, r[icon_name]), gtk.ICON_SIZE_BUTTON)
111
icon.set_from_stock(r[icon_name], gtk.ICON_SIZE_BUTTON)
113
hb = gtk.HBox(spacing=6)
115
hb.pack_start(gtk.Label(r['name']))
116
rb.set_icon_widget(hb)
118
rb.set_data('id', r['id'])
119
rb.connect('clicked', self.menu_main_clicked)
120
#rb.set_active(False)
121
self.menu_main_clicked(rb)
124
self.tree_res.ids = ids
125
self.tree_res.reload()
126
wid = self.glade.get_widget('tree_toolbar')
128
wid = self.glade.get_widget('tree_vpaned')
133
self.glade.signal_connect(signal, dict[signal])
135
def menu_main_clicked(self, widget):
136
if widget.get_active():
137
id = widget.get_data('id')
139
ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'read', [id], [self.view['field_parent']])[0][self.view['field_parent']]
141
self.tree_res.ids = ids
142
self.tree_res.reload()
144
#self.tree_res = view_tree.view_tree(self.view, ids, id, True, context=self.context)
145
#self.tree_res.view.connect('row-activated', self.sig_open)
146
#sel = self.tree_res.view.get_selection()
147
#sel.connect('changed', self.expand_one)
150
def menu_main_change(self):
151
self.tree_res = view_tree.view_tree(view, ids, res_id, True, context=context)
152
self.tree_res.view.connect('row-activated', self.sig_open)
153
sel = self.tree_res.view.get_selection()
154
sel.connect('changed', self.expand_one)
155
self.name = self.tree_res.name
156
self.vp.remove(self.vp.get_child())
160
def expand_one(self, selection):
161
model,iter = selection.get_selected_rows()
163
self.tree_res.view.expand_row(iter[0],False)
165
def sig_print_html(self, widget=None, keyword='client_print_multi', id=None):
166
self.sig_action(keyword='client_print_multi', report_type='html')
168
def sig_print(self, widget=None, keyword='client_print_multi', id=None):
169
self.sig_action(keyword='client_print_multi')
171
def sig_action(self, widget=None, keyword='tree_but_action', id=None, report_type='pdf'):
174
if not id and ids and len(ids):
177
obj = service.LocalService('action.main')
178
obj.exec_keyword(keyword, {'model':self.model, 'id':id,
179
'ids':ids, 'report_type':report_type})
181
common.message(_('No resource selected!'))
183
def sig_reload(self, widget=None):
184
self.tree_res.reload()
186
def sig_open(self, widget=None, *args):
187
self.sig_action(widget, 'tree_but_open' )
189
def sig_remove(self, widget=None):
192
if common.sur(_('Are you sure you want\nto remove this record?')):
194
rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'unlink', ids)
196
except xmlrpclib.Fault, err:
197
common.message(_('Error removing resource!'))
199
# TODO: improve with domain expr
200
def sig_chroot(self, widget=None):
202
if len(ids) and self.domain:
204
datas = {'domain_field': self.domain[0][0], 'domain_value': id[0], 'res_id':id[0]}
205
obj = service.LocalService('gui.window')
206
obj.create(self.view, self.model, id[0], (self.domain[0],id[0]) )
208
common.message(_('Unable to chroot: no tree resource selected'))
210
def sig_new(self, widget=None):
211
#datas = {'res_model':self.model, 'domain_field': self.domain[0], 'domain_value': self.id_get(), 'res_id':None}
212
# domain = self.domain
216
# domain=(domain[0],id)
217
obj = service.LocalService('gui.window')
218
obj.create(None, self.model, None, self.domain)
220
def sig_edit(self, widget=None):
223
obj = service.LocalService('gui.window')
224
obj.create(None, self.model, ids[0], self.domain)
226
common.message(_('No resource selected!'))
228
def domain_id_get(self, tree=False):
230
if self.domain and self.view.get('field_parent', False):
232
res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', filter)
235
def sig_printscreen(self, widget=None):
236
ids = self.tree_res.ids
239
def sc_del(self, widget):
240
id = self.tree_sc.sel_id_get()
242
sc_id = int(self.tree_sc.value_get(2))
243
rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'unlink', [sc_id])
244
self.tree_sc.update()
246
def sc_add(self, widget):
247
ids = self.tree_res.sel_ids_get()
249
res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'name_get', ids, rpc.session.context)
250
for (id,name) in res:
251
uid = rpc.session.uid
252
rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'create', {'resource':self.model, 'user_id':uid, 'res_id':id, 'name':name})
253
self.tree_sc.update()
255
def sc_go(self, widget=None, *args):
256
id = self.tree_sc.sel_id_get()
258
self.sig_action(None, 'tree_but_open', id)
261
res = self.tree_res.sel_ids_get()
266
return self.search[self.search_pos]
273
def sig_close(self, urgent=False):