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

Last change on this file since 4009 was 4009, checked in by jrpelegrina, 3 years ago

WIP in fix encode

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