def dialogo_cancelacion(self, widget): """Muestra el cuadro diálogo de cancelación del proceso.""" # crear cancelar = gtk.Dialog(_("Alerta"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) logo = gtk.Image() logo.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 6) icon = cancelar.render_icon(gtk.STOCK_DIALOG_QUESTION, 1) cancelar.set_icon(icon) if self.working: self.pause = True pregunta = gtk.Label(_("¿Está seguro que desea detener el proceso de migración?")) else: pregunta = gtk.Label(_("¿Está seguro que desea salir del asistente de migración?")) cancelar.set_default_response(gtk.RESPONSE_REJECT) h1 = gtk.HBox(False, 10) # añadir h1.pack_start(logo, True, False, 10) h1.pack_start(pregunta, True, False, 10) cancelar.vbox.pack_start(h1, True, False, 10) #mostrar cancelar.show_all() response = cancelar.run() cancelar.destroy() if response == gtk.RESPONSE_ACCEPT: self.destroy(None) else: self.pause = False
def about(self, widget): dialog = gtk.AboutDialog() dialog.set_name("AMIGU") dialog.set_version(ver) dialog.set_copyright("Elaborado el 30/07/2014 DIRECTIVA FUNDACITIOS JJAM") dialog.set_website(self.url) dialog.set_website_label(self.url) dialog.set_authors([ _("Programadores") + ':', 'Emilia Abad Sánchez <email>\n', 'Fernando Ruiz Humanes <email>\n' #_('Contributors:'), # FIXME: remove ":" ]) dialog.set_artists([_("Diseñadora gráfica") + ':', 'Emilia Abad Sánchez <email>\n', _("Logo e icono") + " por Sadesi" ]) dialog.set_translator_credits(_("Este programa aún no ha sido traducido a otros idiomas")) logo_file = os.path.abspath(os.path.join(dir_imagenes, 'icon_paginacion.png')) logo = gtk.gdk.pixbuf_new_from_file(logo_file) dialog.set_logo(logo) if os.path.isfile('/usr/share/common-licenses/GPL'): dialog.set_license(open('/usr/share/common-licenses/GPL').read()) else: dialog.set_license("This program is released under the GNU General Public License.\nPlease visit http://www.gnu.org/copyleft/gpl.html for details.") dialog.set_comments(_("asistente a la migración de Canaima")) dialog.run() dialog.destroy()
def excepthook(self, exctype, excvalue, exctb): """Manejador de excepciones""" if issubclass(exctype, KeyboardInterrupt) or issubclass(exctype, SystemExit): return tbtext = "".join(traceback.format_exception(exctype, excvalue, exctb)) syslog.syslog(syslog.LOG_ERR, "Exception in GTK frontend (invoking crash handler):") for line in tbtext.split("\n"): syslog.syslog(syslog.LOG_ERR, line) print >> sys.stderr, ("Exception in GTK frontend (invoking crash handler):") print >> sys.stderr, tbtext # self.dialogo_error(tbtext) if os.path.exists("/usr/share/apport/apport-gtk"): self.previous_excepthook(exctype, excvalue, exctb) tbtext = ( _("Se ha producido un error durante la ejecucción del programa que impide continuar.") + _( "Si dicho fallo se repite por favor comuníquelo al equipo de desarrolladores adjuntando el siguiente error:" ) + "\n\n" + tbtext ) error_dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, message_format=tbtext, buttons=gtk.BUTTONS_CLOSE) error_dlg.run() error_dlg.destroy() self.destroy(None) sys.exit(1)
def dialogo_confirmacion(self, widget): """Muestra el diálogo de confirmación antes de empezar la migración""" # crear confirmar = gtk.Dialog(_("Confirmación"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) logo = gtk.Image() logo.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 6) icon = confirmar.render_icon(gtk.STOCK_DIALOG_QUESTION, 1) confirmar.set_icon(icon) pregunta = gtk.Label(_('El asistente ha reunido la información necesaria para realizar la migración.') + '\n' + _('Es aconsejable cerrar todas las aplicaciones antes continuar.') + '\n' + _('¿Desea comenzar la copia de archivos/configuraciones?')) h1 = gtk.HBox(False, 10) # añadir h1.pack_start(logo, True, False, 10) h1.pack_start(pregunta, True, False, 10) confirmar.vbox.pack_start(h1, True, False, 10) # mostrar confirmar.show_all() response = confirmar.run() confirmar.destroy() if response == gtk.RESPONSE_ACCEPT: self.etapa_siguiente(None)
def initialize(self): self.name = _('Contactos de Windows') self.description = _('Contactos de Windows') self.size = 0.0 self.cs = glob.glob(join(self.user.path, 'Contacts','*.contact')) if not self.cs: raise Exception for c in self.cs: self.size += getsize(c)/1024
def initialize(self): self.name = _('Calendario de Windows') self.description = _('Calendario de Windows') self.size = 0 self.icals = glob.glob(join(self.user.folders['Local AppData'].path, 'Microsoft', 'Windows Calendar', 'Calendars','*.ics')) if not self.icals: raise Exception for cal in self.icals: self.size += getsize(cal)
def insertar_usuario(self, u): key = u.get_name() + " ("+ u.os +")" gtk.gdk.threads_enter() self.list_users.append([gtk.gdk.pixbuf_new_from_file_at_size(u.get_avatar(), 80 ,80), u.get_name(), u.os, u]) if len(self.list_users) == 1: self.label2.set_markup('<b>'+str(len(self.list_users))+ '</b>' + ' ' + _("usuario encontrado")) elif len(self.list_users) > 1: self.label2.set_markup('<b>'+str(len(self.list_users))+ '</b>' + ' ' + _("usuarios encontrados")) gtk.gdk.threads_leave()
def initialize(self): """Inicializa los valores específicos de la aplicación. Este método debe ser apliado en las clases hijas """ self.name = _("Lector de correo") self.size = 0 self.mailconfigs = [] self.mailboxes = [] self.dest = folder(os.path.join(os.path.expanduser('~'),'.evolution','mail','local', _("Correo de ")+ self.name +'.sbd')) self.description = self.name +": %d"%len(self.mailconfigs)+ _("cuentas de correo")
def initialize(self): """Inicializa los parametros específicos de la aplicación""" self.name = self.option.get_name() self.size = self.option.get_size() self.files = self.option.count_files() self.copied = 0 self.type = "data" self.destination = None self.path = self.option self.description = _("Carpeta") + " '%s': %d " % (self.name, self.files) + _("archivos")
def initialize(self): """Inicializa los valores específicos de la aplicación.""" self.name = _("Mozilla Thunderbird") self.mailboxes = [] self.size = 0 self.mailconfigs = self.get_configuration() self.description = self.name + ": %d " % len(self.mailconfigs) + _("cuentas de correo") for mb in self.mailboxes: self.size += mb.get_size() if not self.mailconfigs: raise Exception
def destroy(self, widget, data=None): """Finaliza la ejecución del asistente y limpiar los archivos temporales""" if self.working: self.abort = True self.pause = False return 0 print _("Saliendo del asistente") iter = self.list_users.get_iter_root() model = self.users.get_model() while iter: print _("Eliminando archivos temporales...") model.get_value(iter, 3).clean() iter = self.list_users.iter_next(iter) gtk.main_quit()
def initialize(self): self.name = _('Fondo de escritorio') self.description = _('Imagen de fondo de escritorio') w = self.user.search_key("Control Panel\\Desktop") if 'WallPaper' in w.keys(): self.image = self.user.check_path(w['WallPaper']) elif 'Wallpaper' in w.keys(): self.image = self.user.check_path(w['Wallpaper']) else: raise Exception if not exists(self.image): #bug in Windows XP self.image = self.image.replace('/w','/W') self.size = getsize(self.image)/1024
def config_EVOLUTION_addressbook(self): """Convierte e integra los contactos en la libreta de direcciones de Evolution """ vcard = os.path.join(self.dest.path, _("Contactos")) if not os.path.exists(vcard): vcard = commands.getoutput("rgrep -l VCARD %s" % self.dest.path.replace(' ', '\ ')) if not vcard or not os.path.exists(vcard): return 0 import bsddb adb=os.path.join(os.path.expanduser('~'),'.evolution','addressbook','local','system','addressbook.db') folder(os.path.dirname(adb)) db = bsddb.hashopen(adb,'w') if not 'PAS-DB-VERSION\x00' in db.keys(): db['PAS-DB-VERSION\x00'] = '0.2\x00' contacts = open(vcard, 'r') while 1: l = contacts.readline() if not l: break if l.find('BEGIN:VCARD') != -1: randomid = 'pas-id-' + str(random.random())[2:] db[randomid+'\x00'] = 'BEGIN:VCARD\r\nUID:' + randomid + '\r\n' while 1: v = contacts.readline() if v.find('END:VCARD') != -1: db[randomid+'\x00'] += 'END:VCARD\x00' break else: db[randomid+'\x00'] += v.replace('PERSONAL','HOME').replace('\n', '\r\n') db.sync() db.close() os.remove(vcard)
def initialize(self): """Inicializa los parametros específicos de la aplicación""" if not os.path.exists("/usr/bin/unoconv"): raise Exception self.name = _("Convertir archivos de ofimática") self.filelist = self.option.search_by_ext(self.option.document_files + self.option.presentation_files + self.option.spread_files) self.files = len(self.filelist) if not self.files: raise Exception self.size = self.get_total_size() self.copied = 0 self.type = "data" self.destination = None self.timer = None self.path = self.option self.description = _("Conversión de") + " %d " % self.files + _("archivos ofimáticos")
def update_progress(self, value=0, delta=0): """Actualiza la barra de progreso asociada a la tarea en con un valor concreto o con un incremento relativo. Sólo válido para la interfaz gráfica de Amigu Argumentos de entrada: value -- nuevo valor de la barra de progreso (default 0) delta -- nuevo incremento de la barra de progreso (default 0) """ try: gtk.gdk.threads_enter() if value and delta: try: self.copied += value status = _("Migrando...") + " (%d/%d)" % (self.copied, self.files) self.model.set_value(self.iter, 3, status) except: pass elif value: self.model.set_value(self.iter, 2, value) elif delta: self.model.set_value(self.iter, 2, delta + float(self.model.get_value(self.iter, 2))) except: pass finally: gtk.gdk.threads_leave()
def initialize(self): """Personaliza los parámetro de la aplicación""" if not self.option: raise Exception self.name = self.option self.description = _("Windows Live ID") +": " +self.name self.size = 1
def import_mails(self): """Convierte los correos al formato Mailbox.""" self.dest = folder( os.path.join(os.path.expanduser("~"), ".evolution", "mail", "local", _("Correo de ") + self.name + ".sbd") ) for mb in self.mailboxes: mb.copy(self.dest, exclude=[".dat", ".msf"])
def dialogo_advertencia(self, mensaje = "", progreso=False): """Muestra mensajes de aviso""" # crear self.advertencia = gtk.Dialog(_("Aviso"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) h1 = gtk.HBox(False, 10) # añadir self.advertencia.vbox.pack_start(h1, True, False, 10) if progreso: self.progreso2 = gtk.ProgressBar(None) self.progreso2.pulse() self.advertencia.vbox.pack_start(self.progreso2, True, False, 1) stock = gtk.STOCK_EXECUTE self.wait = True hilo2 = threading.Thread(target=self.pulse, args=()) hilo2.start() else: stock = gtk.STOCK_DIALOG_WARNING logoad = gtk.Image() logoad.set_from_stock(stock, 6) iconad = self.advertencia.render_icon(stock, 1) self.advertencia.set_icon(iconad) mensaje = gtk.Label(mensaje) h1.pack_start(logoad, True, False, 10) h1.pack_start(mensaje, True, False, 10) self.advertencia.show_all() self.advertencia.set_default_response(gtk.RESPONSE_ACCEPT) r = self.advertencia.run() self.advertencia.destroy() self.advertencia = None self.wait = False
def initialize(self): """Inicializa los valores específicos de la aplicación.""" self.size = 0 self.mailconfigs = [] self.mailboxes = [] self.name = _("Outlook XP-2002-2003") pst = glob.glob(os.path.join(self.user.folders["Local AppData"].path, 'Microsoft','Outlook', '?utlook.pst')) if pst and os.path.exists(pst[0]): self.mailboxes.append(pst[0]) self.mailconfigs = self.get_configuration() self.description = self.name +": %d "%len(self.mailconfigs)+ _("cuentas de correo") if not self.mailconfigs: raise Exception for mb in self.mailboxes: self.size = os.path.getsize(mb)/1024
def initialize(self): """Personaliza los parámetros de la aplicación""" self.option = self.user.get_GTALK_account() if not self.option: raise Exception self.name = self.option.endswith('gmail.com') and self.option or self.option + "@gmail.com" self.description = _("Google Talk") +": " +self.name self.size = 1
def initialize(self): """Inicializa los valores específicos de la aplicación.""" self.size = 0 self.mailconfigs = [] self.mailboxes = [] self.name = _("Outlook 2007") self.description = _("Datos y configuraciones de MS Office Outlook 2007") pst = os.path.join(self.user.folders["Local AppData"].path, 'Microsoft','Outlook', 'Outlook.pst') if os.path.exists(pst): self.mailboxes.append(pst) self.mailconfigs = self.get_configuration() if not self.mailconfigs: raise Exception for mb in self.mailboxes: self.size = os.path.getsize(mb)/1024 self.description = self.name +": %d "%len(self.mailconfigs)+ _("cuentas de correo")
def initialize(self): self.name = _("eMule") self.description = _("Configuración de eMule")+"\n"+_("Seleccione también la opción Archivos") self.cfg_dir = self.get_configuration() self.inc_dir, self.tmp_dir = None, None if not self.cfg_dir: raise Exception self.size = self.cfg_dir.get_size() self.get_paths() if self.user.os.find('Vista') > 1: f = self.user.folders['Downloads'].path elif self.user.os.find('XP') > 1: f = self.user.get_personal_folder().path if self.inc_dir and not self.inc_dir.path.startswith(f): self.size += self.inc_dir.get_size() self.description = _("Configuración y archivos de eMule") if self.tmp_dir and not self.tmp_dir.path.startswith(f): self.size += self.tmp_dir.get_size() self.description = _("Configuración y archivos de eMule")
def get_tree_links(self): """Devuelve el arbol de marcadores/favoritos de la aplicación contenido en un objeto de tipo TreeStore """ tree = TreeStore(str, str) folder = tree.append(None, [_("Marcadores de Opera"), None]) #print "#########################################################" self.get_bookmarks(tree, folder, self.get_configuration()) #print "#########################################################" return tree
def recorrer_tareas(self, iterator, model): tarea = model.get_value(iterator, 4) if tarea and model.get_value(iterator, 1): self.tasks.append([model.get_value(iterator, 3),gtk.STOCK_MEDIA_PAUSE,0,_("Esperando..."), -1, tarea]) self.n_tasks += 1 if model.iter_children(iterator): #caso recursivo hijas = model.iter_children(iterator) while hijas: self.recorrer_tareas(hijas, model) # siguiente elemento hijas = model.iter_next(hijas)
def generar_resumen(self, model): """Genera el resumen de las tareas pendiente""" self.n_tasks = 0 self.tasks.clear() iter = model.get_iter_root() if iter: self.recorrer_tareas(iter, model) if self.n_tasks: self.apply_boton.set_sensitive(True) else: self.dialogo_advertencia(_("No se seleccionado ninguna opción de migración")) self.apply_boton.set_sensitive(False)
def config_EVOLUTION_calendar(self): """Convierte e integra el calendario en Evolution""" vcal = os.path.join(self.dest.path, _("Calendario")) if not os.path.exists(vcal): vcal = commands.getoutput("rgrep -l VEVENT %s" % self.dest.path.replace(' ', '\ ')) if not vcal or not os.path.exists(vcal): return 0 old = None dates = [] evo_cal = os.path.join(os.path.expanduser('~'),'.evolution','calendar','local','system','calendar.ics') folder(os.path.dirname(evo_cal)) if os.path.exists(evo_cal): old = backup(evo_cal) if old: new_cal = open(evo_cal, "w") old_cal = open(old, 'r') for l in old_cal.readlines(): if l.find('END:VCALENDAR') == -1: new_cal.write(l) if l.find('BEGIN:VEVENT') != -1: dt, sum = None, None elif l.find('END:VEVENT') != -1: if dt and sum: dates.append(dt+sum) elif l.find('DTSTART') != -1: dt = l.replace('DTSTART:', '') elif l.find('SUMMARY') != -1: sum = l.replace('SUMMARY:', '') old_cal.close() orig = open(vcal,"r") events = False if not old: new_cal = open(evo_cal, "w") new_cal.write('BEGIN:VCALENDAR\n') new_cal.write('CALSCALE:GREGORIAN\n') new_cal.write('VERSION:2.0\n') buffer = '' for l in orig.readlines(): buffer += l if l.find('BEGIN:VEVENT') != -1: dt, sum = None, None buffer = l elif l.find('END:VEVENT') != -1: if dt and sum and not dt+sum in dates: new_cal.write(buffer) elif l.find('DTSTART') != -1: dt = l.replace('DTSTART:', '') elif l.find('SUMMARY') != -1: sum = l.replace('SUMMARY:', '') new_cal.write('END:VCALENDAR\n') orig.close() os.remove(vcal)
def buscar(self, widget): """Muestra el cuadro diálogo para seleccionar la ubicación de destino de los archivos""" # crear dialog = gtk.FileChooserDialog(_("Destino"), None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) dialog.set_current_folder(os.path.expanduser('~')) # run response = dialog.run() if response == gtk.RESPONSE_OK: self.entry.set_text(dialog.get_current_folder()) self.actualizar_espacio(self.window, self.entry) dialog.destroy()
def get_tree_options(self, update=False): """Devuele el árbol de opciones generado para el usario seleccionado. El objeto devuelto es de tipo gtk.TreeStore. Este método debe ampliarse en las clases hijas. Argumentos de entrada: update -- indica si se debe actualizar el contenido del árbol (default False) """ if self.tree_options: if update: self.tree_options.clear() else: return self.tree_options else: from gtk import TreeStore self.tree_options = TreeStore( str, 'gboolean', str, str, str) name_usr = self.tree_options.append(None, [self.get_name(), None, None, _('Usuario seleccionado'), None]) # Files parent = self.tree_options.append(name_usr , [_("Archivos"), None, None, _('Migrar archivos'), None] ) personal = self.tree_options.append( parent, [_("Carpeta Personal"), None, str(self.folders['Personal'].get_size()), _('Archivos personales: ')+ self.folders['Personal'].get_info(), 'documentos'] ) return self.tree_options
def buscar_usuarios(self): """Busca usuarios de otros sistemas en el ordenador""" gtk.gdk.threads_enter() self.label2.set_markup('<b>'+_("Buscando usuarios de otros sistemas...")+ '</b>') gtk.gdk.threads_leave() self.pc = mipc() self.pc.check_all_partitions() self.usuarios = {} wusers = self.pc.get_win_users() xusers = self.pc.get_lnx_users() musers = self.pc.get_mac_users() gtk.gdk.threads_enter() self.list_users.clear() self.users.set_model(self.list_users) gtk.gdk.threads_leave() n = 1 options = {} aviso = "" for u, s in wusers.iteritems(): try: usuario = mswin.winuser(u, self.pc, s) except: aviso += _("No se pudo acceder a algunos de los usuarios de Windows.") + "\n" continue else: self.insertar_usuario(usuario) for u, s in xusers.iteritems(): try: usuario = openos.freeuser(u, self.pc, s) except: aviso += _("No se pudo acceder a algunos de los usuarios de Unix/Linux.") + "\n" continue else: self.insertar_usuario(usuario) for u, s in musers.iteritems(): try: usuario = macos.macuser(u, self.pc, s) except: aviso += _("No se pudo acceder a algunos de los usuarios de Mac OS.") + "\n" continue else: self.insertar_usuario(usuario) if len(self.list_users) == 0: gtk.gdk.threads_enter() self.label2.set_markup('<b>'+_("No se han encontrado ningún usuario que migrar")+ '</b>' + aviso) gtk.gdk.threads_leave() else: gtk.gdk.threads_enter() self.label2.set_markup(_("Resultado de la búsqueda")+ ": "+ self.label2.get_text() + aviso) gtk.gdk.threads_leave()
def do(self): """Realiza el proceso de importación""" self.option.errors = [] inc = 0 errors = 0 if self.model: inc = 100.0/(self.files + 1) self.abort = False dest = folder(self.destination) self.destination = dest.create_subfolder(_("Convertidos")) for f in self.filelist: if self.abort: break s = None ext = splitext(f)[1] if ext in self.option.document_files: s = self.odf_converter(f, 'odt') elif ext in self.option.presentation_files: s = self.odf_converter(f, 'odp') elif ext in self.option.spread_files: s = self.odf_converter(f, 'ods') if not s: continue if s.wait() < 0: errors += 1 else: errors -= 1 self.update_progress(1, 1) self.update_progress(delta=inc) self.outpipe.close() self.timer.cancel() if errors >= 10: self.cancel() return 0 elif errors < 0: errors = 0 return 1