Print this page
*** NO COMMENTS ***
| Split |
Close |
| Expand all |
| Collapse all |
--- old/src/gui/modules/repository.py
+++ new/src/gui/modules/repository.py
1 1 #!/usr/bin/python2.4
2 2 #
3 3 # CDDL HEADER START
4 4 #
5 5 # The contents of this file are subject to the terms of the
6 6 # Common Development and Distribution License (the "License").
7 7 # You may not use this file except in compliance with the License.
8 8 #
9 9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 10 # or http://www.opensolaris.org/os/licensing.
11 11 # See the License for the specific language governing permissions
12 12 # and limitations under the License.
13 13 #
14 14 # When distributing Covered Code, include this CDDL HEADER in each
15 15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 16 # If applicable, add the following below this CDDL HEADER, with the
17 17 # fields enclosed by brackets "[]" replaced with your own identifying
18 18 # information: Portions Copyright [yyyy] [name of copyright owner]
19 19 #
20 20 # CDDL HEADER END
21 21 #
22 22 # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 23 # Use is subject to license terms.
24 24 #
25 25
26 26 import sys
27 27 from threading import Thread
28 28
29 29 try:
30 30 import gobject
31 31 gobject.threads_init()
32 32 import gtk
33 33 import gtk.glade
34 34 import pygtk
|
↓ open down ↓ |
34 lines elided |
↑ open up ↑ |
35 35 pygtk.require("2.0")
36 36 except ImportError:
37 37 sys.exit(1)
38 38
39 39 import pkg.client.api_errors as api_errors
40 40 import pkg.misc as misc
41 41
42 42 class Repository:
43 43 def __init__(self, parent):
44 44 self.parent = parent
45 - self.img = parent.image_o
45 + self.img = parent.api_o.img
46 46
47 47 self.repository_list = \
48 48 gtk.ListStore(
49 49 gobject.TYPE_STRING, # Name
50 50 gobject.TYPE_BOOLEAN, # Preferred
51 51 gobject.TYPE_STRING, # URL
52 52 )
53 53 self.progress_stop_thread = False
54 54 self.number_of_changes = 0
55 55 self.initial_default = 0
56 56 w_tree_repository = gtk.glade.XML(parent.gladefile, "repository")
57 57 w_tree_repositorymodify = \
58 58 gtk.glade.XML(parent.gladefile, "repositorymodif")
59 59 w_tree_progress = gtk.glade.XML(parent.gladefile, "progressdialog")
60 60 self.w_progress_dialog = w_tree_progress.get_widget("progressdialog")
61 61 self.w_progressinfo_label = w_tree_progress.get_widget("progressinfo")
62 62 progress_button = w_tree_progress.get_widget("progresscancel")
63 63 self.w_progressbar = w_tree_progress.get_widget("progressbar")
64 64 self.w_repository_dialog = w_tree_repository.get_widget("repository")
65 65 self.w_repository_name = w_tree_repository.get_widget("repositoryname")
66 66 self.w_repository_url = w_tree_repository.get_widget("repositoryurl")
67 67 self.w_repository_treeview = \
68 68 w_tree_repository.get_widget("repositorytreeview")
69 69 self.w_repository_close_button = \
70 70 w_tree_repository.get_widget("repositoryclose")
71 71 self.w_repository_add_button = \
72 72 w_tree_repository.get_widget("repositoryadd")
73 73 self.w_repository_modify_button = \
74 74 w_tree_repository.get_widget("repositorymodify")
75 75 self.w_repository_remove_button = \
76 76 w_tree_repository.get_widget("repositoryremove")
77 77 self.list_filter = self.repository_list.filter_new()
78 78 self.w_repository_add_button.set_sensitive(False)
79 79 self.w_repository_modify_button.set_sensitive(True)
80 80 self.w_repository_remove_button.set_sensitive(False)
81 81
82 82 self.w_repositorymodify_dialog = \
83 83 w_tree_repositorymodify.get_widget("repositorymodif")
84 84 self.w_repositorymodify_name = \
85 85 w_tree_repositorymodify.get_widget("repositorymodifyname")
86 86 self.w_repositorymodify_url = \
87 87 w_tree_repositorymodify.get_widget("repositorymodifyurl")
88 88 self.w_repositorymodify_ok_button = \
89 89 w_tree_repositorymodify.get_widget("repositorymodifyok")
90 90 self.w_repositorymodify_cancel_button = \
91 91 w_tree_repositorymodify.get_widget("repositorymodifycancel")
92 92
93 93 self.w_repository_url.connect('focus-in-event', self.on_focus_in)
94 94 self.w_repository_name.connect('focus-in-event', self.on_focus_in)
95 95 self.w_repository_add_button.connect('focus-in-event', self.on_focus_in)
96 96
97 97 progress_button.hide()
98 98 self.w_progressbar.set_pulse_step(0.1)
99 99
100 100 self.__init_tree_views()
101 101 self.w_progress_dialog.set_transient_for(self.w_repository_dialog)
102 102 self.old_modify_name = None
103 103 self.old_modify_url = None
104 104 self.old_modify_preferred = False
105 105 self.is_name_valid = False
106 106
107 107 try:
108 108 dic = \
109 109 {
110 110 "on_repositoryadd_clicked": \
111 111 self.__on_repositoryadd_clicked,
112 112 "on_repositorymodify_clicked": \
113 113 self.__on_repositorymodify_clicked,
114 114 "on_repositoryremove_clicked": \
115 115 self.__on_repositoryremove_clicked,
116 116 "on_repositoryclose_clicked": \
117 117 self.__on_repositoryclose_clicked,
118 118 "on_repositoryurl_changed": \
119 119 self.__on_repositoryurl_changed,
120 120 "on_repositoryname_changed": \
121 121 self.__on_repositoryname_changed,
122 122 "on_repositorytreeview_move_cursor": \
123 123 self.__on_repositorytreeview_move_cursor,
124 124 "on_repositorytreeview_button_release_event": \
125 125 self.__on_repositorytreeview_button_release_event,
126 126 }
127 127 dic_conf = \
128 128 {
129 129 "on_repositorymodifycancel_clicked": \
130 130 self.__on_repositorymodifycancel_clicked,
131 131 "on_repositorymodifyok_clicked": \
132 132 self.__on_repositorymodifyok_clicked,
133 133 }
134 134 w_tree_repository.signal_autoconnect(dic)
135 135 w_tree_repositorymodify.signal_autoconnect(dic_conf)
136 136 except AttributeError, error:
137 137 print self.parent._('GUI will not respond to any event! %s. \
138 138 Check repository.py signals') \
139 139 % error
140 140
141 141 Thread(target = self.__prepare_repository_list).start()
142 142 self.w_repository_dialog.show_all()
143 143
144 144 def on_focus_in(self, widget, event):
145 145 self.w_repository_modify_button.set_sensitive(False)
146 146 self.w_repository_remove_button.set_sensitive(False)
147 147
148 148 def __init_tree_views(self):
149 149 name_renderer = gtk.CellRendererText()
150 150 column = gtk.TreeViewColumn(self.parent._("Repository Name"), \
151 151 name_renderer, text = 0) # 0 = Name
152 152 column.set_expand(True)
153 153 self.w_repository_treeview.append_column(column)
154 154 radio_renderer = gtk.CellRendererToggle()
155 155 column = gtk.TreeViewColumn(self.parent._("Preferred"), \
156 156 radio_renderer, active = 1) # 1 = Preferred
157 157 radio_renderer.set_property("activatable", True)
158 158 radio_renderer.set_property("radio", True)
159 159 column.set_expand(False)
160 160 radio_renderer.connect('toggled', self.__preferred_default)
161 161 self.w_repository_treeview.append_column(column)
162 162
163 163 def __prepare_repository_list(self, clear_add_entries=True, selected_auth=None, \
164 164 stop_thread=True):
165 165 self.number_of_changes += 1
166 166 self.img.load_config()
167 167 auths = self.img.gen_authorities()
168 168 gobject.idle_add(self.__create_view_with_auths, auths, \
169 169 clear_add_entries, selected_auth)
170 170 if stop_thread:
171 171 self.progress_stop_thread = True
172 172 return
173 173
174 174 def __create_view_with_auths(self, auths, clear_add_entries, selected_auth):
175 175 self.w_repository_treeview.set_model(None)
176 176 self.repository_list.clear()
177 177 if clear_add_entries:
178 178 self.w_repository_name.set_text("")
179 179 self.w_repository_url.set_text("")
180 180 self.w_repository_name.grab_focus()
181 181 j = 0
182 182 select_auth = -1
183 183 preferred_authority = self.img.get_default_authority()
184 184 for a in auths:
185 185 l = self.img.split_authority(a)
186 186 name = l[0]
187 187 is_preferred = name == preferred_authority
188 188 if is_preferred:
189 189 self.initial_default = j
190 190 if selected_auth:
191 191 if name == selected_auth:
192 192 select_auth = j
193 193 self.repository_list.insert(j, \
194 194 [name, is_preferred, l[1]])
195 195 j += 1
196 196 if j > 0:
197 197 self.w_repository_modify_button.set_sensitive(False)
198 198 self.w_repository_remove_button.set_sensitive(False)
199 199 self.w_repository_treeview.set_model(self.list_filter)
200 200 if select_auth == -1:
201 201 select_auth = self.initial_default
202 202 self.w_repository_treeview.set_cursor(select_auth, \
203 203 None, start_editing=False)
204 204 self.w_repository_treeview.scroll_to_cell(select_auth)
205 205 self.__on_repositoryname_changed(self.w_repository_name)
206 206
207 207 def __preferred_default(self, cell, filtered_path):
208 208 filtered_model = self.w_repository_treeview.get_model()
209 209 model = filtered_model.get_model()
210 210 path = filtered_model.convert_path_to_child_path(filtered_path)
211 211 itr = model.get_iter(path)
212 212 if itr:
213 213 preferred = model.get_value(itr, 1)
214 214 if preferred == False:
215 215 name = model.get_value(itr, 0)
216 216 try:
217 217 self.img.set_preferred_authority(name)
218 218 self.number_of_changes += 1
219 219 for row in model:
220 220 row[1] = False
221 221 model.set_value(itr, 1, not preferred)
222 222 except RuntimeError:
223 223 err = self.parent._("Couldn't change" + \
224 224 " the preffered authority.\n" + \
225 225 "Please check your permissions.")
226 226 self.__error_occured(err)
227 227 self.__prepare_repository_list()
228 228
229 229 def __progress_pulse(self):
230 230 if not self.progress_stop_thread:
231 231 self.w_progressbar.pulse()
232 232 return True
233 233 else:
234 234 self.w_progress_dialog.hide()
235 235 return False
236 236
237 237
238 238 def __on_repositoryurl_changed(self, widget):
239 239 if len(widget.get_text()) != 0 and self.is_name_valid:
240 240 self.w_repository_add_button.set_sensitive(True)
241 241 else:
242 242 self.w_repository_add_button.set_sensitive(False)
243 243
244 244 def __is_name_valid(self, name):
245 245 if len(name) == 0:
246 246 return False
247 247
248 248 model = self.w_repository_treeview.get_model()
249 249 for row in model:
250 250 if row[0] == name:
251 251 return False
252 252 return True
253 253
254 254 def __on_repositoryname_changed(self, widget):
255 255 name = widget.get_text()
256 256 self.is_name_valid = self.__is_name_valid(name)
257 257 if self.is_name_valid and self.w_repository_url.get_text() != "":
258 258 self.w_repository_add_button.set_sensitive(True)
259 259 else:
260 260 self.w_repository_add_button.set_sensitive(False)
261 261
262 262
263 263 def __on_repositorytreeview_selection_changed(self, widget):
264 264 self.w_repository_modify_button.set_sensitive(True)
265 265 tsel = widget.get_selection()
266 266 selection = tsel.get_selected()
267 267 itr = selection[1]
268 268 if itr != None:
269 269 model = selection[0]
270 270 preferred = model.get_value(itr, 1)
271 271 self.w_repository_remove_button.set_sensitive(not preferred)
272 272
273 273 def __on_repositorytreeview_button_release_event(self, widget, event):
274 274 if event.type == gtk.gdk.BUTTON_RELEASE:
275 275 self.__on_repositorytreeview_selection_changed(widget)
276 276
277 277 def __on_repositorytreeview_move_cursor(self, widget, step, count):
278 278 # I am not sure why this needs to be done in an idle
279 279 # function but if it is not the selection has not been
280 280 # updated
281 281 gobject.idle_add(self.__on_repositorytreeview_selection_changed, widget)
282 282
283 283 def __on_repositoryadd_clicked(self, widget):
284 284 name = self.w_repository_name.get_text()
285 285 url = self.w_repository_url.get_text()
286 286 p_title = self.parent._("Applying changes")
287 287 p_text = self.parent._("Applying changes, please wait ...")
288 288 self.__run_with_prog_in_thread(self.__add_repository, p_title, p_text, \
289 289 name, url)
290 290 return
291 291
292 292 def __run_with_prog_in_thread(self, func, p_title, p_text, *f_args):
293 293 self.w_progress_dialog.set_title(p_title)
294 294 self.w_progressinfo_label.set_text(p_text)
295 295 self.progress_stop_thread = False
296 296 self.w_progress_dialog.show()
297 297 gobject.timeout_add(100, self.__progress_pulse)
298 298 Thread(target = func, args = f_args).start()
299 299
300 300
301 301 def __on_repositoryremove_clicked(self, widget):
302 302 p_title = self.parent._("Applying changes")
303 303 p_text = self.parent._("Applying changes, please wait ...")
304 304 self.__run_with_prog_in_thread(self.__delete_selected_row, p_title, \
305 305 p_text)
306 306
307 307 def __on_repositorymodify_clicked(self, widget):
308 308 tsel = self.w_repository_treeview.get_selection()
309 309 selection = tsel.get_selected()
310 310 itr = selection[1]
311 311 if itr != None:
312 312 model = selection[0]
313 313 self.old_modify_name = model.get_value(itr, 0)
314 314 self.old_modify_url = model.get_value(itr, 2)
315 315 self.old_modify_preferred = model.get_value(itr, 1)
316 316 self.w_repositorymodify_name.set_text(self.old_modify_name)
317 317 self.w_repositorymodify_url.set_text(self.old_modify_url)
318 318 self.w_repositorymodify_dialog.show_all()
319 319
320 320 def __on_repositoryclose_clicked(self, widget):
321 321 # if the number is grater then 1 it means that we did something to the
322 322 # repository list and it is safer to reload package info
323 323 if self.number_of_changes > 1:
324 324 self.parent.reload_packages()
325 325 self.w_repository_dialog.hide()
326 326
327 327 def __on_repositorymodifyok_clicked(self, widget):
328 328 self.w_repository_treeview.grab_focus()
329 329 self.w_repositorymodify_dialog.hide()
330 330 name = self.w_repositorymodify_name.get_text()
331 331 url = self.w_repositorymodify_url.get_text()
332 332 p_title = self.parent._("Applying changes")
333 333 p_text = self.parent._("Applying changes, please wait ...")
334 334 self.__run_with_prog_in_thread(self.__update_repository, p_title, \
335 335 p_text, name, url)
336 336
337 337 def __update_repository(self, name, url):
338 338 url_same = True
339 339 name_same = True
340 340 if name != self.old_modify_name:
341 341 name_same = False
342 342 if url != self.old_modify_url:
343 343 url_same = False
344 344 if url_same and name_same:
345 345 self.progress_stop_thread = True
346 346 return
347 347 if not name_same:
348 348 strt = self.parent._
349 349 omn = self.old_modify_name
350 350 if not self.__is_name_valid(name):
351 351 self.progress_stop_thread = True
352 352 err = strt("Failed to modify %s." % omn + \
353 353 "\nThe choosen" + \
354 354 " repository name %s is already in use" % name)
355 355 gobject.idle_add(self.__error_occured, err)
356 356 self.progress_stop_thread = True
357 357 return
358 358 try:
359 359 self.__delete_repository(self.old_modify_name, False)
360 360 except RuntimeError:
361 361 # Do nothing
362 362 err = strt("Failed to modify %s." % omn + \
363 363 "\nPlease check your permissions.")
364 364 gobject.idle_add(self.__error_occured, err)
365 365 sel = None
366 366 selection = self.w_repository_treeview.get_selection()
367 367 model, ite = selection.get_selected()
368 368 if ite:
369 369 sel = model.get_value(ite, 0)
370 370 self.__prepare_repository_list(False, sel)
371 371 return
372 372 try:
373 373 self.__add_repository(name, url, False)
374 374 except RuntimeError:
375 375 # Do nothing
376 376 somn = self.old_modify_name
377 377 err = self.parent._("Failed to modify %s." % somn + \
378 378 "\nPlease check your permissions.")
379 379 gobject.idle_add(self.__error_occured, err)
380 380 sel = None
381 381 selection = self.w_repository_treeview.get_selection()
382 382 model, ite = selection.get_selected()
383 383 if ite:
384 384 sel = model.get_value(ite, 0)
385 385 self.__prepare_repository_list(False, sel)
386 386 return
387 387 except api_errors.CatalogRefreshException:
388 388 try:
389 389 somn = self.old_modify_name
390 390 self.__add_repository(somn, self.old_modify_url, False)
391 391 err = self.parent._("Failed to modify %s." % somn + \
392 392 "\nPlease check the network connection or URL.\n" + \
393 393 "Is the repository accessible?")
394 394 gobject.idle_add(self.__error_occured, err)
395 395 except api_errors.CatalogRefreshException:
396 396 # We are restoring the original repo, so silently...
397 397 self.progress_stop_thread = True
398 398 return
399 399 self.progress_stop_thread = True
400 400 return
401 401
402 402
403 403 def __on_repositorymodifycancel_clicked(self, widget):
404 404 self.w_repository_treeview.grab_focus()
405 405 self.w_repositorymodify_dialog.hide()
406 406
407 407 def __delete_selected_row(self):
408 408 tsel = self.w_repository_treeview.get_selection()
409 409 selection = tsel.get_selected()
410 410 itr = selection[1]
411 411 if itr != None:
412 412 model = selection[0]
413 413 name = model.get_value(itr, 0)
414 414 self.__delete_repository(name)
415 415
416 416 def __add_repository(self, auth, origin_url, silent=True):
417 417
418 418 if not misc.valid_auth_url(origin_url):
419 419 err = self.parent._("Invalid URL:\n%s" % origin_url)
420 420 gobject.idle_add(self.__error_occured, err)
421 421 gobject.idle_add(self.w_repository_name.grab_focus)
422 422 self.progress_stop_thread = True
423 423 return
424 424 try:
425 425 ssl_key = None
426 426 ssl_cert = None
427 427 refresh_catalogs = True
428 428 self.img.set_authority(auth, origin_url=origin_url,
429 429 ssl_key=ssl_key, ssl_cert=ssl_cert,
430 430 refresh_allowed=refresh_catalogs)
431 431 self.__prepare_repository_list(silent, auth)
432 432 except RuntimeError:
433 433 if not silent:
434 434 raise
435 435 err = self.parent._("Failed to add %s." % auth + \
436 436 "\nPlease check your permissions.")
437 437 gobject.idle_add(self.__error_occured, err)
438 438 sel = None
439 439 selection = self.w_repository_treeview.get_selection()
440 440 model, ite = selection.get_selected()
441 441 if ite:
442 442 sel = model.get_value(ite, 0)
443 443 self.__prepare_repository_list(False, sel)
444 444 except api_errors.CatalogRefreshException:
445 445 if not silent:
446 446 raise
447 447 self.__delete_repository(auth)
448 448 err = self.parent._("Failed to add %s." % auth + \
449 449 "\nPlease check the network connection or URL.\nIs the " + \
450 450 "repository accessible?")
451 451 gobject.idle_add(self.__error_occured, err)
452 452 sel = None
453 453 selection = self.w_repository_treeview.get_selection()
454 454 model, ite = selection.get_selected()
455 455 if ite:
456 456 sel = model.get_value(ite, 0)
457 457 self.__prepare_repository_list(False, sel)
458 458
459 459
460 460
461 461 def __delete_repository(self, name, silent=True):
462 462 try:
463 463 self.img.delete_authority(name)
464 464 self.__prepare_repository_list(clear_add_entries = False, \
465 465 stop_thread = silent)
466 466 except RuntimeError:
467 467 if not silent:
468 468 raise
469 469 err = self.parent._("Failed to delete %s." % name + \
470 470 "\nPlease check your permissions.")
471 471 sel = None
472 472 selection = self.w_repository_treeview.get_selection()
473 473 model, ite = selection.get_selected()
474 474 if ite:
475 475 sel = model.get_value(ite, 0)
476 476 gobject.idle_add(self.__error_occured, err)
477 477 self.__prepare_repository_list(False, sel)
478 478
479 479 def __error_occured(self, error_msg):
480 480 msgbox = gtk.MessageDialog(parent = \
481 481 self.w_repository_dialog, \
482 482 buttons = gtk.BUTTONS_CLOSE, \
483 483 flags = gtk.DIALOG_MODAL, \
484 484 type = gtk.MESSAGE_ERROR, \
485 485 message_format = None)
486 486 msgbox.set_markup(error_msg)
487 487 msgbox.set_title("Edit Repositories error")
488 488 msgbox.run()
489 489 msgbox.destroy()
490 490
|
↓ open down ↓ |
435 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX