source: lliurex-gdrive/trunk/fuentes/lliurex-gdrive-gui.install/usr/share/lliurex-gdrive/ProfileBox.py @ 3943

Last change on this file since 3943 was 3943, checked in by jrpelegrina, 2 years ago

Add zomando and python lib

File size: 16.0 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 multiprocessing
13import sys
14import os
15import psutil
16
17import gettext
18gettext.textdomain('lliurex-gdrive')
19_ = gettext.gettext
20
21
22
23RSRC="./"
24PROFILE_IMAGE=RSRC+"rsrc/profile.svg"
25FOLDER_IMAGE=RSRC+"rsrc/folder.svg"
26MOUNT_ON_IMAGE=RSRC+"rsrc/mount_on.svg"
27MOUNT_OFF_IMAGE=RSRC+"rsrc/mount_off.svg"
28EDIT_IMAGE=RSRC+"rsrc/edit.svg"
29DELETE_IMAGE=RSRC+"rsrc/trash.svg"
30MAX_RETRY_INTENTS=900
31MSG_CHANGE_SUCCESS=_("Changes applied successfully")
32MSG_CHANGE_ERROR=_("An error ocurred applying changes. See log file for more information")
33
34class ProfileBox(Gtk.VBox):
35       
36        def __init__(self):
37               
38                Gtk.VBox.__init__(self)
39               
40                self.core=Core.Core.get_core()
41               
42                builder=Gtk.Builder()
43                ui_path=RSRC + "/rsrc/lliurex-gdrive.ui"
44                builder.add_from_file(ui_path)
45
46                self.main_box=builder.get_object("profile_data_box")
47                self.profiles_list_label=builder.get_object("profiles_list_label")
48                self.profile_list_box=builder.get_object("profile_list_box")
49                self.profile_list_vp=builder.get_object("profile_list_viewport")
50                self.msg_label=builder.get_object("msg_label")
51
52                image = Gtk.Image()
53                image.set_from_stock(Gtk.STOCK_ADD,Gtk.IconSize.MENU)
54                self.add_new_profile_button=builder.get_object("add_new_profile_button")
55                self.add_new_profile_button.set_image(image)
56                self.new_profile_window=builder.get_object("new_profile_window")
57                self.profile_label=builder.get_object("profile_label")
58                self.profile_entry=builder.get_object("profile_entry")
59                self.email_label=builder.get_object("email_label")
60                self.email_entry=builder.get_object("email_entry")
61                self.mountpoint_label=builder.get_object("mountpoint_label")
62                self.mountpoint_entry=builder.get_object("mountpoint_entry")
63                self.automount_label=builder.get_object("automount_label")
64                self.automount_entry=builder.get_object("automount_entry")
65                self.profile_msg=builder.get_object("profile_msg")
66                self.profile_pbar=builder.get_object("profile_pbar")
67                self.accept_add_profile_button=builder.get_object("accept_add_profile_button")
68                self.cancel_add_profile_button=builder.get_object("cancel_add_profile_button")
69               
70               
71               
72                self.pack_start(self.main_box,True,True,0)
73                self.connect_signals()
74                self.set_css_info()
75       
76                self.edition=False
77                self.profile_pbar.hide()
78
79                self.init_threads()
80
81                #self.current_var=None
82                #self.current_id=None
83               
84                #self.thread=threading.Thread()
85                #self.thread_ret=None
86               
87        #def __init__
88       
89        def init_threads(self):
90
91                self.create_profile_t=multiprocessing.Process(target=self.create_profile)
92                self.create_mountpoint_t=threading.Thread(target=self.create_mountpoint)
93                self.edit_profile_t=threading.Thread(target=self.edit_profile)
94
95               
96                self.create_profile_t.daemon=True
97                self.create_mountpoint_t.daemon=True
98                self.edit_profile_t.daemon=True
99
100                self.create_mountpoint_t.done=False
101                self.edit_profile_t.done=False
102
103                self.create_profile_t.launched=False
104                self.create_mountpoint_t.launched=False
105                self.edit_profile_t.launched=False
106               
107                GObject.threads_init()
108
109
110        def set_css_info(self):
111               
112                self.style_provider=Gtk.CssProvider()
113
114                f=Gio.File.new_for_path("lliurex-gdrive.css")
115                self.style_provider.load_from_file(f)
116
117                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
118                self.profiles_list_label.set_name("OPTION_LABEL")
119                self.profile_label.set_name("OPTION_LABEL")
120                self.email_label.set_name("OPTION_LABEL")
121                self.mountpoint_label.set_name("OPTION_LABEL")
122                self.automount_label.set_name("OPTION_LABEL")
123                self.msg_label.set_name("MSG_LABEL")
124                self.profile_msg.set_name("MSG_LABEL")
125
126               
127                       
128        #def set-css_info
129       
130               
131        def connect_signals(self):
132
133                self.add_new_profile_button.connect("clicked",self.add_new_profile_button_clicked)
134                self.accept_add_profile_button.connect("clicked",self.accept_add_profile_clicked)
135                self.cancel_add_profile_button.connect("clicked",self.cancel_add_profile_clicked)
136                self.new_profile_window.connect("delete_event",self.hide_window)
137
138
139        #def connect_signals
140       
141        def load_info(self,info):
142               
143                self.profiles_info=info
144
145                for item in self.profiles_info:
146                        profile=item
147                        email=self.profiles_info[item]["email"]
148                        mountpoint=self.profiles_info[item]["mountpoint"]
149                        self.new_profile_button(profile,email,mountpoint)
150                        print self.profiles_info[item]["automount"]
151
152
153                print self.profiles_info       
154        #def load_info()               
155
156        def hide_window(self,widget,event):
157               
158                widget.hide()
159                return True
160
161        #def hide_window       
162
163        def init_profile_dialog_button(self):
164
165                self.accept_add_profile_button.show()
166                image = Gtk.Image()
167                image.set_from_stock(Gtk.STOCK_CANCEL,Gtk.IconSize.MENU)
168                self.cancel_add_profile_button.set_image(image)
169                self.cancel_add_profile_button.set_label(_("Cancel"))
170                self.cancel_add_profile_button.show()
171
172        #def init_profile_dialog_button
173
174        def disable_entry_profile_dialog(self):
175
176                self.profile_entry.set_editable(False)
177                self.email_entry.set_editable(False)
178                self.mountpoint_entry.set_sensitive(False)
179                self.automount_entry.set_sensitive(False)
180
181        #def disable_entry_profile_dialog
182       
183        def enable_entry_profile_dialog(self):
184
185                self.profile_entry.set_editable(True)
186                self.email_entry.set_editable(True)
187                self.mountpoint_entry.set_sensitive(True)
188                self.automount_entry.set_sensitive(True)       
189
190        def change_cancel_button(self):
191               
192                image = Gtk.Image()
193                image.set_from_stock(Gtk.STOCK_CLOSE,Gtk.IconSize.MENU)
194                self.cancel_add_profile_button.set_image(image)
195                self.cancel_add_profile_button.set_label(_("Close"))   
196                self.cancel_add_profile_button.show()   
197
198        #def change_cancel_button       
199
200        def add_new_profile_button_clicked(self,widget):
201
202                self.enable_entry_profile_dialog()
203
204                self.profile_entry.set_text("")
205                self.email_entry.set_text("")
206                self.mountpoint_entry.set_filename(os.environ["HOME"])
207                self.automount_entry.set_active(False)
208                self.profile_msg.set_text("")
209                self.edition=False
210
211                self.init_threads()
212               
213                self.msg_label.set_text("")
214                self.profile_msg.hide()
215                self.profile_pbar.hide()
216                self.init_profile_dialog_button()
217                self.new_profile_window.show()
218               
219
220        #def add_new_profile_button_clicked     
221
222        def delete_profile_clicked(self,button,hbox):
223
224                self.msg_label.set_text("")
225                profile=hbox.get_children()[1].get_text().split("\n")[0]
226                profile=profile.decode("utf-8")
227                self.profiles_info.pop(profile)
228
229                delete=self.core.LliurexGoogleDriveManager.delete_profile(self.profiles_info,profile)
230                self.msg_label.show()
231
232                if delete:
233                        self.profile_msg.set_name("MSG_LABEL")
234                        self.msg_label.set_text(MSG_CHANGE_SUCCESS)
235                        self.profile_list_box.remove(hbox)
236                else:
237                        self.msg_label.set_name("MSG_ERROR_LABEL")
238                        self.msg_label.set_text(MSG_CHANGE_ERROR)
239
240                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()
241
242
243        # def delete_profile_clicked
244               
245
246        def sync_profile_clicked(self,button,hbox):
247
248                self.msg_label.set_text("")
249                profile=hbox.get_children()[1].get_text().split("\n")[0]
250                mountpoint=hbox.get_children()[3].get_text()
251
252                status_mod=self.core.LliurexGoogleDriveManager.sync_profile(profile,mountpoint)
253                self.msg_label.show()
254
255                if status_mod["result"]:
256                        print status_mod
257
258                        if status_mod["action"]=="Mount":
259                                mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
260                                button.set_tooltip_text(_("Dismount profile"))
261                        else:
262                                mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
263                                button.set_tooltip_text(_("Mount profile"))
264
265                        self.profile_msg.set_name("MSG_LABEL")
266                        hbox.get_children()[4].set_image(mount_image)
267                        self.msg_label.set_text(MSG_CHANGE_SUCCESS)
268       
269                                               
270                else:
271                        self.msg_label.set_name("MSG_ERROR_LABEL")
272                        self.msg_label.set_text(MSG_CHANGE_ERROR)
273       
274               
275
276        #def mount_profile_clicked
277
278        def edit_profile_clicked(self,button,hbox):
279
280                self.enable_entry_profile_dialog()
281
282                self.profile_to_edit=hbox               
283                profile=self.profile_to_edit.get_children()[1].get_text().split("\n")[0]
284                self.profile_entry.set_text(profile)
285                self.profile_entry.set_editable(False)
286                email=self.profile_to_edit.get_children()[1].get_text().split("\n")[1]
287                self.email_entry.set_text(email)
288                self.email_entry.set_editable(False)
289                mountpoint=self.profile_to_edit.get_children()[3].get_text()
290                self.mountpoint_entry.set_filename(mountpoint)
291                automount=self.profiles_info[profile.decode("utf-8")]["automount"]
292                self.automount_entry.set_active(automount)
293                self.edition=True
294
295                self.init_threads()
296
297                self.profile_msg.hide()
298                self.profile_pbar.hide()
299                self.msg_label.set_text("")
300                self.init_profile_dialog_button()
301                self.new_profile_window.show() 
302
303        #def edit_profile_clicked
304
305
306        def new_profile_button(self,profile_name,email,mountpoint):
307               
308                hbox=Gtk.HBox()
309                profile_image=Gtk.Image.new_from_file(PROFILE_IMAGE)
310                profile_image.set_margin_left(10)
311                profile_image.set_halign(Gtk.Align.CENTER)
312                profile_image.set_valign(Gtk.Align.CENTER)
313                profile_info="<span font='Roboto'><b>"+profile_name+"</b></span>\n"+"<span font='Roboto'>"+email+"</span>"
314                profile=Gtk.Label()
315                profile.set_markup(profile_info)
316                profile.set_margin_left(5)
317                profile.set_margin_right(15)
318                profile.set_margin_top(21)
319                profile.set_margin_bottom(21)
320                folder_image=Gtk.Image.new_from_file(FOLDER_IMAGE)
321                folder_image.set_margin_left(20)
322                folder_image.set_halign(Gtk.Align.CENTER)
323                folder_image.set_valign(Gtk.Align.CENTER)
324                folder=Gtk.Label()
325                folder.set_text(mountpoint)
326                folder.set_margin_left(10)
327                delete=Gtk.Button()
328                delete_image=Gtk.Image.new_from_file(DELETE_IMAGE)
329                delete.add(delete_image)
330                delete.set_halign(Gtk.Align.CENTER)
331                delete.set_valign(Gtk.Align.CENTER)
332                delete.set_name("DELETE_ITEM_BUTTON")
333                delete.connect("clicked",self.delete_profile_clicked,hbox)
334                delete.set_tooltip_text(_("Delete profile"))
335                edit=Gtk.Button()
336                edit_image=Gtk.Image.new_from_file(EDIT_IMAGE)
337                edit.add(edit_image)
338                edit.set_halign(Gtk.Align.CENTER)
339                edit.set_valign(Gtk.Align.CENTER)
340                edit.set_name("EDIT_ITEM_BUTTON")
341                edit.connect("clicked",self.edit_profile_clicked,hbox)
342                edit.set_tooltip_text(_("Edit profile"))
343                mount=Gtk.Button()
344               
345                status=self.core.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
346                if status["status"]:
347                        mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
348                        mount.set_tooltip_text(_("Dismount profile"))
349                else:
350                        mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
351                        mount.set_tooltip_text(_("Mount profile"))
352       
353                mount.add(mount_image)
354                mount.set_halign(Gtk.Align.CENTER)
355                mount.set_valign(Gtk.Align.CENTER)
356                mount.set_name("MOUNT_ITEM_BUTTON")
357                mount.connect("clicked",self.sync_profile_clicked,hbox)
358               
359                hbox.pack_start(profile_image,False,False,0)
360                hbox.pack_start(profile,False,False,0)
361                hbox.pack_start(folder_image,False,False,0)
362                hbox.pack_start(folder,False,False,0)
363                hbox.pack_end(delete,False,False,10)
364                hbox.pack_end(edit,False,False,10)
365                hbox.pack_end(mount,False,False,10)
366                hbox.show_all()
367                hbox.set_name("PROFILE_BOX")
368                self.profile_list_box.pack_start(hbox,False,False,5)
369                self.profile_list_box.queue_draw()
370                hbox.queue_draw()
371               
372        #def new_profile_button
373
374        def accept_add_profile_clicked(self,widget):
375
376                self.disable_entry_profile_dialog()
377               
378                profile=self.profile_entry.get_text()
379
380                self.new_profile=profile.strip(" ").decode("utf-8")
381                email=self.email_entry.get_text()
382                self.new_email=email.strip(" ")
383                self.new_mountpoint=self.mountpoint_entry.get_filename().decode("utf-8")
384                self.new_automount=self.automount_entry.get_state()
385
386                check_form=self.check_profile_info()
387                self.profile_msg.show()
388
389                if check_form["result"]:
390                        self.profiles_info[self.new_profile]={}
391                        self.profiles_info[self.new_profile]["email"]=self.new_email
392                        self.profiles_info[self.new_profile]["mountpoint"]=self.new_mountpoint
393                        self.profiles_info[self.new_profile]["automount"]=self.new_automount
394                        self.profile_msg.set_name("MSG_LABEL")
395                        if not self.edition:
396                                if not self.create_profile_t.launched:
397                                        self.profile_msg.set_text(_("Connecting with google to get account access..."))
398                                        self.profile_pbar.show()
399                                        self.retry=0
400                                        GLib.timeout_add(100,self.pulsate_add_profile)
401                               
402               
403                        else:
404                                if not self.edit_profile_t.launched:
405                                        self.profile_msg.set_text(_("Apply changes"))
406                                        self.profile_pbar.show()
407                                        GLib.timeout_add(100,self.pulsate_edit_profile) 
408                else:
409                        self.profile_msg.set_name("MSG_ERROR_LABEL")
410                        self.profile_msg.set_text(check_form["msg"])
411                        self.enable_entry_profile_dialog()
412                               
413                               
414               
415       
416        #def accept_add_profile_clicked
417
418        def check_profile_info(self):
419
420                msg_check=""
421
422                check_form=self.core.LliurexGoogleDriveManager.check_profile_info(self.new_profile,self.new_mountpoint,self.edition)
423
424                if not check_form["result"]:
425                        if check_form["code"]==1:
426                                msg_check=_("You must indicate a profile")
427
428                        else:
429                                if check_form["code"]==2:
430                                        msg_check=_("Profile already exists")
431                                else:
432                                        msg_check=_("Mounting point already used by another profile")   
433
434
435                return {"result":check_form["result"],"msg":msg_check}
436
437        #def check_profile_info
438
439        def pulsate_add_profile(self):
440
441                self.retry=self.retry+1
442                self.profile_pbar.pulse()
443               
444                if not self.create_profile_t.launched:
445                        self.accept_add_profile_button.hide()
446                        self.cancel_add_profile_button.hide()
447               
448                        self.create_profile_t.start()
449                        self.create_profile_t.launched=True
450
451                if not self.create_profile_t.is_alive():
452                        if not self.create_mountpoint_t.launched:
453                                self.profile_msg.set_name("MSG_LABEL")
454                                self.profile_msg.set_text(_("Creating profile... "))
455                                self.create_mountpoint_t.start()
456                                self.create_mountpoint_t.launched=True
457
458                        if self.create_mountpoint_t.done:
459                                self.profile_pbar.hide()
460                                if self.create_result:
461                                                self.new_profile_button(self.new_profile,self.new_email,self.new_mountpoint)
462                                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
463                                                self.profile_msg.set_text(_("Profile created successfully"))
464                                                self.change_cancel_button()
465                                               
466                                else:
467                                       
468                                        self.profile_msg.set_name("MSG_ERROR_LABEL")
469                                        self.profile_msg.set_text(_("An error ocurred creating profile. See log file for more information"))
470                                        self.cancel_add_profile_button.show()
471                                       
472                               
473                                return False   
474                                               
475                if self.create_profile_t.launched:
476                        if self.create_profile_t.is_alive():
477                                self.kill_create_profile()
478                                return True     
479                               
480
481                if self.create_mountpoint_t.launched:
482                        if not self.create_mountpoint_t.done:
483                                return True             
484
485        #def_pulsate_add_profile                                               
486
487        def kill_create_profile(self):
488       
489                if self.retry>MAX_RETRY_INTENTS:
490                        parent=psutil.Process(self.create_profile_t.pid)
491                        for child in parent.children(recursive=True):
492                                child.kill()
493                                self.create_profile_t.terminate()
494                                self.profile_msg.set_name("MSG_ERROR_LABEL")
495                                self.profile_msg.set_text(_("Error getting authorization"))
496
497                return True     
498
499        #def kill_create_profile       
500
501        def create_profile(self):
502
503                result=self.core.LliurexGoogleDriveManager.create_profile(self.new_profile)
504
505        #def create_profile     
506
507        def create_mountpoint(self):
508
509                self.create_result=self.core.LliurexGoogleDriveManager.create_mountpoint(self.profiles_info,self.new_profile)
510                self.create_mountpoint_t.done=True
511               
512        #def create_mountpoint 
513
514        def pulsate_edit_profile(self):
515
516                if not self.edit_profile_t.launched:
517                        self.edit_profile_t.start()
518                        self.edit_profile_t.launched=True
519                        self.accept_add_profile_button.hide()
520                        self.cancel_add_profile_button.hide()
521
522                if self.edit_profile_t.done:
523                        self.profile_pbar.hide()
524                        if self.edit_result:
525                                self.profile_msg.set_name("MSG_LABEL")
526                                self.profile_to_edit.get_children()[3].set_text(self.new_mountpoint)
527                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
528                                self.profile_msg.set_text(MSG_CHANGE_SUCCESS)
529                                self.change_cancel_button()
530                       
531                        else:
532                                self.profile_msg.set_name("MSG_ERROR_LABEL")
533                                self.profile_msg.set_text(MSG_CHANGE_ERROR)
534                                self.cancel_add_profile_button.show()
535                        return False
536                       
537
538                if self.edit_profile_t.launched:
539                        if not self.edit_profile_t.done:
540                                return True
541
542        #def pulsate_edit_profile                       
543
544        def edit_profile(self):
545
546                self.edit_result=self.core.LliurexGoogleDriveManager.edit_profile(self.profiles_info,self.new_profile)
547                self.edit_profile_t.done=True
548
549        #def edit_profile       
550
551        def cancel_add_profile_clicked(self,widget):
552               
553                self.new_profile_window.hide()
554
555       
556        #def cancel_add_profile_clicked
557               
558#class profilebox
Note: See TracBrowser for help on using the repository browser.