예제 #1
0
파일: menu.py 프로젝트: pacoqueen/bbinn
 def abrir_ventana(self, archivo, clase):
     if archivo.endswith('.py'):  # Al importar no hay que indicar extensión
         archivo = archivo[:archivo.rfind('.py')]
     if clase == 'gajim' and archivo == 'gajim':
         utils.escribir_barra_estado(self.statusbar, 
                                     "Iniciar: gajim...", 
                                     self.logger, 
                                     self.usuario.usuario)
         self.abrir_gajim()
     elif clase == 'acerca_de' and archivo == 'acerca_de':
         utils.escribir_barra_estado(self.statusbar, 
                                     'Abrir: "acerca de..."', 
                                     self.logger, 
                                     self.usuario.usuario)
         self.acerca_de()
     elif 'usuario' in archivo:
         utils.escribir_barra_estado(self.statusbar, 
                                     "Cargar: %s.py" % archivo, 
                                     self.logger, 
                                     self.usuario.usuario)
         self.abrir_ventana_usuario(archivo)
     elif "pruebas_periodicas" in clase:
         utils.escribir_barra_estado(self.statusbar, 
                                     "Pruebas de coherencia de datos", 
                                     self.logger, 
                                     self.usuario.usuario)
         self.abrir_pruebas_coherencia()
     else:
         utils.escribir_barra_estado(self.statusbar, 
                                     "Cargar: %s.py" % archivo, 
                                     self.logger, 
                                     self.usuario.usuario)
         self.abrir_ventana_modulo_python(archivo, clase)
예제 #2
0
파일: menu.py 프로젝트: pacoqueen/bbinn
 def mostrar_item_seleccionado(self, icon_view, model):
     selected = icon_view.get_selected_items()
     if len(selected) == 0: return
     i = selected[0][0]
     descripcion_icono_seleccionado = model[i][0]
     descripcion_icono_seleccionado = descripcion_icono_seleccionado.replace('\n', ' ')
     utils.escribir_barra_estado(self.statusbar, descripcion_icono_seleccionado, self.logger, self.usuario.usuario)
예제 #3
0
파일: ventana.py 프로젝트: Virako/fpinn
 def _abrir(self, action):
     """
     Abre la ventana de la entrada de menú recibida.
     """
     import pclases, utils
     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 == 'gajim' and archivo == 'gajim':
         utils.escribir_barra_estado(self.wids['barra_estado'], "Iniciar: gajim...", self.logger, self.__usuario.usuario)
         self.abrir_gajim()
     elif clase == 'acerca_de' and archivo == 'acerca_de':
         utils.escribir_barra_estado(self.wids['barra_estado'], 'Abrir: "acerca de..."', self.logger, self.__usuario.usuario)
         self.acerca_de()
     elif 'usuario' in archivo:
         self.wids['ventana'].window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
         utils.escribir_barra_estado(self.wids['barra_estado'], "Cargar: %s.py" % archivo, self.logger, self.__usuario.usuario)
         exec "import %s" % archivo
         v = None 
         gobject.timeout_add(100, self.volver_a_cursor_original)
         if archivo == "usuarios": 
             v = usuarios.Usuarios(self.__usuario)
         elif archivo == "ventana_usuario":
             v = ventana_usuario.Usuarios(self.__usuario)
     else:
         try:
             self.wids['ventana'].window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
             utils.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)
             utils.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)
예제 #4
0
파일: menu.py 프로젝트: pacoqueen/bbinn
 def __init__(self, user = None, passwd = None):
     """
     user: Usuario. Si es None se solicitará en la ventana de 
     autentificación.
     passwd: Contraseña. Si es None, se solicitaré en la ventana de 
     autentificación.
     Si user y passwd son distintos a None, no se mostrará la ventana de 
     autentificación a no ser que sean incorrectos.
     """
     import gestor_mensajes, autenticacion
     login = autenticacion.Autenticacion(user, passwd)
     pclases = import_pclases()
     if pclases.VERBOSE:
         print "Cargando gestor de mensajes..."
     self.logger = login.logger
     if not login.loginvalido():
         sys.exit(1)
     self.usuario = login.loginvalido()
     # Configuración del correo para informes de error:
     if self.usuario.cuenta:
         gtkexcepthook.feedback = self.usuario.cuenta
         gtkexcepthook.password = self.usuario.cpass
         if not self.usuario.smtpserver:
             gtkexcepthook.smtphost = "smtp.gmail.com"
             gtkexcepthook.ssl = True
             gtkexcepthook.port = 587
         else:
             gtkexcepthook.smtphost = self.usuario.smtpserver
             gtkexcepthook.ssl = False
             gtkexcepthook.port = 25
         gtkexcepthook.devs_to = "*****@*****.**"\
                                 ", [email protected]"
     # Continúo con el gestor de mensajes y resto de ventana menú.
     self.__gm = gestor_mensajes.GestorMensajes(self.usuario)
     # DONE: Dividir la ventana en expansores con los módulos del programa 
     # (categorías) y dentro de ellos un IconView con los iconos de cada 
     # ventana. Poner también en lo alto del VBox el icono de la aplicación.
     # (Ya va siendo hora de un poquito de eyecandy).
     if pclases.VERBOSE:
         print "Cargando menú principal..."
     self.construir_ventana()
     utils.escribir_barra_estado(self.statusbar, 
                                 "Menú iniciado", 
                                 self.logger, 
                                 self.usuario.usuario)
예제 #5
0
파일: menu.py 프로젝트: pacoqueen/bbinn
 def on_select(self, icon_view, model=None):
     pclases = import_pclases()
     selected = icon_view.get_selected_items()
     if len(selected) == 0: return
     i = selected[0][0]
     category = model[i][0]
     if self.current_frame is not None:
         self.content_box.remove(self.current_frame)
         self.current_frame.destroy()
         self.current_frame = None
     if category != "Favoritos":
         modulo = pclases.Modulo.select(
             pclases.Modulo.q.nombre == category)[0]
     else:
         modulo = "Favoritos"
     self.current_frame = self.create_frame(modulo)
     utils.escribir_barra_estado(self.statusbar, category, self.logger, self.usuario.usuario)
     self.content_box.pack_end(self.current_frame, fill=True, expand=True)
     self.ventana.show_all()
예제 #6
0
파일: menu.py 프로젝트: pacoqueen/bbinn
 def abrir_ventana_modulo_python(self, archivo, clase):
     try:
         self.ventana.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
         while gtk.events_pending(): gtk.main_iteration(False)
         # HACK: Debe haber una forma mejor de hacerlo. De momento me 
         #       aprovecho de que el mainloop no va a atender al 
         #       timeout aunque se cumpla el tiempo, ya que está 
         #       ocupado en abrir la ventana, con lo que el cursor 
         #       sale del "busy" justo cuando debe, al abrirse la 
         #       ventana.
         v = None 
         gobject.timeout_add(100, self.volver_a_cursor_original)
         # NOTA: OJO: TODO: Usuario harcoded. Cambiar en cuanto sea 
         #                  posible.
         if ((self.get_usuario().usuario == "geotextil" or 
              self.get_usuario().usuario == "fibra" or 
              self.get_usuario().nivel >= 3) 
             and "partes_de_fabricacion" in archivo
             and self.get_usuario().usuario != "cemento"):
             exec "import %s" % archivo
             v = eval('%s.%s' % (archivo, clase))
             try:
                 v(permisos = "rx", usuario = self.get_usuario())
             except TypeError:   # La ventana no soporta el modelo 
                                 # antiguo de permisos.
                 v(usuario = self.get_usuario())
         else:
             try:
                 self.lanzar_ventana(archivo, clase)
             except Exception, e:
                 print e
                 sys.stderr.write(`e`)
                 self._lanzar_ventana(archivo, clase)
     except:
         self.ventana.window.set_cursor(None)
         utils.escribir_barra_estado(self.statusbar, 
             "Error detectado. Iniciando informe por correo.", 
             self.logger, 
             self.usuario.usuario)
         self.enviar_correo_error_ventana()
예제 #7
0
파일: ventana.py 프로젝트: Virako/fpinn
 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')
     hdlr = logging.FileHandler('ginn.log')
     formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
     hdlr.setFormatter(formatter)
     self.logger.addHandler(hdlr)
     # self.logger.setLevel(logging.INFO)
     self.wids = Widgets(glade)
     self.handlers_id = dict([(w, {}) for w in self.wids.keys()])
     for w in self.wids.keys():
         if isinstance(self.wids[w], gtk.Entry):
             h_id = self.wids[w].connect("activate", self.refocus_entry)
             try:
                 self.handlers_id[w]["activate"].append(h_id)
             except KeyError:
                 self.handlers_id[w]["activate"] = [h_id]
     config = ConfigConexion()
     try:
         self.wids['ventana'].set_border_width(5)
         # TODO:Cambiar por uno correspondiente al logo de la configuración. 
         logo_xpm = gtk.gdk.pixbuf_new_from_file('logo_w.xpm')
         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()
         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)
         utils.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)
예제 #8
0
 def set_texto_estado(self, texto):
     utils.escribir_barra_estado(self.barra_estado, texto)
예제 #9
0
파일: menu.py 프로젝트: pacoqueen/upy
 def abrir(self, iview, path, model):
     clase = model[path][3]
     archivo = model[path][2]
     pclases = import_pclases()
     pclases.Estadistica.incrementar(self.usuario, archivo)
     if archivo.endswith('.py'):  # Al importar no hay que indicar extensión
         archivo = archivo[:archivo.rfind('.py')]
     if clase == 'gajim' and archivo == 'gajim':
         utils.escribir_barra_estado(self.statusbar, 
                                     "Iniciar: gajim...", 
                                     self.logger, 
                                     self.usuario.usuario)
         self.abrir_gajim()
     elif clase == 'acerca_de' and archivo == 'acerca_de':
         utils.escribir_barra_estado(self.statusbar, 
                                     'Abrir: "acerca de..."', 
                                     self.logger, 
                                     self.usuario.usuario)
         self.acerca_de()
     elif 'usuario' in archivo:
         self.ventana.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
         utils.escribir_barra_estado(self.statusbar, 
                                     "Cargar: %s.py" % archivo, 
                                     self.logger, 
                                     self.usuario.usuario)
         exec "import %s" % archivo
         v = None 
         gobject.timeout_add(100, self.volver_a_cursor_original)
         if archivo == "usuarios": 
             v = usuarios.Usuarios(self.get_usuario())
         elif archivo == "ventana_usuario":
             v = ventana_usuario.Usuarios(self.get_usuario())
     elif "pruebas_periodicas" in clase:
         self.abrir_pruebas_coherencia()
     else:
         try:
             self.ventana.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
             utils.escribir_barra_estado(self.statusbar, "Cargar: %s.py" % archivo, self.logger, self.usuario.usuario)
             while gtk.events_pending(): gtk.main_iteration(False)
             try:
                 exec "reload(%s)" % archivo
                 # PLAN: Esto no funciona como esperaba debido a que aunque se cierre la ventana, hay 
                 # referncias por ahí rulando y el reload no recompila y vuelve a cargar el módulo.
                 # Ver: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/160164 o 
                 # http://aspn.activestate.com/ASPN/Mail/Message/python-list/907876 y usar cuando lo 
                 # tenga suficientemente testeado.
             except NameError:
                 exec "import %s" % archivo
             # HACK: Debe haber una forma mejor de hacerlo. De momento me aprovecho de que el mainloop no 
             #       va a atender al timeout aunque se cumpla el tiempo, ya que está ocupado en abrir la 
             #       ventna, con lo que el cursor sale del "busy" justo cuando debe, al abrirse la ventana.
             v = None 
             gobject.timeout_add(100, self.volver_a_cursor_original)
             v = eval('%s.%s' % (archivo, clase))
             v(usuario = self.get_usuario())
             # Podría incluso guardar los objetos ventana que se van 
             # abriendo para controlar... no sé, algo, contar las ventanas 
             # abiertas o algo.
         except:
             self.ventana.window.set_cursor(None)
             utils.escribir_barra_estado(self.statusbar, 
                 "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
             info = MetaF() 
             traceback.print_tb(tb, file = info)
             texto += "%s\n" % info
             enviar_correo(texto, self.get_usuario())