Example #1
0
def main():
    user = None
    passwd = None
    if len(sys.argv) > 1:
        usage = "uso: %prog [opciones] usuario contraseña"
        parser = OptionParser(usage=usage)
        parser.add_option("-c", "--config", dest="fichconfig",
                help="Usa la configuración alternativa almacenada en FICHERO",
                metavar="FICHERO")
        (options, args) = parser.parse_args()
        fconfig = options.fichconfig
        if len(args) >= 1:
            user = args[0]
        if len(args) >= 2:
            passwd = args[1]
        # HACK
        if fconfig:
            config = ConfigConexion()
            config.set_file(fconfig)

    errores = MetaF()
    sys.stderr = errores

    m = Menu(user, passwd)
    m.mostrar()

    if not errores.vacio():
        print "Detectado errores en segundo plano durante la ejecución."
        enviar_correo('Errores en segundo plano. La stderr contiene:\n%s'
                % (errores), m.get_usuario())
Example #2
0
    def acerca_de(self):
        """
        Calcado de menu.py. Modificado ligeramente para hacerlo funcionar aquí.
        """
        from formularios.menu import __version__
        from utils.ui import launch_browser_mailer
        from framework.configuracion import ConfigConexion

        gtk.about_dialog_set_email_hook(launch_browser_mailer, 'email')
        gtk.about_dialog_set_url_hook(launch_browser_mailer, 'web')
        vacerca = gtk.AboutDialog()
        vacerca.set_name('CICAN')
        vacerca.set_version(__version__)
        vacerca.set_comments('Software de gestión del Centro de Investigadión de Carreteras de ANdalucía')
        vacerca.set_authors(
            ['Francisco José Rodríguez Bogado <*****@*****.**>', 
             'Algunas partes del código por: Diego Muñoz Escalante <*****@*****.**>'])
        config = ConfigConexion()
        logo = gtk.gdk.pixbuf_new_from_file(
            os.path.join('imagenes', config.get_logo()))
        vacerca.set_logo(logo)
        fichero_licencia = os.path.join(
                            os.path.dirname(__file__), "..", 'COPYING')
        try:
            content_licencia = open(fichero_licencia).read()
        except IOError:
            content_licencia = open("COPYING").read()
        vacerca.set_license(content_licencia)
        vacerca.set_website('http://informatica.novaweb.es')
        vacerca.set_artists(['Iconos gartoon por Kuswanto (a.k.a. Zeus) <*****@*****.**>'])
        vacerca.set_copyright('Copyright 2009-2010  Francisco José Rodríguez Bogado.')
        vacerca.run()
        vacerca.destroy()
Example #3
0
File: menu.py Project: Virako/fpinn
 def mostrar(self):
     self.ventana.show_all()
     self.ventana.connect('destroy', gtk.main_quit)
     config = ConfigConexion()
     if config.get_kiosco():
         self.ventana.fullscreen()
     gtk.main()
Example #4
0
File: menu.py Project: Virako/fpinn
 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()
     self.__gm = gestor_mensajes.GestorMensajes(self.usuario)
     config = ConfigConexion()
     if config.get_kiosco():
         os.system("openbox --replace &")
     self.construir_ventana()
     utils.escribir_barra_estado(self.statusbar, 
                                 "Menú iniciado", 
                                 self.logger, 
                                 self.usuario.usuario)
Example #5
0
 def acerca_de(self):
     gtk.about_dialog_set_email_hook(self.launch_browser_mailer, 'email')
     gtk.about_dialog_set_url_hook(self.launch_browser_mailer, 'web')
     vacerca = gtk.AboutDialog()
     vacerca.set_name('Geotex-INN')
     vacerca.set_version(__version__)
     vacerca.set_comments('Software ERP para Geotexan')
     vacerca.set_authors(['Francisco José Rodríguez Bogado '
                          '<*****@*****.**>',
                          'Diego Muñoz Escalante <*****@*****.**>'])
     config = ConfigConexion()
     logo = gtk.gdk.pixbuf_new_from_file(os.path.join(
             os.path.dirname(os.path.realpath(__file__)),
             '..', 'imagenes', config.get_logo()))
     logo = escalar_a(300, 200, logo)
     vacerca.set_logo(logo)
     vacerca.set_license(open(os.path.join(
             os.path.dirname(os.path.realpath(__file__)),
             '..', 'gpl.txt')).read())
     vacerca.set_website('http://ginn.sf.net')
     vacerca.set_artists(['Iconos gartoon por Kuswanto (a.k.a. Zeus) '
                          '<*****@*****.**>'])
     vacerca.set_copyright('Copyright 2005-2014  Francisco José Rodríguez'
                           ' Bogado, Diego Muñoz Escalante.')
     vacerca.run()
     vacerca.destroy()
Example #6
0
File: menu.py Project: Virako/fpinn
    def construir_ventana(self):
        self.statusbar = gtk.Statusbar()
        self.ventana = gtk.Window()
        self.ventana.set_position(gtk.WIN_POS_CENTER)
        self.ventana.resize(800, 600)
        self.ventana.set_title('Menú principal')
        ruta_logo = os.path.join("imagenes", 'logo.xpm')
        self.ventana.set_icon(gtk.gdk.pixbuf_new_from_file(ruta_logo))
        self.ventana.set_border_width(10)
        self.ventana.connect("delete_event", self.salir, True, self.ventana)
        self.caja = gtk.VBox()
        self.caja.set_spacing(5)
        self.ventana.add(self.caja)
        self.cabecera = gtk.HBox()
        imagen = gtk.Image()
        config = ConfigConexion()
        pixbuf_logo = gtk.gdk.pixbuf_new_from_file(
            os.path.join('imagenes', config.get_logo()))
        pixbuf_logo = escalar_a(300, 200, pixbuf_logo)
        imagen.set_from_pixbuf(pixbuf_logo)
        self.cabecera.pack_start(imagen, fill=True, expand=False)
        texto = gtk.Label("""
        <big><big><big><b>%s</b></big>        

        <u>Menú de acceso a módulos de la aplicación</u></big>        

        <i>v.%s</i></big>        
        """ % (config.get_title(), _VERSION))
        texto.set_justify(gtk.JUSTIFY_CENTER)
        texto.set_use_markup(True)
        event_box = gtk.EventBox()
            # Porque el gtk.Label no permite cambiar el background.
        event_box.add(texto)
        # CWT: Ahora que le quite el fondo rojo...
        #event_box.modify_bg(gtk.STATE_NORMAL, 
        #                    event_box.get_colormap().alloc_color("#c00000"))
        #texto.modify_fg(gtk.STATE_NORMAL, 
        #                event_box.get_colormap().alloc_color("#ffffff"))
        self.cabecera.pack_start(event_box)
        b_salir = gtk.Button(stock = gtk.STOCK_QUIT)
        b_salir.connect("clicked", lambda boton: self.salir(boton,\
                ventana=self.ventana, mostrar_ventana=True))
        boxsalir = gtk.VBox()
        boxsalir.pack_end(gtk.VBox(), expand = True)
        boxsalir.pack_end(b_salir, expand = False, fill = True)
        boxsalir.pack_end(gtk.VBox(), expand = True)
        self.cabecera.pack_start(boxsalir, fill=False)
        self.caja.pack_start(self.cabecera, fill=True, expand=False)
        self.current_frame = None
        cuerpo_central = self.create_menu()
        self.caja.pack_start(cuerpo_central)
        self.caja.pack_start(self.statusbar, False, True)
Example #7
0
def parse_options():
    """
    Instancia las opciones de arranque (parámetros de línea de comando) para 
    la ventana de la clase invocadora.
    """
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option("-u", "--usuario", dest = "usuario",
                      help = _("Nombre o identificador del usuario"))
    parser.add_option("-d", "--debug", dest = "debug", 
                      action="store_true", 
                      help = _("Activar información de depuración"))
    parser.add_option("-p", "--puid", dest = "puid", 
                      help = _("Identificador de pclases (puid) "
                               "del objeto a mostrar en ventana inicialmente"))
    parser.add_option("-c", "--config", 
                      dest = "fichconfig", 
                      help = _("Usa una configuración alternativa "
                               "almacenada en FICHERO"), 
                      metavar = "FICHERO")
    parser.add_option("-v", "--verbose", dest = "verbose", 
                      action = "store_true", 
                      help = _("Activar el modo verboso"))
    (options, args) = parser.parse_args()
    params = []
    opt_params = {}
    if len(args) != 0:
        params = args[0]
    # FIXME: Como pclases se importa en ventana_generica y en cualquier otra 
    # ventana (a excepción del menú) antes de poder parsear la opción "-c", no 
    # hay manera -inmediata, se entiende, sin reescribir mucho- de usar una 
    # configuración alternativa que no sea la que está en ginn.conf :(
    fconfig = options.fichconfig
    if fconfig:
        config = ConfigConexion()
        config.set_file(fconfig)
        config.DEBUG = options.debug
        config.VERBOSE = options.verbose
    # Como no se puede cambiar al vuelo la conexión a la BD, el cambio del 
    # fichero de configuración hay que hacerlo ANTES de "cargar" pclases.
    from framework import pclases
    pclases.DEBUG = options.debug
    pclases.VERBOSE = options.verbose
    if options.usuario:
        opt_params["usuario"] = options.usuario
    if options.puid:
        puid = options.puid
        objeto = pclases.getObjetoPUID(puid)
        opt_params["objeto"] = objeto
    return params, opt_params
Example #8
0
def main():
    fconfig = None
    user = None
    passwd = None
    if len(sys.argv) > 1:
        from optparse import OptionParser
        usage = _("uso: %prog [opciones] usuario contraseña")
        parser = OptionParser()#usage = usage)
        parser.add_option("-c", "--config", 
                          dest = "fichconfig", 
                          help = _("Usa una configuración alternativa "
                                   "almacenada en FICHERO"), 
                          metavar = "FICHERO")
        (options, args) = parser.parse_args()
        fconfig = options.fichconfig
        if len(args) >= 1:
            user = args[0]
        if len(args) >= 2:
            passwd = args[1]
        # HACK
        if fconfig:
            config = ConfigConexion()
            config.set_file(fconfig)
            print "Usando configuración de {0}".format(fconfig)
        # Lo hago así porque en todos sitios se llama al constructor sin 
        # parámetros, y quiero instanciar al singleton por primera vez aquí. 
        # Después pongo la configuración correcta en el archivo y en sucesivas 
        # llamadas al constructor va a devolver el objeto que acabo de crear y 
        # con la configuración que le acabo de asignar. En caso de no recibir 
        # fichero de configuración, la siguiente llamada al constructor será 
        # la que cree el objeto y establezca la configuración del programa. 
        # OJO: Dos llamadas al constructor con parámetros diferentes crean 
        # objetos diferentes.
    #salida = MetaF()
    #sys.stdout = salida
    errores = MetaF()
    sys.stderr = errores

    m = Menu(user, passwd)
    m.mostrar()

    if 0:   # TODO: FIXME: XXX: ¡Quitar cuando arregle/funcione el bugreport!
    # if not errores.vacio():
        print >> sys.stderr, _("Se han detectado algunos errores en "
                               "segundo plano durante la ejecución.")
        enviar_correo(_('Errores en segundo plano. La stderr contiene:\n%s') 
                        % (errores), 
                      m.get_usuario())
Example #9
0
 def lanzar_ventana(self, archivo):
     """
     EXPERIMENTAL
     """
     from subprocess import Popen
     usuario = self.get_usuario()
     if os.path.basename(os.path.abspath(os.curdir)) == "formularios":
         ruta = os.path.abspath(os.path.join(".", archivo+".py"))
     else:
         ruta = os.path.abspath(
                 os.path.join(".", "formularios", archivo+".py"))
     pclases = import_pclases()
     if pclases.DEBUG:
         print _("Lanzando..."), ruta,
         print _("¿Existe?"), os.path.exists(ruta)
     # FIXME: Esto no funciona en el W2003 Server de CICAN. Dice que...
     # WindowsError: [Error 193] %1 no es una aplicación Win32 válida.
     # Creo que es porque sin ponerle un "start" delante ni nada a la ruta, 
     # no sabe con qué abrirlo. Es como si desde el cmd escribiera algo.txt.
     # No se ejecuta. Necesita ponerse delante el nombre del programa que 
     # abre el archivo o usar "start" para que lo haga con el 
     # predeterminado. Otra opción sería usar el multi-open. Investigaré.
     # Con el "start" tampoco tira. Da un error (2, blahblahblah...)
     if os.name == "nt":
         bin_params = ["start {0}".format(ruta)]
     else:
         bin_params = [ruta]
     if usuario:
         idusuario = usuario.id
         bin_params.append("--usuario=%s" % idusuario)
     config = ConfigConexion()
     fconfig = config.get_file()
     if fconfig:
         bin_params.append("--config=%s" % fconfig)
         #fconfig_original = replace_fconfig(fconfig)   # TODO: FIXME: Ver 
         # el comentario de dos líneas más abajo.
     Popen(bin_params)
     if fconfig:
         # TODO: FIXME: No restaura el contenido original. ¿Tal vez lo 
         # hago demasiado rápido? ¿Debería sincronizarme con señales? ¿Y 
         # qué pasa con las máquinas windows donde ni el fork ni las 
         # señales funcionan en condiciones? Y si lo hago nada más lanzar 
         # el menú y restauro al salir, ¿qué pasa si se me cuelga y tengo 
         # que cerrar a capón? Me quedo sin el original. Merde.
         #restore_fconfig(fconfig_original)
         pass
Example #10
0
File: menu.py Project: Virako/fpinn
 def acerca_de(self):
     gtk.about_dialog_set_email_hook(self.launch_browser_mailer, 'email')
     gtk.about_dialog_set_url_hook(self.launch_browser_mailer, 'web')
     vacerca = gtk.AboutDialog()
     vacerca.set_name('FP-INN')
     vacerca.set_version(_VERSION)
     vacerca.set_comments('Software de gestión para FresParaíso')
     vacerca.set_authors(['Francisco José Rodríguez Bogado <*****@*****.**>', 'Diego Muñoz Escalante <*****@*****.**>'])
     config = ConfigConexion()
     logo = gtk.gdk.pixbuf_new_from_file(os.path.join('imagenes', config.get_logo()))
     vacerca.set_logo(logo)
     vacerca.set_license(open(os.path.join('gpl.txt')).read())
     vacerca.set_website('http://fpinn.sf.net')
     vacerca.set_artists(['Iconos gartoon por Kuswanto (a.k.a. Zeus) <*****@*****.**>'])
     vacerca.set_copyright('Copyright 2005-2008  Francisco José Rodríguez Bogado.')
     vacerca.run()
     vacerca.destroy()
Example #11
0
File: menu.py Project: Virako/fpinn
def apagar_equipo():
    """
    CWT: Apaga el ordenador con el comando de Gnome gnome-power-cmd.
    """
    config = ConfigConexion()
    if config.get_kiosco():
        print "Apagando desde menú de FPINN..."
        # Comentar/descomentar la siguiente línea para pruebas/producción:
        os.system("#gnome-power-cmd.sh shutdown")
        # También puede valer algo como esto:
        # gnome-session-save --kill --gui
        # Si gnome-session no está ejecutado, usar esto, pero antes en sudoers:
        # %users ALL=NOPASSWD: /sbin/halt
        # %wheel ALL=(ALL) SETENV: ALL
        # Si el sistema no usa Gnome, descomentar/comentar la siguiente línea 
        # en pruebas/producción para el apagado del equipo en modo kiosco.
        #os.system("xterm -e sudo halt")
        # PASO chmod +s a halt y shutdown y a puirla:
        os.system("shutdown -h now")
Example #12
0
    def construir_ventana(self):
        self.statusbar = gtk.Statusbar()
        self.ventana = gtk.Window()
        self.ventana.set_position(gtk.WIN_POS_CENTER)
        self.ventana.resize(800, 600)
        self.ventana.set_title(
            _('CICAN - Menú principal'))
        ruta_logo = os.path.join("imagenes", 'logo.xpm')
        self.ventana.set_icon(gtk.gdk.pixbuf_new_from_file(ruta_logo))
        self.ventana.set_border_width(10)
        self.ventana.connect("delete_event", self.salir, True, self.ventana)
        self.caja = gtk.VBox()
        self.caja.set_spacing(5)
        self.ventana.add(self.caja)
        self.cabecera = gtk.HBox()
        imagen = gtk.Image()
        config = ConfigConexion()
        pixbuf_logo = gtk.gdk.pixbuf_new_from_file(
            os.path.join('imagenes', config.get_logo()))
        pixbuf_logo = escalar_a(300, 200, pixbuf_logo)
        imagen.set_from_pixbuf(pixbuf_logo)
        self.cabecera.pack_start(imagen, fill=True, expand=False)
        texto = gtk.Label("""
        <big><big><big><b>%s</b></big>        

        <u>Menú de acceso a módulos de la aplicación</u></big>        

        <i>v.%s</i></big>        
        """ % (config.get_title(), __version__))
        texto.set_justify(gtk.JUSTIFY_CENTER)
        texto.set_use_markup(True)
        event_box = gtk.EventBox()
            # Porque el gtk.Label no permite cambiar el background.
        event_box.add(texto)
        event_box.modify_bg(gtk.STATE_NORMAL, 
                            event_box.get_colormap().alloc_color("white"))
        self.cabecera.pack_start(event_box)
        self.caja.pack_start(self.cabecera, fill=True, expand=False)
        self.current_frame = None
        cuerpo_central = self.create_menu()
        self.caja.pack_start(cuerpo_central)
        self.caja.pack_start(self.statusbar, False, True)
Example #13
0
    def __init__(self, objeto = None, usuario = None):
        config = ConfigConexion()
        self.CONFIG = {'host': config.get_host(), 'port': 22222, # Parámetros XMLRPC
                       'user': '******', 'password': '******', 'dir_destino': '/tmp'}  #Parámetros SCP
#        self.CONFIG = {'host': '192.168.1.100', 'port': 22222, # Parámetros XMLRPC
#                       'user': '******', 'password': '******', 'dir_destino': '/tmp'}  #Parámetros SCP

##############################################################################################################
##### You, lamer. This is for you. Read carefully:                                                       #####
##### Don't try to crack this login. See? 192.168.1.100 It's a LAN! Behind a firewall and                #####
##### without extern connections. Don't waste your time. Neither my bandwidth. IT ISN'T MY HOME MACHINE! #####
##############################################################################################################

        self.seguir = True
        Ventana.__init__(self, 'importar_logic.glade', objeto, usuario = usuario)
        connections = {'b_salir/clicked': self.salir,
                       'b_abrir/clicked': self.abrir,
                       'b_abrir_cuentas/clicked': self.abrir_cuentas,
                       'ch_mismo/toggled': self.usar_mismo,
                       'b_procesar/clicked': self.procesar}
        self.add_connections(connections)
        gtk.main()
Example #14
0
def pruebas_periodicas():
    from framework.configuracion import ConfigConexion
    from framework import tests_coherencia as tests

    tasks = [{"nombre": "Cantidades de caché son correctas.", 
              "func": tests.comprobar_caches, 
              "params": []}, 
             {"nombre": "Fibra consumida antes de fecha de fabricación.", 
              "func": tests.comprobar_fibra_consumida_antes_de_fecha_de_fabricacion, 
              "params": [True, ARTICULOS_A_IGNORAR]}, 
             {"nombre": "Artículos vendidos antes de su fecha de fabricación.", 
              "func": tests.comprobar_articulos_vendidos_antes_de_fecha_de_fabricacion, 
              "params": [True, ARTICULOS_A_IGNORAR]}, 
             {"nombre": "Fibra en partida de carga y albarán de salida a la vez.", 
              "func": tests.comprobar_fibra_en_partida_de_carga_y_albaran_de_salida_a_la_vez, 
              "params": [True, ARTICULOS_A_IGNORAR]}, 
             {"nombre": "Artículos con albarán de salida y en líneas de devolución con albarán de entrada de abono a la vez.", 
              "func": tests.comprobar_articulos_con_albaran_salida_y_albaran_abono, 
              "params": [True, ARTICULOS_A_IGNORAR]}, 
             {"nombre": "Objetos artículo sin bala, rollo, bigbag, balaCable o rolloDefectuoso; con más de uno, o apuntados por más de un registro artículo.", 
              "func": tests.comprobar_articulos_con_enlaces_incorrectos, 
              "params": []}, 
             {"nombre": "Cantidades en líneas de venta coinciden con artículos en albarán.", 
              "func": tests.comprobar_cantidades_albaran, 
              "params": []}, 
             {"nombre": "Partes de producción no solapados.", 
              "func": tests.comprobar_partes_solapados, 
              "params": [True, PARTES_A_IGNORAR]}, 
             {"nombre": "Partes de producción consecutivos sin huecos.", 
              "func": tests.comprobar_huecos_partes, 
              "params": [True, PARTES_A_IGNORAR]}, 
             {"nombre": 'Coherencia entre fecha y horas con "fechahoras" en partes de producción.', 
              "func": tests.comprobar_coherencia_fecha_y_fechahoras_partes, 
              "params": [True]}, 
             {"nombre": "Sumatorio de duración de incidencias no supera duración de su parte de producción.", 
              "func": tests.comprobar_duracion_incidencias, 
              "params": [True]}, 
             {"nombre": "Horas trabajadas de empleados no supera duración de su parte de producción.", 
              "func": tests.comprobar_horas_trabajadas_en_partes, 
              "params": []}, 
             {"nombre": "Empleados en un único parte de producción a la misma hora o bien horas trabajadas menor o igual que duración total de horas no simultáneas.", 
              "func": tests.comprobar_partes_simultaneos_empleados, 
              "params": []}, 
             {"nombre": "Partidas de geotextiles con un único producto fabricado.", 
              "func": tests.comprobar_partidas_con_mas_de_un_producto, 
              "params": []}, 
             {"nombre": "Partidas de carga con producción pero sin fibra relacionada, o con carga pero sin producción, sin estar entre las últimas.", 
              "func": tests.comprobar_partidas_de_carga_sin_fibra_o_sin_produccion, 
              "params": []}, 
             {"nombre": "Suma de consumos de fibra entre fechas coincide con consumos por día entre mismas fechas.", 
              "func": tests.comprobar_consumos_entre_fechas, 
              "params": []}, 
             {"nombre": "Fecha partida carga menor o igual que fecha de inicio de producción y mayor que fecha fabricación de sus balas.", 
              "func": tests.comprobar_fecha_partidas_carga, 
              "params": []}, 
             {"nombre": "Partes de fibra con consumos de granza inferiores a producción.", 
              "func": tests.comprobar_consumos_granza, 
              "params": [True, PARTES_A_IGNORAR]}, 
             {"nombre": 'Artículos con "fechahora" fuera de las "fechahoras" de su parte de producción.', 
              "func": tests.comprobar_fechahora_de_articulos, 
              "params": [True]}, 
             {"nombre": "Balas en albaranes internos sin partida de carga y balas en partidas de carga sin albaranes internos.", 
              "func": tests.comprobar_balas_en_albaranes_internos_sin_partidacarga, 
              "params": [False, mx.DateTime.DateTimeFrom(2007, 1, 1)]}, 
             {"nombre": "Códigos de balas [cable], rollos [defectuoso] y bigbags coinciden con número.", 
              "func": tests.comprobar_codificacion_articulos, 
              "params": [True]}, 
             {"nombre": "Numeración de balas [cable], rollos [defectuosos] y bigbags es consecutiva.", 
              "func": tests.comprobar_numeracion_articulos, 
              "params": [True, ARTICULOS_A_IGNORAR]}, 
             {"nombre": "Albaranes internos de consumo solo contienen balas o productos de compra.", 
              "func": tests.comprobar_albaranes_internos, 
              "params": [True, ALBARANES_A_IGNORAR]}, 
             {"nombre": "Todos los pedidos, albaranes y facturas de compra y venta tienen cliente/proveedor.", 
              "func": tests.comprobar_clientes_proveedores_en_pedidos_albaranes_facturas, 
              "params": [True, 
                         IGNORADOS_SIN_PROVEEDOR_O_CLIENTE]}, 
             {"nombre": "Producción estándar de partes coinciden con producción estándar de productos.", 
              "func": tests.comprobar_producciones_estandar, 
              "params": [True, PARTES_A_IGNORAR]}, 
             {"nombre": "Existencias en silos coincide con existencias de productos.", 
              "func": tests.comprobar_existencias_silos, 
              "params": [True]}, 
             {"nombre": "Códigos de productos de compra únicos.", 
              "func": tests.comprobar_codigos_unicos_en_productos_compra, 
              "params": [True]},
             {"nombre": "Mismo cliente en pedidos, albaranes y facturas relacionadas.", 
              "func": tests.comprobar_mismo_cliente_pedidos_albaranes_facturas, 
              "params": [True, 
                         PEDIDOS_ALBARANES_Y_FACTURAS_A_IGNORAR_MISMO_C_O_P]},
             {"nombre": "Todos los números de tickets, {pedidos, albaranes,} y facturas son consecutivos.", 
              "func": tests.comprobar_saltos_facturas_albaranes_pedidos_y_tickets, 
              "params": [True, True, False, False, True, TICKETS_A_IGNORAR]},  
             {"nombre": "Todos los objetos artículo y sus correspondientes\nrollos, balas, etc. están emparejados", 
              "func": tests.comprobar_pares_articulos, 
              "params": []},  
             {"nombre": "Albaranes de salida y entrada tienen almacén origen y destino respectivamente", 
              "func": tests.comprobar_almacenes_albaranes, 
              "params": []},  
             {"nombre": "Balas en partidas de carga no deben tener almacén asignado", 
              "func": tests.comprobar_almacen_partidas_carga, 
              "params": []} 
            ]
    chkwin = ChecklistWindow(tasks, "PRUEBAS PERIÓDICAS DE COHERENCIA DE DATOS")
    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())
    chkwin.set_texto_estado("Conectado a %s." % (info_conexion))
    chkwin.main()
Example #15
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)
Example #16
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')
     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)
Example #17
0
    def construir_ventana(self):
        self.statusbar = gtk.Statusbar()
        self.ventana = gtk.Window()
        self.ventana.set_position(gtk.WIN_POS_CENTER)
        self.ventana.resize(800, 600)
        self.ventana.set_title('Menú GINN')
        self.ventana.set_icon(gtk.gdk.pixbuf_new_from_file(
            os.path.join(os.path.dirname(os.path.realpath(__file__)),
                         "..", "imagenes", 'logo_w.xpm')))
        self.ventana.set_border_width(10)
        self.ventana.connect("delete_event", self.salir, True, self.ventana)
        self.caja = gtk.VBox()
        self.caja.set_spacing(5)
        self.ventana.add(self.caja)
        self.cabecera = gtk.HBox()
        imagen = gtk.Image()
        config = ConfigConexion()
        pixbuf_logo = gtk.gdk.pixbuf_new_from_file(
            os.path.join(os.path.dirname(os.path.realpath(__file__)),
                         '..', 'imagenes', config.get_logo()))
        pixbuf_logo = escalar_a(300, 200, pixbuf_logo)
        imagen.set_from_pixbuf(pixbuf_logo)
        self.cabecera.pack_start(imagen, fill=True, expand=False)
        texto = gtk.Label("""
        <big><big><big><b>%s</b></big>

        <u>Menú de acceso a módulos de la aplicación</u></big>

        <i>v.%s</i></big>
        <small><b>%s</b> en <b>%s</b></small>
        """ % (config.get_title(), __version__, config.get_dbname(),
               config.get_host()))
        texto.set_justify(gtk.JUSTIFY_CENTER)
        texto.set_use_markup(True)
        event_box = gtk.EventBox()
            # Porque el gtk.Label no permite cambiar el background.
        event_box.add(texto)
        event_box.modify_bg(gtk.STATE_NORMAL,
                            event_box.get_colormap().alloc_color("white"))
        half_header = gtk.VBox()
        half_header.add(event_box)
        txtchangelog = read_changelog()
        if txtchangelog:
            marquee_changelog = custom_widgets.MarqueeLabel(
                    txtchangelog, init_long = 61)
            little_label = gtk.Label(
                    "<small><i>Últimas actualizaciones:</i></small>")
            little_label.set_use_markup(True)
            little_label.set_property("xalign", 0.1)
            half_header.add(little_label)
            marquee_changelog_event = gtk.EventBox()
            marquee_changelog_event.add(marquee_changelog)
            half_header.add(marquee_changelog_event)
            def reset(*args, **kw):
                marquee_changelog.rewind()
            marquee_changelog_event.connect("button-press-event", reset)
        self.cabecera.pack_start(half_header)
        self.caja.pack_start(self.cabecera, fill=True, expand=False)
        self.current_frame = None
        cuerpo_central = self.create_menu()
        self.caja.pack_start(cuerpo_central)
        self.caja.pack_start(self.statusbar, False, True)