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

Last change on this file since 4754 was 4754, checked in by daduve, 3 years ago

Show msg error if repositories are not accesible

File size: 11.9 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
4
5GObject.threads_init()
6import copy
7import gettext
8import Core
9
10import Dialog
11import time
12import threading
13import sys
14import os
15import datetime
16
17gettext.textdomain('lliurex-remote-installer-gui')
18_=gettext.gettext
19
20#Global Variables for thread
21local_mirror=[False,'False']
22net_mirror=[False,'False']
23
24RSRC="./"
25
26class WorkerThread(threading.Thread):
27    def __init__(self, callback):
28       
29        self.core=Core.Core.get_core()
30        threading.Thread.__init__(self)
31        self.callback = callback
32
33    def run(self):
34       # Simulate a long process, do your actual work here
35        time.sleep(2)
36        global local_mirror
37        global net_mirror
38        local_mirror=self.core.n4d.mirror_version()
39        net_mirror=self.core.n4d.net_mirror_version()
40
41        # The callback runs a GUI task, so wrap it!
42        GObject.idle_add(self.callback)
43
44#Class_WorkerThread
45
46
47class UpdateBox(Gtk.VBox):
48       
49       
50        def __init__(self):
51               
52                Gtk.VBox.__init__(self)
53               
54                self.core=Core.Core.get_core()
55               
56                builder=Gtk.Builder()
57                builder.set_translation_domain('lliurex-remote-installer-gui')
58                ui_path=RSRC + "lliurex-remote-installer.ui"
59                builder.add_from_file(ui_path)
60                self.main_box=builder.get_object("update_data_box")
61                self.update_current_box=builder.get_object("update_current_box")
62                self.main_box=builder.get_object("update_data_box")
63                self.update_sheduled_box=builder.get_object("update_sheduled_box")
64                self.package_label=builder.get_object("package_label_update")
65                self.update_frame=builder.get_object("update_frame")
66                self.update_label_1=builder.get_object("update_label_1")
67                self.update_label_2=builder.get_object("update_label_2")
68                self.update_radiobutton_1=builder.get_object("update_radiobutton_1")
69                self.update_radiobutton_2=builder.get_object("update_radiobutton_2")
70                self.update_label_3=builder.get_object("update_label_3")
71                self.update_label_4=builder.get_object("update_label_4")
72                self.update_spinner_1=builder.get_object("update_spinner_1")
73                self.update_spinner_2=builder.get_object("update_spinner_2")
74                self.test_update_button=builder.get_object("test_update_mirrors")
75                self.apply_update_button=builder.get_object("apply_update_button")
76               
77               
78
79                self.add(self.main_box)
80               
81                self.connect_signals()
82                self.set_css_info()
83               
84                self.core.current_var=None
85                self.current_id=None
86               
87                self.thread=threading.Thread()
88                self.thread_ret=None
89               
90               
91               
92               
93        #def __init__
94       
95       
96        def set_css_info(self):
97               
98                self.style_provider=Gtk.CssProvider()
99                f=Gio.File.new_for_path("lliurex-remote-installer.css")
100                self.style_provider.load_from_file(f)
101                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
102                self.package_label.set_name("OPTION_LABEL")
103                self.update_label_1.set_name("OPTION_LABEL")
104                self.update_label_2.set_name("OPTION_LABEL")
105               
106                       
107        #def set-css_info
108       
109       
110        def set_info(self,info):
111               
112                       
113                self.core.var=info
114                self.core.current_var=copy.deepcopy(self.core.var)
115                self.update_spinner_1.start()
116                self.update_spinner_2.start()
117               
118                #Make banner with information from n4d-var to sheduled update
119                if self.core.var["update"]["activate"] == 'True':
120                        url_update=self.core.var["update"]["url"]
121                        version_update=self.core.var["update"]["version"].replace('Current version: ','')
122                        date_update=self.core.var["update"]["datetime"]
123                        self.new_package_button("True",url_update,version_update,date_update)
124                else:
125                        self.new_package_button("False")
126               
127                #Asign information to radiobuttons
128                self.update_radiobutton_1.set_label('Lliurex.net')
129                self.update_radiobutton_2.set_label('Local Server Mirror')
130                self.update_label_3.set_label('Current version: ')
131                self.update_label_4.set_label('Current version: ')
132                self.update_radiobutton_1.set_sensitive(False)
133                self.update_radiobutton_2.set_sensitive(False)
134                self.update_label_3.hide()
135                self.update_label_4.hide()
136               
137                thread_spinner = WorkerThread(self.thread_stop)
138                thread_spinner.start()
139
140                       
141                #self.core.lri.main_window.connect("delete_event",self.check_changes,True)
142
143        #def set_info
144       
145        def thread_stop(self):
146               
147                #When tread_start is finished this thread stop spinner and show the results
148               
149                global local_mirror
150                global net_mirror
151               
152                self.update_spinner_1.stop()
153                self.update_spinner_2.stop()
154               
155                #If local mirror exists show the version for it, if not exist is not avaiable from GUI
156                if ( local_mirror[0] and local_mirror[1] not in ['False'] ):
157                        version=local_mirror[1]
158                        version='Current version: '+version
159                        self.update_label_4.set_label(version)
160                        self.update_label_4.show()
161                        self.update_radiobutton_2.set_sensitive(True)
162                        #self.update_spinner_2.hide()
163                else:
164                        self.update_radiobutton_2.set_label('Mirror in Server is not avaiable')
165                        self.update_radiobutton_2.set_sensitive(False)
166                        self.update_label_4.hide()
167                        #self.update_spinner_2.hide()
168                        self.update_radiobutton_1.set_active(True)
169                       
170                #If NET mirror exists show the version for it, if not exist is not avaiable from GUI
171                if ( net_mirror[0] and net_mirror[1] not in ['False'] ):
172                        version=net_mirror[1]
173                        version='Current version: '+version
174                        self.update_label_3.set_label(version)
175                        self.update_label_3.show()
176                        self.update_radiobutton_1.set_sensitive(True)
177                        #self.update_spinner_1.hide()
178                else:
179                        self.update_radiobutton_1.set_label('LliureX.net not avaiable')
180                        self.update_radiobutton_1.set_sensitive(False)
181                        self.update_label_3.hide()
182                        #self.update_spinner_1.hide()
183                        self.update_radiobutton_1.set_active(False)
184                       
185        #def_thread_stop
186       
187        def new_package_button(self,activate='True',url_update='mirror',version_update='0',date_update='0'):
188               
189                hbox=Gtk.HBox()
190                hbox.set_margin_left(15)
191                hbox.set_margin_right(15)
192               
193                #Adding two or more line tags in hbox
194                labels_box=Gtk.VBox()
195                labels_box.set_valign(Gtk.Align.START)
196                labels_box.set_halign(Gtk.Align.START)
197                labels_box.set_margin_left(10)
198                labels_box.set_margin_top(10)
199                labels_box.set_margin_bottom(10)
200               
201                if activate=="True":
202                        sheduled="Sheduled on :"+date_update
203                        updated="Update to minimum version "+version_update+" from "+url_update+ " repository."
204                       
205                        label=Gtk.Label(sheduled)
206                        label.set_halign(Gtk.Align.START)
207                        label.set_valign(Gtk.Align.FILL)
208                        label2=Gtk.Label(updated)
209                        label2.set_halign(Gtk.Align.START)
210                        label2.set_valign(Gtk.Align.FILL)
211                       
212                        labels_box.pack_start(label,False,False,0)
213                        labels_box.pack_start(label2,False,False,0)
214                       
215                        b=Gtk.Button()
216                        i=Gtk.Image.new_from_file("trash.svg")
217                        b.add(i)
218                        b.set_halign(Gtk.Align.CENTER)
219                        b.set_valign(Gtk.Align.CENTER)
220                        b.set_name("DELETE_ITEM_BUTTON")
221                        b.connect("clicked",self.delete_update_clicked,hbox)
222                       
223                        hbox.pack_start(labels_box,False,False,0)
224                       
225                       
226                        hbox.pack_end(b,False,False,10)
227                       
228                else:
229                        sheduled="Not sheduled updated activated"
230                        label=Gtk.Label(sheduled)
231                        label.set_halign(Gtk.Align.START)
232                        label.set_valign(Gtk.Align.FILL)
233                        labels_box.pack_start(label,False,False,0)
234                        hbox.pack_start(labels_box,False,False,0)
235                       
236                       
237                hbox.show_all()
238               
239                hbox.set_name("PKG_BOX")
240                self.update_current_box.pack_start(hbox,False,False,5)
241                self.update_current_box.queue_draw()
242                hbox.queue_draw()
243               
244        #def new_package_button
245       
246       
247        def connect_signals(self):
248               
249                self.apply_update_button.connect("clicked",self.apply_update_button_clicked)
250                self.test_update_button.connect("clicked",self.test_update_button_clicked)
251                #self.add_deb_button.connect("clicked",self.add_update_button_clicked)
252               
253                #self.core.lri.main_window.connect("delete_event",self.check_changes,True)
254
255        #def connect_signals
256
257       
258       
259        # #### PACKAGE CHANGES ################### #
260       
261       
262        def delete_update_clicked(self,button,hbox):
263               
264               
265                if self.delete_update_dialog():
266               
267                        self.update_current_box.remove(hbox)
268                        self.core.current_var["update"]["activate"]='False'
269                        self.new_package_button("False")
270                        self.core.var=copy.deepcopy(self.core.current_var)
271                        self.core.n4d.set_variable(self.core.var)
272                       
273       
274        #def delete_update_clicked
275       
276        def apply_update_button_clicked(self,widget):
277               
278                if self.update_radiobutton_2.get_active():
279                        self.core.current_var["update"]["version"]=((self.update_label_4.get_label()).replace('Current version: ',''))
280                        if self.core.current_var["update"]["version"] == '':
281                                self.error_repos_dialog("Mirror")
282                                return True
283                else:
284                        self.core.current_var["update"]["version"]=((self.update_label_3.get_label()).replace('Current version: ',''))
285                        if self.core.current_var["update"]["version"] == '':
286                                self.error_repos_dialog("Lliurex.net")
287                                return True
288               
289                self.thread=threading.Thread(target=self.apply_changes_thread)
290                self.thread.daemon=True
291                self.thread.start()
292                                       
293                #Se crea el mensaje de Apply segun:
294                self.msg1=_(u"New sheduled are programed, applying changes.......")
295               
296                main_window=self.core.lri.main_window
297                dialog=Dialog.ApplyingChangesDialog(main_window,title="Lliurex Remote Installer",msg=self.msg1)
298                dialog.show()
299                GLib.timeout_add(500,self.check_apply_thread,dialog)
300               
301        #def apply_changes_button_clicked
302       
303       
304        def test_update_button_clicked(self,widget):
305               
306                self.update_spinner_1.start()
307                self.update_spinner_2.start()
308                self.update_radiobutton_1.set_label('Lliurex.net')
309                self.update_radiobutton_2.set_label('Local Server Mirror')
310                self.update_label_3.set_label('Current version: ')
311                self.update_label_4.set_label('Current version: ')
312                self.update_radiobutton_1.set_sensitive(False)
313                self.update_radiobutton_2.set_sensitive(False)
314                self.update_label_3.hide()
315                self.update_label_4.hide()
316               
317                thread_spinner = WorkerThread(self.thread_stop)
318                thread_spinner.start()
319               
320        #def apply_changes_button_clicked
321       
322       
323        def apply_changes_thread(self):
324               
325                try:
326                        #'update':{'activate':'False', 'url':'Mirror', 'version':'0','datetime':'0'}
327                        self.core.dprint("Sheduled new update...")
328                        if self.update_radiobutton_2.get_active():
329                                self.core.current_var["update"]["activate"]='True'
330                                self.core.current_var["update"]["url"]='Mirror'
331                                self.core.current_var["update"]["version"]=((self.update_label_4.get_label()).replace('Current version: ',''))
332                                if self.core.current_var["update"]["version"] == '':
333                                        dialog.destroy()
334                                        self.error_repos_dialog()
335                                       
336                                #datetime
337                                date=datetime.datetime.now()
338                                date_update=date.strftime("%d-%m-%Y %H:%M")
339                                self.core.current_var["update"]["datetime"]=date_update
340                        else:
341                                self.core.current_var["update"]["activate"]='True'
342                                self.core.current_var["update"]["url"]='Lliurex.net'
343                                self.core.current_var["update"]["version"]=self.update_label_3.get_label()
344                                #datetime
345                                date=datetime.datetime.now()
346                                date_update=date.strftime("%d-%m-%Y %H:%M")
347                                self.core.current_var["update"]["datetime"]=date_update
348                       
349                        self.core.var=copy.deepcopy(self.core.current_var)
350                        self.core.n4d.set_variable(self.core.var)
351                        self.thread_ret={"status":True,"msg":"BROKEN"}
352
353                       
354                except Exception as e:
355                        print e
356                        return False
357               
358               
359        #def apply_changes_thread
360       
361       
362        def check_apply_thread(self,dialog):
363               
364               
365                if self.thread.is_alive():
366                        return True
367               
368                dialog.destroy()
369               
370                for child in self.update_current_box.get_children():
371                        self.update_current_box.remove(child)
372               
373                self.set_info(self.core.var)
374                self.core.dprint("Done")
375               
376                if not self.thread_ret["status"]:
377                        mw=self.core.lri.main_window
378                        d=Dialog.ErrorDialog(mw,"",self.thread_ret["msg"])
379                        d.run()
380                        d.destroy()
381
382                return False
383               
384        #def check_thread
385       
386       
387        # #######  DIALOGS  ###############
388       
389        def delete_update_dialog(self):
390               
391                main_window=self.core.lri.main_window
392                dialog=Dialog.QuestionDialog(main_window,_(u"Delete Update"),_(u"Do you want to delete scheduled update?"))
393                response=dialog.run()
394                dialog.destroy()
395               
396                if response== Gtk.ResponseType.OK:
397                        return True
398               
399                return False
400               
401        #def delete_update_dialog
402       
403        def error_repos_dialog(self, repo):
404                comment=("%s repositorie not is accesible, please wait to connect with it or select other one"%repo)
405                main_window=self.core.lri.main_window
406                dialog=Dialog.ErrorDialog(main_window,_(u"Repositories Testing"),comment)
407                response=dialog.run()
408                dialog.destroy()
409                               
410                return True
411               
412        #def remove_file_info_dialo
413       
Note: See TracBrowser for help on using the repository browser.