1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
##############################################################################
36
def __init__(self, view, model, res_id=False, domain=[], context={}, window=None, name=False):
37
self.glade = glade.XML(common.terp_path("openerp.glade"),'win_tree_container',gettext.textdomain())
38
self.widget = self.glade.get_widget('win_tree_container')
39
self.widget.show_all()
40
self.model = view['model']
42
if view.get('field_parent', False):
51
self.tree_res = view_tree.view_tree(view, [], res_id, True, context=context)
52
self.tree_res.view.connect('row-activated', self.sig_open)
54
sel = self.tree_res.view.get_selection()
55
sel.connect('changed', self.expand_one)
58
self.name = self.tree_res.name
61
self.vp = self.glade.get_widget('main_tree_sw')
63
wid = self.glade.get_widget('widget_vbox')
66
widget_sc = self.glade.get_widget('win_tree_sc')
68
widget_sc.connect('row-activated', self.sc_go)
69
self.tree_sc = view_tree.view_tree_sc(widget_sc, self.model)
71
'but_reload': self.sig_reload,
72
'but_switch': self.sig_edit,
73
'but_chroot': self.sig_chroot,
74
'but_open': self.sig_action,
75
'but_action': self.sig_action,
76
'but_print': self.sig_print,
77
'but_print_html': self.sig_print_html,
78
'but_close': self.sig_close,
79
'but_save_as': self.sig_save_as,
82
'on_but_sc_go_clicked': self.sc_go,
83
'on_but_sc_add_clicked': self.sc_add,
84
'on_but_sc_del_clicked': self.sc_del,
85
'on_but_expand_collapse_clicked': self.expand_collapse_all,
86
'on_tbsc_clicked': self.sc_btn,
89
self.vp.add(self.tree_res.widget_get())
93
self.glade.signal_connect(signal, dict[signal])
96
def sig_reload(self, widget=None):
98
ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', self.domain2)
99
if self.tree_res.toolbar:
101
wid = self.glade.get_widget('tree_toolbar')
102
for w in wid.get_children():
105
c.update(rpc.session.context)
106
res_ids = rpc.session.rpc_exec_auth_try('/object', 'execute', self.view['model'], 'read', ids, ['name',icon_name], c)
109
rb = gtk.RadioToolButton(group=rb)
110
l = gtk.Label(r['name'])
111
rb.set_label_widget(l)
115
if hasattr(r[icon_name], 'startswith') and r[icon_name].startswith('STOCK_'):
116
icon.set_from_stock(getattr(gtk, r[icon_name]), gtk.ICON_SIZE_BUTTON)
119
icon.set_from_stock(r[icon_name], gtk.ICON_SIZE_BUTTON)
123
hb = gtk.HBox(spacing=6)
125
hb.pack_start(gtk.Label(r['name']))
126
rb.set_icon_widget(hb)
128
rb.set_data('id', r['id'])
129
rb.connect('clicked', self.menu_main_clicked)
130
self.menu_main_clicked(rb)
133
self.tree_res.ids = ids
134
self.tree_res.reload()
135
wid = self.glade.get_widget('widget_vbox')
138
def menu_main_clicked(self, widget):
139
if widget.get_active():
140
id = widget.get_data('id')
142
ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'read', [id], [self.view['field_parent']])[0][self.view['field_parent']]
144
self.tree_res.ids = ids
145
self.tree_res.reload()
148
def expand_collapse_all(self, widget):
150
self.tree_res.view.expand_all()
152
self.tree_res.view.collapse_all()
153
self.expand = not self.expand
155
widget.set_stock_id('gtk-goto-bottom')
157
widget.set_stock_id('gtk-goto-top')
159
def expand_one(self, selection):
160
model,iter = selection.get_selected_rows()
162
self.tree_res.view.expand_row(iter[0],False)
164
def sig_print_html(self, widget=None, keyword='client_print_multi', id=None):
165
self.sig_action(keyword='client_print_multi', report_type='html')
167
def sig_print(self, widget=None, keyword='client_print_multi', id=None):
168
self.sig_action(keyword='client_print_multi')
170
def sig_action(self, widget=None, keyword='tree_but_action', id=None, report_type='pdf', warning=True):
173
if not id and ids and len(ids):
176
ctx = self.context.copy()
177
if 'active_ids' in ctx:
178
del ctx['active_ids']
179
if 'active_id' in ctx:
181
obj = service.LocalService('action.main')
182
return obj.exec_keyword(keyword, {'model':self.model, 'id':id,
183
'ids':ids, 'report_type':report_type, 'window': self.window}, context=ctx,
186
common.message(_('No resource selected!'))
189
def sig_open(self, widget, iter, path):
190
if not self.sig_action(widget, 'tree_but_open', warning=False):
191
if self.tree_res.view.row_expanded(iter):
192
self.tree_res.view.collapse_row(iter)
194
self.tree_res.view.expand_row(iter, False)
197
def sig_remove(self, widget=None):
200
if common.sur(_('Are you sure you want\nto remove this record?')):
202
rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'unlink', ids)
204
except xmlrpclib.Fault, err:
205
common.message(_('Error removing resource!'))
207
# TODO: improve with domain expr
208
def sig_chroot(self, widget=None):
210
if len(ids) and self.domain:
212
datas = {'domain_field': self.domain[0][0], 'domain_value': id[0], 'res_id':id[0]}
213
obj = service.LocalService('gui.window')
214
obj.create(self.view, self.model, id[0], (self.domain[0],id[0]) )
216
common.message(_('Unable to chroot: no tree resource selected'))
218
def sig_new(self, widget=None):
219
#datas = {'res_model':self.model, 'domain_field': self.domain[0], 'domain_value': self.id_get(), 'res_id':None}
220
# domain = self.domain
224
# domain=(domain[0],id)
225
obj = service.LocalService('gui.window')
226
obj.create(None, self.model, None, self.domain)
228
def sig_edit(self, widget=None):
233
elif self.tree_res.toolbar:
234
wid = self.glade.get_widget('tree_toolbar')
235
for w in wid.get_children():
237
id = w.get_data('id')
239
obj = service.LocalService('gui.window')
240
obj.create(None, self.model, id, self.domain)
242
common.message(_('No resource selected!'))
244
def domain_id_get(self, tree=False):
246
if self.domain and self.view.get('field_parent', False):
248
res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', filter)
251
def sig_printscreen(self, widget=None):
252
ids = self.tree_res.ids
255
def sc_btn(self, widget):
256
main = service.LocalService('gui.main')
257
main.shortcut_edit(widget, self.model)
259
def sc_del(self, widget):
260
id = self.tree_sc.sel_id_get()
262
sc_id = int(self.tree_sc.value_get(2))
263
rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'unlink', [sc_id])
264
self.tree_sc.update()
266
def sc_add(self, widget):
267
ids = self.tree_res.sel_ids_get()
269
res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'name_get', ids, rpc.session.context)
270
for (id,name) in res:
271
uid = rpc.session.uid
272
rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'create', {'resource':self.model, 'user_id':uid, 'res_id':id, 'name':name})
273
self.tree_sc.update()
275
def sc_go(self, widget=None, *args):
276
id = self.tree_sc.sel_id_get()
278
self.sig_action(None, 'tree_but_open', id)
281
res = self.tree_res.sel_ids_get()
286
if hasattr(self, 'search'):
287
return self.search[self.search_pos]
296
def sig_close(self, urgent=False):
299
def sig_save_as(self, widget=None):
301
win = win_export.win_export(self.model, self.tree_res.sel_ids_get(),
302
self.tree_res.fields, [], parent=self.window, context=self.context)
306
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: