def acerca_de(self): """ Calcado de menu.py. Modificado ligeramente para hacerlo funcionar aquí. """ vacerca = gtk.AboutDialog() vacerca.set_name('Geotex-INN') from menu import __version__ vacerca.set_version(__version__) vacerca.set_name('BB-INN') vacerca.set_version(__version__) vacerca.set_comments('Software de gestión para BitBlue') vacerca.set_authors(['Francisco José Rodríguez Bogado ' '<*****@*****.**>']) config = ConfigConexion() logo = gtk.gdk.pixbuf_new_from_file( os.path.join('..', 'imagenes', config.get_logo())) logo = escalar_a(300, 200, logo) vacerca.set_logo(logo) vacerca.set_license(open(os.path.join('..', 'gpl.txt')).read()) vacerca.set_website('https://github.com/pacoqueen/bbinn') vacerca.set_artists(['Iconos gartoon por Kuswanto (a.k.a. Zeus) ' '<*****@*****.**>']) vacerca.set_copyright('Copyright 2005-2012 Francisco José Rodríguez' ' Bogado, Diego Muñoz Escalante.') vacerca.run() vacerca.destroy()
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('Universal Pilates') vacerca.set_version(__version__) vacerca.set_comments('Software para Universal Pilates Vitality Studio') 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) vacerca.set_license(open(os.path.join('..', 'gpl.txt')).read()) 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()
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( 'Universal Pilates Vitality Studio - Menú principal') self.ventana.set_icon(gtk.gdk.pixbuf_new_from_file('logo.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('..', '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)
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('BB-INN') vacerca.set_version(__version__) vacerca.set_comments('Software de gestión para BitBlue') vacerca.set_authors(['Francisco José Rodríguez Bogado ' '<*****@*****.**>']) config = ConfigConexion() logo = gtk.gdk.pixbuf_new_from_file( os.path.join('..', 'imagenes', config.get_logo())) logo = escalar_a(300, 200, logo) vacerca.set_logo(logo) vacerca.set_license(open(os.path.join('..', 'gpl.txt')).read()) vacerca.set_website('https://github.com/pacoqueen/bbinn') vacerca.set_artists(['Iconos gartoon por Kuswanto (a.k.a. Zeus) ' '<*****@*****.**>']) vacerca.set_copyright('Copyright 2005-2012 Francisco José Rodríguez' ' Bogado, Diego Muñoz Escalante.') vacerca.run() vacerca.destroy()
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) 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()
import notificacion except: sys.path.append('.') import notificacion import threading#, psycopg from select import select from configuracion import ConfigConexion #import mx, mx.DateTime import datetime # GET FUN ! config = ConfigConexion() #conn = '%s://%s:%s@%s/%s' % (config.get_tipobd(), # config.get_user(), # config.get_pass(), # config.get_host(), # config.get_dbname()) # HACK: No reconoce el puerto en el URI y lo toma como parte del host. Lo # añado detrás y colará en el dsn cuando lo parsee. if config.get_tipobd() == "sqlite": # OJO: No soportado completamente por el momento. ruta_bdsqlite = os.path.join("..", "db", config.get_dbname()) ruta_bdsqlite = os.path.abspath(ruta_bdsqlite) conn = "%s://%s" % (config.get_tipobd(), ruta_bdsqlite)
def main(): # Si hay ficheros de estilo gtk, los cargo por orden: General de la # aplicación y específico del usuario en WIN y UNIX. Se machacan opciones # de por ese orden. GTKRC = "gtkrc" gtk.rc_parse(os.path.join("..", GTKRC)) if "HOME" in os.environ: gtk.rc_parse(os.path.join(os.environ["HOME"], GTKRC)) if "HOMEPATH" in os.environ: gtk.rc_parse(os.path.join(os.environ["HOMEPATH"], GTKRC)) # Ver http://www.pygtk.org/docs/pygtk/class-gtkrcstyle.html para la # referencia de estilos. Ejemplo: # bogado@cpus006:~/Geotexan/geotexinn02/formularios$ cat ../gtkrc # style 'blanco_y_negro' { bg[NORMAL] = '#FFFFFF' # fg[NORMAL] = '#000000' # base[NORMAL] = '#FFFFFF' # text[NORMAL] = '#000000' # } # class '*' style 'blanco_y_negro' ## 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) # 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 not errores.vacio(): print "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())
def pruebas_periodicas(): path_framework = os.path.join("..", "framework") if path_framework not in sys.path: sys.path.append(path_framework) from configuracion import ConfigConexion import 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()
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] 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() 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) 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)
from sqlobject import * import threading, datetime from select import select from configuracion import ConfigConexion import notificacion try: import utils except ImportError: if os.path.realpath(os.path.curdir).split(os.path.sep)[-1] == "utils": sys.path.append("..") root, dirs, files = os.walk(".").next() if "utils" in dirs: sys.path.insert(0, ".") config = ConfigConexion() # HACK: No reconoce el puerto en el URI y lo toma como parte del host. Lo # añado detrás y colará en el dsn cuando lo parsee. conn = '%s://%s:%s@%s/%s port=%s' % (config.get_tipobd(), config.get_user(), config.get_pass(), config.get_host(), config.get_dbname(), config.get_puerto()) sqlhub.processConnection = connectionForURI(conn) # HACK: # Hago todas las consultas case-insensitive machacando la función de # sqlbuilder: