source: lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-gui.install/usr/share/lliurex-remote-installer/AptBox.py @ 4628

Last change on this file since 4628 was 4628, checked in by daduve, 4 years ago

Eliminate prints in APT

File size: 14.5 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
4
5import copy
6import gettext
7import Core
8
9import Dialog
10import time
11import threading
12import sys
13
14
15gettext.textdomain('lliurex-remote-installer-gui')
16_=gettext.gettext
17
18
19RSRC="./"
20
21
22class AptBox(Gtk.VBox):
23       
24        def __init__(self):
25               
26                Gtk.VBox.__init__(self)
27               
28                self.core=Core.Core.get_core()
29               
30                builder=Gtk.Builder()
31                builder.set_translation_domain('lliurex-remote-installer-gui')
32                ui_path=RSRC + "lliurex-remote-installer.ui"
33
34                builder.add_from_file(ui_path)
35                self.main_box=builder.get_object("section_box")
36                self.list_box=builder.get_object("list_box")
37                self.package_list_box=builder.get_object("package_list_box")
38                self.package_list_vp=builder.get_object("package_list_viewport")
39                self.add_package_button=builder.get_object("add_package_button")
40                self.delete_apt_button=builder.get_object("delete_button")
41                self.add_apt_button=builder.get_object("add_button")
42                self.apply_button=builder.get_object("apply_button")
43                self.url_entry=builder.get_object("url_entry")
44                self.data_box=builder.get_object("apt_data_box")
45                self.data_vp=builder.get_object("apt_data_viewport")
46                self.package_label=builder.get_object("package_label")
47                self.url_label=builder.get_object("url_label")
48                self.new_package_window=builder.get_object("new_package_window")
49                self.new_apt_window=builder.get_object("new_apt_window")
50                self.cancel_apt_button=builder.get_object("cancel_apt_button")
51                self.accept_apt_button=builder.get_object("accept_apt_button")
52                self.cancel_add_package_button=builder.get_object("cancel_add_package_button")
53                self.accept_add_package_button=builder.get_object("accept_add_package_button")
54                self.apt_name_entry=builder.get_object("apt_name_entry")
55                self.apt_url_entry=builder.get_object("apt_url_entry")
56                self.apt_msg_label=builder.get_object("apt_msg_label")
57                self.package_msg_label=builder.get_object("package_msg_label")
58                self.apply_changes_button=builder.get_object("apply_changes_button")
59                self.package_list_entry=builder.get_object("package_list_entry")
60               
61               
62                self.stack=Gtk.Stack()
63                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
64                self.stack.set_transition_duration(250)
65                hbox=Gtk.HBox()
66                hbox.show()
67                self.stack.add_titled(hbox,"empty","Empty Box")
68                self.stack.add_titled(self.data_box,"apt_data","Apt Data Box")
69                self.data_vp.add(self.stack)
70               
71                self.pack_start(self.main_box,True,True,0)
72               
73               
74                self.connect_signals()
75                self.set_css_info()
76               
77                self.core.current_var=None
78                self.current_id=None
79               
80                self.thread=threading.Thread()
81                self.thread_ret=None
82               
83               
84               
85        #def __init__
86       
87
88        def set_css_info(self):
89               
90                self.style_provider=Gtk.CssProvider()
91                f=Gio.File.new_for_path("lliurex-remote-installer.css")
92                self.style_provider.load_from_file(f)
93                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
94                self.package_label.set_name("OPTION_LABEL")
95                self.url_label.set_name("OPTION_LABEL")
96               
97                       
98        #def set-css_info
99       
100       
101        def connect_signals(self):
102               
103                self.add_apt_button.connect("clicked",self.add_apt_button_clicked)
104                self.delete_apt_button.connect("clicked",self.delete_apt_button_clicked)
105                self.add_package_button.connect("clicked",self.add_package_clicked)
106               
107                self.accept_add_package_button.connect("clicked",self.accept_add_package_button_clicked)
108                self.cancel_add_package_button.connect("clicked",self.cancel_add_package_button_clicked)
109               
110                self.accept_apt_button.connect("clicked",self.accept_apt_button_clicked)
111                self.cancel_apt_button.connect("clicked",self.cancel_apt_button_clicked)
112               
113                self.apply_changes_button.connect("clicked",self.apply_changes_button_clicked)
114                self.url_entry.connect("changed",self.url_entry_changed)
115               
116                self.new_package_window.connect("delete_event",self.hide_window)
117                self.new_apt_window.connect("delete_event",self.hide_window)
118               
119        #def connect_signals
120       
121       
122        def hide_window(self,widget,event):
123               
124                widget.hide()
125                return True
126               
127        #def new_package_window
128
129
130        def check_changes(self,widget=True,event=True,manage_dialog=False):
131               
132               
133                if not manage_dialog:
134                        if self.core.current_var==None:
135                                return False
136                        return self.core.current_var != self.core.var
137               
138               
139                if self.core.current_var!=None and self.core.current_var != self.core.var:
140                        if not self.changes_detected_dialog(False):
141                                return True
142               
143                sys.exit(0)
144                       
145
146        #def check_changes
147               
148       
149        def set_info(self,info):
150               
151                #Empty list
152                for x in self.list_box.get_children():
153                        self.list_box.remove(x)
154               
155                self.core.var=info
156               
157                times=1
158               
159                for t in range(0,times):
160                        if self.core.var["apt"] not in [{},"",None,'{}']:
161                                for x in self.core.var["apt"]:
162                                        #Only show Mirror if exist in server
163                                        if x in ['Mirror']:
164                                                exists=self.core.n4d.lliurex_mirror()
165                                                exists=exists[1]
166                                                if exists.strip() == 'True':
167                                                        self.new_apt_button(x)
168                                        else:
169                                                self.new_apt_button(x)
170                       
171                self.core.current_var=copy.deepcopy(self.core.var)
172                self.list_box.show_all()
173               
174
175        #def set_info
176       
177
178        def new_apt_button(self,source_name):
179               
180                new_source_name=source_name
181               
182                if len(source_name) > 8:
183                       
184                        new_source_name=source_name[0:7]+"..."
185               
186                b=Gtk.Button(new_source_name)
187                b.connect("clicked",self.apt_clicked,source_name)
188                b.set_size_request(100,100)
189                b.set_halign(Gtk.Align.START)
190                b.set_name("OPTION_BUTTON")
191                b.show_all()
192                self.list_box.pack_start(b,False,False,5)
193                b.queue_draw()
194                b.set_tooltip_text(source_name)
195               
196                return b
197               
198        #def new_apt_button
199
200       
201        def new_package_button(self,pkg_name):
202               
203                hbox=Gtk.HBox()
204                label=Gtk.Label(pkg_name)
205                b=Gtk.Button()
206                i=Gtk.Image.new_from_file("trash.svg")
207                b.add(i)
208                b.set_halign(Gtk.Align.CENTER)
209                b.set_valign(Gtk.Align.CENTER)
210                b.set_name("DELETE_ITEM_BUTTON")
211                b.connect("clicked",self.delete_package_clicked,hbox)
212                hbox.pack_start(label,False,False,0)
213                hbox.pack_end(b,False,False,10)
214                hbox.show_all()
215                label.set_margin_right(20)
216                label.set_margin_left(20)
217                label.set_margin_top(20)
218                label.set_margin_bottom(20)
219                hbox.set_name("PKG_BOX")
220                self.package_list_box.pack_start(hbox,False,False,5)
221                self.package_list_box.queue_draw()
222                hbox.queue_draw()
223               
224        #def new_package_button
225       
226       
227        # ## APT ### ################################################
228       
229        def apt_clicked(self,widget,apt_id,ignore_changes=False):
230               
231               
232                if not ignore_changes:
233                       
234                        if self.core.current_var!=None:
235                                if self.check_changes():
236                                        if not self.changes_detected_dialog(False):
237                                                return
238                       
239                        if apt_id !=self.current_id:
240                                self.core.current_var=copy.deepcopy(self.core.var)
241                               
242                self.current_id=apt_id
243               
244                self.stack.set_visible_child_name("apt_data")
245
246                for b in self.list_box.get_children():
247                        b.set_name("OPTION_BUTTON")
248                       
249                widget.set_name("SELECTED_OPTION_BUTTON")
250                       
251               
252                for x in self.package_list_box.get_children():
253                        self.package_list_box.remove(x)
254                       
255                self.url_entry.set_text(self.core.current_var["apt"][apt_id]["url"])
256                       
257                for x in self.core.current_var["apt"][apt_id]["packages"]:
258                        self.new_package_button("%s"%x)
259                               
260                               
261                self.package_list_box.show_all()
262               
263                if not ignore_changes:
264               
265                        for apt in self.list_box:
266                                if apt.get_tooltip_text() not in self.core.current_var["apt"]:
267                                        self.list_box.remove(apt)
268                       
269               
270               
271                #self.core.lri.main_window.connect("delete_event",self.check_changes,True)
272               
273               
274        #def apt_clicked
275       
276        def add_apt_button_clicked(self,widget):
277               
278                self.apt_name_entry.set_text("")
279                self.apt_url_entry.set_text("")
280                self.apt_msg_label.set_text("")
281                self.new_apt_window.show()
282               
283        #def add_button_clicked
284       
285       
286        def delete_apt_button_clicked(self,widget):
287               
288                if self.current_id==None:
289                        return
290                       
291                if self.current_id in ['LliureX', 'Mirror']:
292                        return
293               
294                if self.delete_apt_dialog(self.current_id):
295                        for apt_button in self.list_box.get_children():
296                               
297                                if apt_button.get_tooltip_text() == self.current_id:
298                                        self.list_box.remove(apt_button)
299                                        self.stack.set_visible_child_name("empty")
300                                        self.core.var["apt"].pop(self.current_id)
301                                        self.current_id=None
302                                        self.core.current_var=None
303                                        self.core.n4d.set_variable(self.core.var)
304               
305        #def add_button_clicked
306       
307        def accept_apt_button_clicked(self,widget):
308               
309               
310                name=self.apt_name_entry.get_text()
311                source=self.apt_url_entry.get_text()
312               
313                if len(name) < 1 or len(source) < 8:
314                        self.apt_msg_label.set_markup("<span foreground='red'>"+"Invalid values"+"</span>")
315                        return
316                if name in self.core.var["apt"]:
317                        self.apt_msg_label.set_markup("<span foreground='red'>"+"Apt name already exists"+"</span>")
318                        return
319               
320                if len(name) > 0 and len(source)>0 and name not in self.core.var:
321                        name=(name.lower())
322                        b=self.new_apt_button(name)
323                       
324                        if self.core.current_var ==None:
325                                self.core.current_var=copy.deepcopy(self.core.var)
326                               
327                        self.core.current_var["apt"][name]={}
328                        self.core.current_var["apt"][name]["packages"]=[]
329                        self.core.current_var["apt"][name]["url"]=source
330                        self.new_apt_window.hide()
331                       
332                        self.core.var=copy.deepcopy(self.core.current_var)
333                        self.core.n4d.set_variable(self.core.var)
334                       
335                        self.apt_clicked(b,name,True)
336                       
337
338               
339        #def accept_apt_button_clicked
340       
341       
342        def cancel_apt_button_clicked(self,widget):
343               
344                self.new_apt_window.hide()
345               
346        #def cancel_apt_button_clicked
347       
348        # #################################################### #####
349       
350       
351       
352        # #### PACKAGE CHANGES ################### #
353       
354       
355        def add_package_clicked(self,widget):
356               
357                self.package_list_entry.set_text("")
358                self.new_package_window.show()
359               
360        #def add_package_clicked
361       
362       
363        def delete_package_clicked(self,button,hbox):
364               
365                pkg=hbox.get_children()[0].get_text()
366               
367                if self.delete_package_dialog(pkg):
368               
369                        self.package_list_box.remove(hbox)
370                               
371                        for p in range(len(self.core.current_var["apt"][self.current_id]["packages"])-1,-1,-1):
372                                if self.core.current_var["apt"][self.current_id]["packages"][p]==pkg:
373                                        self.core.current_var["apt"][self.current_id]["packages"].pop(p)
374                                        self.core.var=self.core.current_var
375                                        self.core.n4d.set_variable(self.core.var)
376                                       
377                        # STORE VALUE IN N4D HERE IF NEEDED
378                       
379                        # ######### #
380       
381        #def delete_package_clicked
382       
383       
384        def url_entry_changed(self,widget):
385               
386                if self.current_id in ['LliureX', 'Mirror']:
387                        return
388               
389                if self.core.current_var !=None:
390                        txt=widget.get_text()
391                        if len(txt)>6:
392                                self.core.current_var["apt"][self.current_id]["url"]=txt
393
394        #def url_entry_changed 
395       
396       
397        def accept_add_package_button_clicked(self,widget):
398               
399               
400                self.package_list_entry.grab_focus()
401                txt=self.package_list_entry.get_text()
402               
403                for pkg in txt.split(","):
404                       
405                        pkg=pkg.strip(" ")
406                        if pkg not in self.core.current_var["apt"][self.current_id]["packages"]:
407                                self.core.current_var["apt"][self.current_id]["packages"].append(pkg)
408                        self.new_package_button(pkg)
409                       
410                self.new_package_window.hide()
411               
412        #def accept_add_package_button_clicked
413       
414       
415        def cancel_add_package_button_clicked(self,widget):
416               
417                self.new_package_window.hide()
418               
419        #def cancel_add_package_button_clicked
420       
421       
422        def apply_changes_button_clicked(self,widget):
423               
424                self.thread=threading.Thread(target=self.apply_changes_thread)
425                self.thread.daemon=True
426                self.thread.start()
427               
428                main_window=self.core.lri.main_window
429                dialog=Dialog.ApplyingChangesDialog(main_window,"Lliurex Remote installer",_(u"Updating repositories and testing packages..."))
430                dialog.show()
431                GLib.timeout_add(500,self.check_apply_thread,dialog)
432               
433        #def apply_changes_button_clicked
434       
435       
436        def apply_changes_thread(self):
437               
438                try:
439                        self.core.dprint("Updating repositories and testing packages...")
440               
441                        # SAMPLE CODE
442                       
443                        #self.core.n4d.lliurex_version()
444                        #print "testeando....."
445                        #time.sleep(1.5)
446                        # ######### #
447                        #self.core.current_var=copy.deepcopy(self.core.var)
448                        self.core.var=copy.deepcopy(self.core.current_var)
449                        self.test_apt=self.core.n4d.test_apt_list(self.core.var)
450                        self.thread_ret={"status":True,"msg":"BROKEN"}
451       
452                        # store return value here
453                       
454                       
455                       
456                except Exception as e:
457                        print e
458                        return False
459               
460               
461        #def apply_changes_thread
462       
463        def check_apply_thread(self,dialog):
464               
465               
466                if self.thread.is_alive():
467                        return True
468               
469                dialog.destroy()
470               
471                #self.test_apt=[True,False, n4d_var, listado_apt_accesibles, listado_apt_no_instalbles, comentario]
472                if self.test_apt[0]:
473                        if self.test_apt[3] not in [None,"","[]",[]]:
474                                if self.delete_test_apt_dialog(self.test_apt[3]):
475                                        self.core.n4d.set_variable(self.test_apt[1])
476                                        self.core.var=copy.deepcopy(self.test_apt[1])
477                                        self.core.current_var=copy.deepcopy(self.test_apt[1])
478                                else:
479                                        self.core.n4d.set_variable(self.core.var)
480                        else:
481                                self.core.n4d.set_variable(self.core.var)
482                        self.core.dprint("Done")
483                else:
484                        self.core.dprint("Test Error: variable remains unset")
485               
486               
487                for b in self.list_box:
488                        if b.get_tooltip_text()==self.current_id:
489                                break
490               
491               
492                self.apt_clicked(b,self.current_id)
493               
494               
495               
496                if not self.thread_ret["status"]:
497                        mw=self.core.lri.main_window
498                        d=Dialog.ErrorDialog(mw,"",self.thread_ret["msg"])
499                        d.run()
500                        d.destroy()
501               
502
503                return False
504               
505        #def check_thread
506       
507       
508        # ######################################################### #
509       
510
511        # ### DIALOGS ##### ##################
512       
513        def delete_apt_dialog(self,pkg_name):
514               
515                main_window=self.core.lri.main_window
516               
517                dialog=Dialog.QuestionDialog(main_window,_(u"Delete apt list"),_(u"Do you want to delete '%s' packages list?")%pkg_name)
518                response=dialog.run()
519                dialog.destroy()
520               
521                if response== Gtk.ResponseType.OK:
522                        return True
523               
524                return False
525               
526        #def delete_package_dialog
527       
528        def delete_test_apt_dialog(self,pkg_name_orig):
529               
530                main_window=self.core.lri.main_window
531                pkg_name='\n'.join(pkg_name_orig)
532                dialog=Dialog.QuestionDialog(main_window,_(u"Delete apt list"),_(u"This pakage list is unavaiable from your repos:\n%s\nDo you want delete it?")%pkg_name)
533                response=dialog.run()
534                dialog.destroy()
535               
536                if response== Gtk.ResponseType.OK:
537                        return True
538               
539                return False
540               
541        #def delete_package_dialog
542       
543        def delete_package_dialog(self,pkg_name):
544               
545                main_window=self.core.lri.main_window
546                dialog=Dialog.QuestionDialog(main_window,_(u"Delete package"),_(u"Do you want to delete '%s'?")%pkg_name)
547                response=dialog.run()
548                dialog.destroy()
549               
550                if response== Gtk.ResponseType.OK:
551                        return True
552               
553                return False
554               
555        #def delete_package_dialog
556       
557        def changes_detected_dialog(self,force_exit=False):
558               
559                main_window=self.core.lri.main_window
560               
561                dialog=Dialog.QuestionDialog(main_window,_(u"Changes detected"),_(u"There are unsaved changes. Do you want to discard them?"))
562                response=dialog.run()
563                dialog.destroy()
564               
565                if response== Gtk.ResponseType.OK:
566                        if force_exit:
567                                sys.exit(0)
568                               
569                        return True
570               
571                return False
572               
573        #def changes_detected_dialog
574       
575        # #####################################################
576               
577       
578       
579       
580#class aptbox
Note: See TracBrowser for help on using the repository browser.