Esempio n. 1
0
 def _abrir(self, action):
     """
     Abre la ventana de la entrada de menú recibida.
     """
     idventana = int(action.get_name().replace("V", ""))
     ventana = pclases.Ventana.get(idventana)
     clase = ventana.clase
     archivo = ventana.fichero
     if archivo.endswith('.py'):    
         # Al importar no hay que indicar extensión
         archivo = archivo[:archivo.rfind('.py')]
     if clase == 'acerca_de' and archivo == 'acerca_de':
         ui.escribir_barra_estado(self.wids['barra_estado'], 
                                  'Abrir: "acerca de..."', 
                                  self.logger, 
                                  self.__usuario.usuario)
         self.acerca_de()
     else:
         try:
             cur_reloj = gtk.gdk.Cursor(gtk.gdk.WATCH)
             self.wids['ventana'].window.set_cursor(cur_reloj)
             ui.escribir_barra_estado(self.wids['barra_estado'], 
                                      "Cargar: %s.py" % archivo, 
                                      self.logger, 
                                      self.__usuario.usuario)
             while gtk.events_pending(): gtk.main_iteration(False)
             try:
                 exec "reload(%s)" % archivo
             except NameError:
                 exec "import %s" % archivo
             v = None 
             gobject.timeout_add(100, self.volver_a_cursor_original)
             # Solo se permite una instancia de cada tipo de ventana. 
             # It's not a bug. It's a feature! (sí, ya :P)
             v = eval('%s.%s' % (archivo, clase))
             v(usuario = self.__usuario)
         except Exception, msg:
             self.logger.error("ventana.py::_abrir -> Excepción "
                               "importando fichero ventana: %s" % msg)
             self.wids['ventana'].window.set_cursor(None)
             ui.escribir_barra_estado(self.wids['barra_estado'], 
                 "Error detectado. Iniciando informe por correo.", 
                 self.logger, 
                 self.__usuario.usuario)
             print "Se ha detectado un error"
             texto = ''
             for e in sys.exc_info():
                 texto += "%s\n" % e
             tb = sys.exc_info()[2]
             texto += "Línea %s\n" % tb.tb_lineno
             from menu import MetaF, enviar_correo
             info = MetaF() 
             import traceback
             traceback.print_tb(tb, file = info)
             texto += "%s\n" % info
             enviar_correo(texto, self.__usuario)
Esempio n. 2
0
 def __init__(self, glade, objeto = None, usuario = None):
     """
     Constructor.
     glade es una cadena con el nombre del fichero .glade a cargar.
     objeto es el objeto principal de la ventana.
     Si usuario se recibe, se guarda en un atributo privado de la 
     clase que servirá únicamente para crear un menú superior en 
     la ventana con las opciones de menú disponibles para el usuario.
     Si el usuario es None, no se crea ningún menú.
     """
     if isinstance(usuario, int):
         usuario = pclases.Usuario.get(usuario)
     self.__usuario = usuario
     self._is_fullscreen = False
     import logging
     self.logger = logging.getLogger('GINN')
     # El fichero de log lo voy a plantar en el raíz del proyecto.
     rutalogger = os.path.join(os.path.dirname(__file__), "..", 'ginn.log')
     hdlr = logging.FileHandler(rutalogger)
     formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
     hdlr.setFormatter(formatter)
     self.logger.addHandler(hdlr)
     # self.logger.setLevel(logging.INFO)
     try:
         self.wids = Widgets(glade)  # Puede que venga la ruta ya y no 
                                     # haga falta combinar con os.path.join.
     except RuntimeError:
         try:
             self.wids = Widgets(os.path.join("formularios","glades",glade))
         except RuntimeError:
             try:
                 self.wids = Widgets(os.path.join("glades", glade))
             except RuntimeError:
                 try:
                     self.wids = Widgets(os.path.join(
                                     "..", "formularios", "glades", glade))
                 except RuntimeError:
                     if pclases.DEBUG and pclases.VERBOSE:
                         print "ventana.py::Ventana.__init__ -> "\
                               "No encuentro el glade. Estoy en %s. "\
                               "Intento cargar de nuevo desde donde "\
                               "se supone que debería estar." % (
                                 os.path.abspath(os.path.curdir))
                     self.wids = Widgets(glade)
     self.refocus_enter()
     try:
         self.wids['ventana'].set_border_width(5)
         # TODO:Cambiar por uno correspondiente al logo de la configuración. 
         ruta_logo = os.path.join("imagenes", 'logo.xpm')
         logo_xpm = gtk.gdk.pixbuf_new_from_file(ruta_logo) 
         self.wids['ventana'].set_icon(logo_xpm)
         self.wids['barra_estado'] = gtk.Statusbar()
         label_statusbar = self.wids['barra_estado'].get_children()[0].child
         font = pango.FontDescription("Monospace oblique 7")
         label_statusbar.modify_font(font)
         label_statusbar.modify_fg(gtk.STATE_NORMAL, 
             label_statusbar.get_colormap().alloc_color("darkgray"))
         contenido_anterior = self.wids['ventana'].get_child()
         self.wids['ventana'].remove(contenido_anterior)
         self.wids['contenedor_exterior'] = gtk.VBox()
         self.wids['ventana'].add(self.wids['contenedor_exterior'])
         self.wids['menu_superior'] = self.build_menu_superior()
         self.wids['contenedor_exterior'].pack_start(
             self.wids['menu_superior'], False)
         self.wids['contenedor_exterior'].add(contenido_anterior)
         self.wids['contenedor_exterior'].pack_end(
             self.wids['barra_estado'], False)
         self.wids['contenedor_exterior'].show()
         self.wids['barra_estado'].show()
         config = ConfigConexion()
         info_conexion = "%s://%s:xxxxxxxx@%s:%s/%s" % (config.get_tipobd(), 
                                                        config.get_user(), 
                                                        config.get_host(), 
                                                        config.get_puerto(), 
                                                        config.get_dbname())
         info_usuario = ""
         if hasattr(self, "usuario") and self.__usuario != None:
             info_usuario = " usuario: %s." % (self.__usuario.usuario)
         if self.__usuario != None:
             info_usuario = " __usuario: %s." % (self.__usuario.usuario)
         ui.escribir_barra_estado(self.wids['barra_estado'], 
                                  "Conectado a %s.%s" % (info_conexion, 
                                                         info_usuario))
     except Exception, msg:
         txt = "ventana.py::__init__ -> No se pudo establecer ancho "\
               "de borde, icono de ventana o barra de estado. "\
               "Excepción: %s." % (msg)
         self.logger.warning(txt)