コード例 #1
0
ファイル: silos.py プロジェクト: pacoqueen/bbinn
 def nuevo(self, widget):
     """
     Función callback del botón b_nuevo.
     Pide los datos básicos para crear un nuevo objeto.
     Una vez insertado en la BD hay que hacerlo activo
     en la ventana para que puedan ser editados el resto
     de campos que no se hayan pedido aquí.
     """
     silo = self.objeto
     nombre = utils.dialogo_entrada('Introduzca el nombre del silo:', 'NOMBRE', padre = self.wids['ventana'])
     if nombre != None:
         capacidad = utils.dialogo_entrada(titulo = "CAPACIDAD", 
                                           texto = "Introduzca la capacidad del silo:",
                                           padre = self.wids['ventana'])
         try:
             capacidad = float(capacidad)
         except:
             utils.dialogo_info(titulo = "VALOR INCORRECTO",
                                texto = "El valor %s no es correcto. Inténtelo de nuevo.\nAsegúrese de no introducir unidades.", 
                                padre = self.wids['ventana'])
             return
         observaciones = utils.dialogo_entrada(titulo = "OBSERVACIONES", 
                                               texto = "Introduzca observaciones si lo desea:", 
                                               padre = self.wids['ventana'])
         if observaciones != None:
             silo = pclases.Silo(nombre = nombre,
                                 capacidad = capacidad, 
                                 observaciones = observaciones)
             self.rellenar_widgets()
コード例 #2
0
 def add_campoesp(self, w):
     campo = utils.dialogo_entrada('Introduzca nombre del campo:', 'NOMBRE', padre = self.wids['ventana'])
     if campo:
         valor = utils.dialogo_entrada('Introduzca valor del campo:', 'VALOR', padre = self.wids['ventana'])
         if valor:
             producto = self.objeto
             ce = pclases.CamposEspecificos(productoVenta = producto,
                                          nombre = campo,
                                          valor = valor)
             self.mostrar_especificos()
コード例 #3
0
 def elegir_o_crear_obra(self):
     """
     Crea una nueva obra relacionada con la factura de venta de la ventana.
     """
     obras = pclases.Obra.select(orderBy = "nombre")
     obras = [o for o in obras 
              if self.objeto.cliente in o.clientes]
     idobra = utils.dialogo_combo(titulo = "SELECCIONE OBRA", 
         texto = "Es necesario relacionar una obra con la factura."\
                 "\nSeleccione una del desplegable inferior o cree una "\
                 "nueva", 
         padre = self.wids['ventana'], 
         ops = [(0, "Crear una obra nueva")] + [(o.id, o.nombre) 
                                                 for o in obras]) 
     if idobra == 0:
         nombre = utils.dialogo_entrada(titulo = "NOMBRE DE OBRA", 
             texto = "Introduzca el nombre de la obra:", 
             padre = self.wids['ventana'])
         if not nombre:
             return None
         direccion = utils.dialogo_entrada(titulo = "DIRECCIÓN", 
             texto = "Introduzca la dirección de la obra:", 
             padre = self.wids['ventana'])
         if direccion == None:
             return None 
         ciudad = utils.dialogo_entrada(titulo = "CIUDAD", 
             texto = "Introduzca la ciudad:", 
             padre = self.wids['ventana'])
         if ciudad == None:
             return None
         cp = utils.dialogo_entrada(titulo = "CÓDIGO POSTAL", 
             texto = "Introduzca el código postal", 
             padre = self.wids['ventana'])
         if cp == None:
             return None
         provincia = utils.dialogo_entrada(titulo = "PROVINCIA", 
             texto = "Introduzca la provincia:", 
             padre = self.wids['ventana'])
         if provincia == None:
             return None
         # De fecha de inicio, fecha de fin de obra y observacione pasamos a 
         # este nivel. Eso se afina en la ventana de obras.
         obra = pclases.Obra(nombre = nombre, direccion = direccion, 
                 cp = cp, ciudad = ciudad, provincia = provincia, 
                 fechainicio = None, fechafin = None, 
                 observaciones = "Creada desde módulo CRM: detalles de "\
                                 "factura.", 
                 generica = False)
         obra.addCliente(self.objeto.cliente)
     elif idobra:
         obra = pclases.Obra.get(idobra)
     else:
         obra = None
     return obra
コード例 #4
0
 def add_campoesp(self, w):
     campo = utils.dialogo_entrada('Introduzca nombre del campo:', 'NOMBRE')
     if not campo:
         return
     valor = utils.dialogo_entrada('Introduzca valor del campo:', 'VALOR')
     if not valor:
         return
     producto = self.objeto
     ce = pclases.CamposEspecificos(productoVenta = producto,
                                    nombre = campo,
                                    valor = valor)
     self.mostrar_especificos()
コード例 #5
0
 def crear_nuevo_tipodematerialBala(self, widget):
     """
     Función callback del botón b_nuevo.
     Pide los datos básicos para crear un nuevo objeto.
     Una vez insertado en la BD hay que hacerlo activo
     en la ventana para que puedan ser editados el resto
     de campos que no se hayan pedido aquí.
     """
 	nuevotipo = utils.dialogo_entrada('Introduzca el nuevo tipo de material')
 	nuevocodigo = utils.dialogo_entrada('Introduzca el código asociado al material')
     if nuevotipo != None and nuevocodigo !=None :
         tipodematerialBala = pclases.TipoMaterialBala(descripcion = nuevotipo, codigo = nuevocodigo)
 	self.rellenar_tabla()
コード例 #6
0
ファイル: contadores.py プロジェクト: pacoqueen/upy
 def crear_nuevo_contador(self, widget):
     """
     Función callback del botón b_nuevo.
     Pide los datos básicos para crear un nuevo objeto.
     Una vez insertado en la BD hay que hacerlo activo
     en la ventana para que puedan ser editados el resto
     de campos que no se hayan pedido aquí.
     """
     prefijo = utils.dialogo_entrada('Introduzca el prefijo del nuevo contador')
     if prefijo != None:
         sufijo = utils.dialogo_entrada('Introduzca el sufijo del nuevo contador')
         if sufijo != None:
             contador = pclases.Contador(prefijo = prefijo, sufijo = sufijo, contador = 1)
             self.rellenar_tabla()
コード例 #7
0
ファイル: resultados_titulo.py プロジェクト: pacoqueen/bbinn
 def set_lote(self, w):
     numlote = utils.dialogo_entrada(titulo = 'Nº LOTE', 
                                     texto = 'Introduzca número de lote:',
                                     padre = self.wids['ventana'])
     if numlote != None:
         lotes = pclases.Lote.select(pclases.Lote.q.numlote.contains(numlote))
         if lotes.count() == 0:
             utils.dialogo_info(titulo = 'LOTE NO ENCONTRADO', 
                                texto = 'No se encontró ningún lote %s.' % numlote,
                                padre = self.wids['ventana'])
             return
         elif lotes.count() > 1:
             filas = [(l.id, l.numlote, l.codigo, l.tenacidad, l.elongacion, l.rizo, l.encogimiento) for l in lotes]
             idlote = utils.dialogo_resultado(filas, 
                                              titulo = 'SELECCIONE LOTE',
                                              cabeceras = ('ID', 'Número', 'Código', 'Tenacidad', 'Elongación', 'Rizo', 'Encogimiento'),
                                              padre = self.wids['ventana'])
             if idlote < 0:
                 return
             lote = pclases.Lote.get(idlote)
         else:
             lote = lotes[0]
         if len(lote.balas) == 0:
             utils.dialogo_info(titulo = 'LOTE VACÍO', 
                                texto = 'El lote no contiene balas, no puede\nrealizar pruebas sobre un lote vacío.',
                                padre = self.wids['ventana'])
             self.lote = None
             return
         self.lote = lote
         self.actualizar_ventana()
コード例 #8
0
 def nuevo_todo(self, idfras):
     texto = utils.dialogo_entrada(
         titulo="TEXTO TAREA", texto="Introduzca el texto de la tarea.", padre=self.wids["ventana"]
     )
     if texto:
         idcat = utils.dialogo_entrada_combo(
             titulo="SELECCIONE CATEGORÍA",
             texto="Selecciona una categoría del desplegable" " inferior:",
             padre=self.wids["ventana"],
             ops=[
                 (c.id, "%s (Pri.: %d)" % (c.descripcion, c.prioridad))
                 for c in pclases.Categoria.select(orderBy="prioridad")
             ],
         )
         if idcat and idcat[0] != None:
             for id in idfras:
                 tarea = pclases.Tarea(
                     facturaVentaID=id,
                     categoriaID=idcat[0],
                     texto=texto,
                     pendiente=True,
                     fechadone=None,
                     fecha=mx.DateTime.localtime(),
                 )
             self.buscar_todos()
コード例 #9
0
ファイル: recibos.py プロジェクト: pacoqueen/bbinn
 def buscar_cliente(self):
     """
     Busca un cliente y devuelve su ID o None.
     """
     idcliente = None
     a_buscar = utils.dialogo_entrada(titulo = "BUSCAR CLIENTE", texto = "Introduzca nombre o CIF del cliente:", padre = self.wids['ventana']) 
     if a_buscar != None:
         criterio = pclases.OR(pclases.Cliente.q.nombre.contains(a_buscar),
                               pclases.Cliente.q.cif.contains(a_buscar))
         resultados = pclases.Cliente.select(criterio) 
         if resultados.count() > 1:
             ## Refinar los resultados
             idcliente = self.refinar_resultados_busqueda_cliente(resultados)
             if idcliente == None:
                 return None
             resultados = [pclases.Cliente.get(idcliente)]
         elif resultados.count() < 1:
             ## Sin resultados de búsqueda
             utils.dialogo_info('SIN RESULTADOS', 
                                'La búsqueda no produjo resultados.\nPruebe a cambiar el texto buscado o déjelo en blanco para ver una lista completa.\n(Atención: Ver la lista completa puede resultar lento si el número de elementos es muy alto)', 
                                padre = self.wids['ventana'])
             return None
         ## Un único resultado
         idcliente = resultados[0].id
     return idcliente
コード例 #10
0
ファイル: grupos_alumnos.py プロジェクト: pacoqueen/upy
 def add_actividad(self, boton):
     texto = utils.dialogo_entrada(titulo = "NUEVA ACTIVIDAD", 
         texto = 
             "Introduzca la descripción de la nueva actividad deportiva:", 
         padre = self.wids['ventana'])
     if texto != None:
         opciones = [(e.id, e.nombre) 
                     for e in pclases.Evento.select(orderBy = "nombre")]
         opciones.insert(0, (0, "Sin evento relacionado"))
         idevento = utils.dialogo_combo(titulo = "SELECCIONE EVENTO:", 
             texto = "Seleccione un evento de la lista:", 
             ops = opciones, 
             padre = self.wids['ventana'], 
             valor_por_defecto = 0)
         if idevento != None:
             if idevento == 0:
                 evento = None
             else:
                 evento = pclases.Evento.get(idevento)
             actividad = pclases.Actividad(descripcion = texto, 
                             evento = evento, 
                             fechahoraInicio = datetime.datetime.today(),
                             fechahoraFin = datetime.datetime.today(),
                             grupoAlumnos = self.objeto)
             model = self.wids['tv_actividades'].get_model()
             model.append((actividad.descripcion, 
                           actividad.evento 
                             and actividad.evento.nombre or "", 
                           utils.str_fechahora(actividad.fechahoraInicio), 
                           utils.str_fechahora(actividad.fechahoraFin), 
                           actividad.get_puid()))
コード例 #11
0
 def set_partida(self, boton):
     """
     Hace activa una partida seleccionada para agregarle balas, imprimir su consumo, etc...
     """
     try:
         max_partida = pclases.PartidaCarga._connection.queryOne("SELECT MAX(numpartida) FROM partida_carga")[0]
         max_partida = "%d" % (max_partida + 1)
     except:
         max_partida = ""
     codigo = utils.dialogo_entrada(titulo = '¿NÚMERO DE PARTIDA?', 
                                    texto = 'Introduzca el número de partida de carga:', 
                                    padre = self.wids['ventana'], 
                                    valor_por_defecto = max_partida)
     if codigo == None:
         return 
     try:
         try:
             codigo = int(codigo.upper().replace("PC", ""))
             partida = pclases.PartidaCarga.select(pclases.PartidaCarga.q.numpartida == codigo)[0]
         except ValueError:
             partida = pclases.PartidaCarga.select(pclases.PartidaCarga.q.codigo == codigo)[0]
         self.objeto = partida
         self.actualizar_ventana()
     except TypeError:
         return
     except IndexError:
         codigo = `codigo`       # CHAPU
         if codigo.strip() != "" and utils.dialogo(titulo='¿CREAR PARTIDA?', 
                                                   texto='No se encontró la partida %s.\n¿Desea crear una nueva?' % (codigo), 
                                                   padre = self.wids['ventana']):
             self.nueva_partida(codigo)
コード例 #12
0
 def pedir_rango_balas(self):
     """
     Pide un rango de números de balas.
     Devuelve un generador de números
     de bala que comienza en el primero 
     del rango (o único, si solo se teclea uno)
     y acaba en el último del rango.
     """
     rango = utils.dialogo_entrada(titulo = 'INTRODUZCA RANGO',
                                   texto = 'Rango de números de bala o el código individual.\nEscriba el rango de códigos de la forma "xxxx-yyyy", ambos inclusive.\nO bien una lista de números separada por comas o espacios (xxxx, yyyy zzzz).',
                                   padre = self.wids['ventana'])
     articulos = []
     if rango == '' or rango == None:
         return rango
     try:
         if '-' in rango:
             ini, fin = rango.split('-')
             ini = int(ini)
             fin = int(fin)
             if fin < ini: 
                 ini, fin = fin, ini
         else:
             ini = int(rango)
             fin = ini
     except:
         utils.dialogo_info(titulo = 'CÓDIGO INCORRECTO', 
                            texto = 'Los códigos deben ser numéricos.\n\nVerifique que los ha escrito correctamente y que ha separado el rango con un guión.',
                            padre = self.wids['ventana'])
         return []
     return xrange(ini, fin+1)
コード例 #13
0
 def set_lote(self, w):
     numlote = utils.dialogo_entrada(titulo="Nº LOTE", texto="Introduzca número de lote:")
     if numlote != None:
         lotes = pclases.Lote.select(pclases.Lote.q.numlote.contains(numlote))
         if lotes.count() == 0:
             utils.dialogo_info(titulo="LOTE NO ENCONTRADO", texto="No se encontró ningún lote %s." % numlote)
             return
         elif lotes.count() > 1:
             filas = [(l.id, l.numlote, l.codigo, l.tenacidad, l.elongacion, l.rizo, l.encogimiento) for l in lotes]
             idlote = utils.dialogo_resultado(
                 filas,
                 titulo="SELECCIONE LOTE",
                 cabeceras=("ID", "Número", "Código", "Tenacidad", "Elongación", "Rizo", "Encogimiento"),
             )
             if idlote < 0:
                 return
             lote = pclases.Lote.get(idlote)
         else:
             lote = lotes[0]
         if len(lote.balas) == 0:
             utils.dialogo_info(
                 titulo="LOTE VACÍO",
                 texto="El lote no contiene balas, no puede\nrealizar pruebas sobre un lote vacío.",
             )
             self.lote = None
             return
         self.lote = lote
         self.actualizar_ventana()
コード例 #14
0
ファイル: ausencias.py プロジェクト: pacoqueen/bbinn
 def add_ausencia(self, b):
     fecha = utils.str_fecha(utils.mostrar_calendario(padre=self.wids["ventana"]))
     dia, mes, anno = map(int, fecha.split("/"))
     fecha = mx.DateTime.DateTimeFrom(day=dia, month=mes, year=anno)
     opciones = []
     for motivo in pclases.Motivo.select():
         opciones.append((motivo.id, "%s %s" % (motivo.descripcion, motivo.descripcionDias)))
     idmotivo = utils.dialogo_combo(
         titulo="¿MOTIVO?", texto="Seleccione motivo de ausencia", ops=opciones, padre=self.wids["ventana"]
     )
     if idmotivo != None:
         motivo = pclases.Motivo.get(idmotivo)
         defecto = "%d" % motivo.excedenciaMaxima
         duracion = utils.dialogo_entrada(
             titulo="DURACIÓN",
             texto="Introduzca la duración en días de la ausencia.",
             padre=self.wids["ventana"],
             valor_por_defecto=defecto,
         )
         try:
             duracion = int(duracion)
             for i in range(duracion):
                 ausencia = pclases.Ausencia(
                     empleado=self.objeto, fecha=fecha + (mx.DateTime.oneDay * i), motivo=motivo
                 )
             self.actualizar_ventana()
         except ValueError:
             utils.dialogo_info(
                 titulo="VALOR INCORRECTO",
                 texto="Debe teclear un número. Vuelva a intentarlo",
                 padre=self.wids["ventana"],
             )
コード例 #15
0
ファイル: categorias_laborales.py プロジェクト: pacoqueen/upy
 def buscar_categoria_laboral(self, widget):
     """
     Muestra una ventana de búsqueda y a continuación los
     resultados. El objeto seleccionado se hará activo
     en la ventana a no ser que se pulse en Cancelar en
     la ventana de resultados.
     """
     categoria_laboral = self.objeto
     objetobak = self.objeto
     a_buscar = utils.dialogo_entrada("Introduzca nombre o código del puesto.")
     if a_buscar != None:
         criterio = sqlobject.OR(pclases.CategoriaLaboral.q.codigo.contains(a_buscar),
                                 pclases.CategoriaLaboral.q.puesto.contains(a_buscar))
         resultados = pclases.CategoriaLaboral.select(criterio)
         if resultados.count() > 1:
             ## Refinar los resultados
             idcategoria_laboral = self.refinar_resultados_busqueda(resultados)
             if idcategoria_laboral == None:
                 return
             resultados = [pclases.CategoriaLaboral.get(idcategoria_laboral)]
         elif resultados.count() < 1:
             ## Sin resultados de búsqueda
             utils.dialogo_info('SIN RESULTADOS',
                                '\n\nLa búsqueda no produjo resultados.\nPruebe a cambiar el texto buscado o déjelo en blanco para ver una lista completa.\n(Atención: Ver la lista completa puede resultar lento si el número de elementos es muy alto)\n\n')
             return
         ## Un único resultado
         # Primero anulo la función de actualización
         if categoria_laboral != None:
             categoria_laboral.notificador.set_func(lambda : None)
         # Pongo el objeto como actual
         categoria_laboral = resultados[0]
         # Y activo la función de notificación:
         self.objeto = categoria_laboral
         self.actualizar_ventana(objetobak)
         categoria_laboral.notificador.set_func(self.aviso_actualizacion)
コード例 #16
0
 def pedir_producto(self):
     """
     Solicita una descripción de producto, muestra una
     ventana de resultados coincidentes con la 
     búsqueda de ese código y devuelve un 
     objeto producto seleccionado de entre
     los resultados o None si se cancela o 
     no se encuentra.
     """
     producto = None
     codigo = utils.dialogo_entrada(texto = 'Introduzca descripción del producto.', 
                                    titulo = 'PRODUCTO', 
                                    padre = self.wids['ventana'])
     if codigo == None:  # Ha cancelado
         producto = self.producto
     if codigo != None:
         prods = pclases.ProductoCompra.select(pclases.ProductoCompra.q.descripcion.contains(codigo))
         prods = [p for p in prods]
         mens_error = 'No se encontró ningún producto con esa descripción.'
         if len(prods) > 1:
             idproducto = self.refinar_busqueda_productos(prods)
             if idproducto != None:
                 prods = [p for p in prods if p.id == idproducto]
             else:
                 return None
         elif len(prods) < 1:
             utils.dialogo_info('CÓDIGO NO ENCONTRADO', mens_error)
             return None
         producto = prods[0]
     return producto
コード例 #17
0
ファイル: pagares_cobros.py プロジェクト: pacoqueen/upy
 def buscar_cliente(self):
     """
     Muestra una ventana de búsqueda y a continuación los
     resultados. El objeto seleccionado se hará activo
     en la ventana a no ser que se pulse en Cancelar en
     la ventana de resultados.
     """
     cliente = None
     a_buscar = utils.dialogo_entrada(titulo = "CIF", texto = "Introduzca nombre o CIF del cliente:", padre = self.wids['ventana']) 
     if a_buscar != None:
         criterio = pclases.OR(pclases.Cliente.q.nombre.contains(a_buscar),
                               pclases.Cliente.q.cif.contains(a_buscar))
         resultados = pclases.Cliente.select(criterio) 
         if resultados.count() > 1:
             ## Refinar los resultados
             idcliente = self.refinar_resultados_busqueda_cliente(resultados)
             if idcliente == None:
                 return
             resultados = [pclases.Cliente.get(idcliente)]
         elif resultados.count() < 1:
             ## Sin resultados de búsqueda
             utils.dialogo_info('SIN RESULTADOS', 
                                'La búsqueda no produjo resultados.\nPruebe a cambiar el texto buscado o déjelo en blanco para ver una lista completa.\n(Atención: Ver la lista completa puede resultar lento si el número de elementos es muy alto)', 
                                padre = self.wids['ventana'])
             return
         ## Un único resultado
         cliente = resultados[0]
     return cliente
コード例 #18
0
ファイル: formulacion_fibra.py プロジェクト: pacoqueen/bbinn
 def pedir_nombre(self):
     """
     Pide un texto y lo devuelve. Sin más.
     """
     return utils.dialogo_entrada(titulo = "NOMBRE CONSUMO", 
                                  texto = "Introduzca un nombre identificativo si lo desea:", 
                                  padre = self.wids['ventana'])
コード例 #19
0
ファイル: formulacion_fibra.py プロジェクト: pacoqueen/bbinn
 def pedir_unidad(self, productoCompra):
     """
     Pide la unidad del descuento y comprueba que sea correcta.
     Recibe el producto de compra para mostrar el valor por defecto.
     """
     txt = """
                                                                             
     Introduzca las unidades para el descuento de materiales.                
                                                                             
     Por ejemplo:                                                            
         %  (porcentaje en las unidades del material                         
                  por peso de producto terminado).                           
         ud / 5 ud   (unidad del material por cada 5 unidades                
                      de producto terminado).                                
         m / kg  (metro de material por kilo de producto).                   
         kg / 5.5 m (kg de material por cada 5.5 metros de producto).        
                                                                             
     NOTA: La unidad del materal que se descuenta debe ser la misma          
           que consta en catálogo, pedidos de compra, etc.                   
                                                                             
     """ 
     defecto = "%s / ud" % (productoCompra.unidad)
     res = utils.dialogo_entrada(titulo = "INTRODUZCA UNIDAD", 
                                 texto = txt, 
                                 padre = self.wids['ventana'], 
                                 valor_por_defecto = defecto)
     if not comprobar_unidad(res):
         utils.dialogo(titulo = "FORMATO INCORRECTO", 
                       texto = "El texto introducido %s no tiene el formato correcto." % (res), 
                       padre = self.wids['ventana'])
         res = None
     return res
コード例 #20
0
ファイル: albaranes_de_entrada.py プロジェクト: pacoqueen/upy
 def imprimir(self, boton):
     """
     Crea un impreso del albarán
     """
     self.guardar(None)  # Si se ha olvidado guardar, guardo yo.
     import informes
     albaran = self.objeto
     if albaran.proveedor != None:
         proveedor = albaran.proveedor.nombre
     else:
         proveedor = ''
     pedidos = []
     lineas = []
     for l in albaran.lineasDeCompra:
         if l.pedidoCompra != None:
             numpedido = l.pedidoCompra.numpedido
         else:
             numpedido = '-'
         lineas.append({'codigo': l.productoCompra.codigo, 
                        'descripcion': l.productoCompra.descripcion, 
                        'cantidad': l.cantidad, 
                        'numped': numpedido })
         if l.pedidoCompra != None and l.pedidoCompra.numpedido not in pedidos:
             pedidos.append(l.pedidoCompra.numpedido)
     cadenaPedidos = ','.join(pedidos)
     general = {'albnum':albaran.numalbaran, 
                'fecha':utils.str_fecha(albaran.fecha), 
                'proveedor':proveedor, 
                'pednum':cadenaPedidos}
     observaciones = utils.dialogo_entrada(titulo = 'OBSERVACIONES', 
                                           texto = '¿Desea incluir alguna observación en el albarán?', 
                                           padre = self.wids['ventana'])
     if observaciones == None:
         return
     informes.abrir_pdf(geninformes.albaranEntrada(general, lineas, observaciones))
コード例 #21
0
 def pedir_producto_compra(self):
     """
     Devuelve UN producto de compra obtenido a partir 
     de una búsqueda, etc.
     """
     producto = None
     a_buscar = utils.dialogo_entrada(titulo = "BUSCAR MATERIAL", 
             texto = "Introduzca texto a buscar en productos de compra:", 
             padre = self.wids['ventana'])
     if a_buscar != None:
         resultados = utils.buscar_productos_compra(a_buscar)
         if resultados.count() > 1:
             ## Refinar los resultados:
             filas_res = []
             for r in resultados:
                 filas_res.append((r.id, r.codigo, r.descripcion))
             idproducto = utils.dialogo_resultado(filas_res, 
                     titulo = 'Seleccione producto', 
                     cabeceras = ('ID Interno', 'Código', 'Descripción'), 
                     padre = self.wids['ventana'])
             if idproducto < 0:
                 return
             producto = pclases.ProductoCompra.get(idproducto)
                 # id es clave primaria, esta comprensión debería devolver un único producto
         elif resultados.count() < 1:
             ## La búsqueda no produjo resultados.
             utils.dialogo_info('SIN RESULTADOS', 
                 'La búsqueda no produjo ningún resultado.\nIntente una '
                 'búsqueda menos restrictiva usando un texto más corto.', 
                 padre = self.wids['ventana'])
             return None
         else:
             producto = resultados[0]
     return producto
コード例 #22
0
ファイル: lineas_sin_pedido.py プロジェクト: pacoqueen/bbinn
    def agregar_a_pedido(self, widget):
        """
        Asigna la linea sin pedido a un pedido ya creado
        """
    	model, iter = self.wids['tv_tipos'].get_selection().get_selected()
    	if iter != None:
    	    idtipo = model[iter][-1]
            linea_sin_pedido = pclases.LineaDeVenta.get(idtipo)
        else:
            utils.dialogo_info('ERROR','Seleccione una línea para asignarla al pedido')
            return

        numpedido = utils.dialogo_entrada(titulo = 'NÚMERO DE PEDIDO', texto = 'Introduzca el número del pedido al que desea añadir la línea seleccionada')
        pedido = self.buscar_pedido(numpedido)
        if pedido == None:
            utils.dialogo_info(texto = 'No se encontró ningún pedido con ese número', titulo = 'ERROR')
            return
        linea_sin_pedido.pedidoVenta = pedido
        ldc = pclases.LineaDePedido(presupuesto = None, 
                                    pedidoVenta = pedido,
                                    productoVenta = linea_sin_pedido.productoVenta,
                                    productoCompra = linea_sin_pedido.productoCompra, 
                                    fechahora = mx.DateTime.localtime(), 
                                    cantidad = linea_sin_pedido.cantidad, 
                                    precio = linea_sin_pedido.precio, 
                                    descuento = linea_sin_pedido.descuento, 
                                    fechaEntrega = None, 
                                    textoEntrega='')
    	self.rellenar_tabla()
        import pedidos_de_venta
        pedidos_de_venta.PedidosDeVenta(objeto = pedido, usuario = self.usuario)
コード例 #23
0
ファイル: albaranes_de_entrada.py プロジェクト: pacoqueen/upy
 def pedir_producto(self):
     """
     Solicita un código de producto, muestra una
     ventana de resultados coincidentes con la 
     búsqueda de ese código y devuelve un 
     objeto producto seleccionado de entre
     los resultados o None si se cancela o 
     no se encuentra.
     """
     producto = None
     codigo = utils.dialogo_entrada(texto = 'Introduzca código o descripción del producto.', 
                                    titulo = 'PRODUCTO', 
                                    padre = self.wids['ventana'])
     if codigo != None:
         prods = pclases.ProductoCompra.select(pclases.AND(pclases.OR(pclases.ProductoCompra.q.descripcion.contains(codigo), #@UndefinedVariable
                                                                      pclases.ProductoCompra.q.codigo.contains(codigo)), #@UndefinedVariable
                                                           pclases.ProductoCompra.q.controlExistencias == True)) #@UndefinedVariable
         prods = tuple(prods)
         mens_error = 'No se encontró ningún producto con ese código o descripción.'
         if len(prods) > 1:
             idproducto = self.refinar_busqueda_productos(prods)
             if idproducto != None:
                 prods = [pclases.ProductoCompra.get(idproducto)]
             else:
                 return None
         elif len(prods) < 1:
             utils.dialogo_info(titulo = 'CÓDIGO NO ENCONTRADO', 
                                texto = mens_error, 
                                padre = self.wids['ventana'])
             return None
         producto = prods[0]
     return producto
コード例 #24
0
ファイル: ventana_usuario.py プロジェクト: pacoqueen/upy
 def buscar_usuario(self, widget):
     """
     Muestra una ventana de búsqueda y a continuación los
     resultados. El objeto seleccionado se hará activo
     en la ventana a no ser que se pulse en Cancelar en
     la ventana de resultados.
     """
     usuario = self.objeto
     a_buscar = utils.dialogo_entrada("Introduzca nombre de usuario o nombre real:") 
     if a_buscar != None:
         resultados = pclases.Usuario.select(sqlobject.OR(pclases.Usuario.q.usuario.contains(a_buscar),
                                                          pclases.Usuario.q.nombre.contains(a_buscar)))
         if resultados.count() > 1:
             ## Refinar los resultados
             idusuario = self.refinar_resultados_busqueda(resultados)
             if idusuario == None:
                 return
             resultados = [pclases.Uduario.get(idusuario)]
         elif resultados.count() < 1:
             ## Sin resultados de búsqueda
             utils.dialogo_info('SIN RESULTADOS', 'La búsqueda no produjo resultados.\nPruebe a cambiar el texto buscado o déjelo en blanco para ver una lista completa.\n(Atención: Ver la lista completa puede resultar lento si el número de elementos es muy alto)')
             return
         ## Un único resultado
         # Primero anulo la función de actualización
         if usuario != None:
             usuario.notificador.desactivar()
         # Pongo el objeto como actual
         usuario = resultados[0]
         # Y activo la función de notificación:
         usuario.notificador.activar(self.aviso_actualizacion)
     self.objeto = usuario
     self.actualizar_ventana()
コード例 #25
0
 def set_partida(self, w):
     numpartida = utils.dialogo_entrada(titulo = 'Nº PARTIDA', 
                                     texto = 'Introduzca número de partida:')
     if numpartida != None:
         partidas = pclases.Partida.select(pclases.Partida.q.numpartida.contains(numpartida))
         if partidas.count() == 0:
             utils.dialogo_info(titulo = 'PARTIDA NO ENCONTRADA', 
                                texto = 'No se encontró ninguna partida %s.' % numpartida)
             return
         elif partidas.count() > 1:
             filas = [(l.id, l.numpartida, l.codigo, l.longitudinal, l.transversal, l.compresion, l.perforacion, l.permeabilidad, l.poros, l.espesor) for l in partidas]
             idpartida = utils.dialogo_resultado(filas, 
                                              titulo = 'SELECCIONE PARTIDA',
                                              cabeceras = ('ID', 'Número', 'Código', 'Longitudinal', 'Transversal', 'CBR', 'Perforación', 'Permeabilidad', 'Poros', 'Espesor'))
             if idpartida < 0:
                 return
             partida = pclases.Partida.get(idpartida)
         else:
             partida = partidas[0]
         if len(partida.rollos) == 0:
             utils.dialogo_info(titulo = 'PARTIDA VACÍA', 
                                texto = 'La partida no contiene rollos, no puede\nrealizar pruebas sobre una partida vacía.')
             self.partida = None
             return
         self.partida = partida
         self.actualizar_ventana()
コード例 #26
0
 def pedir_transportista(self, widget):
     """
     Solicita un número de pedido, muestra una
     ventana de resultados coincidentes con la 
     búsqueda de ese número y devuelve un 
     objeto pedido seleccionado de entre
     los resultados o None si se cancela o 
     no se encuentra.
     """
     global transportista
     codigo = utils.dialogo_entrada(texto = 'Introduzca nombre del transportista', titulo = 'TRANSPORTISTA', padre = self.wids['ventana'])
     if codigo != None:
         trans = pclases.Transportista.select(pclases.Transportista.q.nombre.contains(codigo))
         trans = [p for p in trans]
         mens_error = 'No se encontró ningún transportista con ese nombre.'
         if len(trans) > 1:
             idtrans = refinar_busqueda_transportista(trans)
             if idtrans != None:
                 trans = [p for p in trans if p.id == idtrans]
             else:
                 return None
         elif len(trans) < 1:
             utils.dialogo_info('TRANSPORTISTA NO ENCONTRADO', mens_error, padre = self.wids['ventana'])
             return None
         transportista = trans[0]
コード例 #27
0
ファイル: presupuestos.py プロジェクト: pacoqueen/upy
 def seleccionar_cantidad(self, producto):
     """
     Muestra un diálogo para introducir la cantidad.
     Si el producto es un rollo, se introducirá en 
     metros cuadrados.
     Si es una bala, se introducirá en kilos.
     En las LDV se mantendrán también estas unidades
     ya que el precio por unidad va en función de 
     kilos y rollos en el producto.
     Cuando se haga el albarán es cuando habrá que
     calcular cuantos rollos (y cuáles en concreto)
     y cuántas balas entran. Aunque en realidad es 
     el usuario el que las seleccionará y el programa
     irá informando si se satisface la LDV o no.
     """
     if isinstance(producto, pclases.ProductoCompra):
         txt = "Introduzca la cantidad en %s." % (producto.unidad)
     else:
         txterror = "presupuestos::seleccionar_cantidad -> ERROR: Producto %s no es producto de compra ni de venta." % (producto)
         self.logger.error(txterror)
     cantidad = utils.dialogo_entrada(titulo = 'CANTIDAD', texto = txt, padre = self.wids['ventana'])
     try:
         cantidad = utils._float(cantidad)
         return cantidad
     except:
         utils.dialogo_info(titulo = 'ERROR', texto = 'La cantidad introducida no es correcta.', padre = self.wids['ventana'])
         return None
コード例 #28
0
 def nueva_nota(self, idfras):
     texto = utils.dialogo_entrada(
         titulo="TEXTO NOTA", texto="Introduzca el texto de la nota:", padre=self.wids["ventana"]
     )
     if texto:
         for id in idfras:
             tarea = pclases.Nota(facturaVentaID=id, texto=texto, fechahora=mx.DateTime.localtime())
         self.buscar_anotaciones()
コード例 #29
0
ファイル: menu.py プロジェクト: pacoqueen/bbinn
def construir_y_enviar(w, ventana, remitente, observaciones, texto, usuario):
    import ventana_progreso, sys, os
    try:
        import libgmail
    except:
        sys.path.insert(0, os.path.join('..', 'libgmail-0.1.3.3'))
        import libgmail
    rte = remitente.get_text()
    buffer = observaciones.get_buffer()
    obs = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter()) 
    if usuario == None:
        contra = ''
    else:
        contra = usuario.cpass
    pwd = utils.dialogo_entrada(titulo = 'CONTRASEÑA', texto = """ 
    Introduzca la contraseña de su cuenta de correo en gmail.       
    No se almacenará.
    
    """, pwd = True, valor_por_defecto = contra)
    if pwd != None and pwd != "":
        vpro = ventana_progreso.VentanaProgreso()
        vpro.tiempo = 25
        vpro.mostrar()
        vpro.set_valor(0.0, "Intentando login en %s..." % rte)
        import time 
        for nada in xrange(50):
            vpro.set_valor(nada/100.0, "Intentando login en %s..." % rte)
            time.sleep(0.05)     # Es que si no no da tiempo a ver el mensajito.
        con = libgmail.GmailAccount(rte, pwd)
        try:
            con.login()
        except:
            utils.dialogo_info(titulo = "ERROR",
                texto = "Login erróneo. No se introdujo una cuenta de gmail "
                        "o contraseña válida.\n\nVuelva a intentarlo.")
            guardar_error_a_disco(rte, obs, texto)
            vpro.ocultar()
            return
        texto = "OBSERVACIONES: " + obs + "\n\n\n" + texto 
        tos = ('*****@*****.**', )
        i = 0
        for to in tos:
            vpro.set_valor((i/len(tos)*0.5) + 0.5, "Enviando a %s..." % to)
            msg = libgmail.GmailComposedMessage(to, 
                "ERROR GINN. Capturada excepción no contemplada.", texto)
            try:
                con.sendMessage(msg)
            except Exception, msg:
                utils.dialogo_info(titulo = "ERROR",
                    texto = "Ocurrió un error al enviar el correo electrónico."
                            "\n\n\n%s" % msg)
                guardar_error_a_disco(rte, obs, texto)
                vpro.ocultar()
                return
        vpro.ocultar()
        utils.dialogo_info(titulo = 'CORREO ENVIADO', 
            texto = 'Informe de error enviado por correo electrónico.')
        ventana.destroy()
コード例 #30
0
 def nueva_alarma(self, idfras):
     texto = utils.dialogo_entrada(
         titulo="TEXTO ALARMA", texto="Introduzca el texto de la alarma.", padre=self.wids["ventana"]
     )
     if texto:
         fechalarma = utils.mostrar_calendario(
             titulo="FECHA Y HORA",
             padre=self.wids["ventana"],
             fecha_defecto=mx.DateTime.localtime() + mx.DateTime.oneDay,
         )
         try:
             dia, mes, anno = fechalarma
             fechalarma = mx.DateTime.DateTimeFrom(day=dia, month=mes, year=anno)
         except (TypeError, ValueError, AttributeError):
             utils.dialogo_info(
                 titulo="FECHA INCORRECTA",
                 texto="La fecha seleccionada (%s)\n" "no es correcta." % ` fechalarma `,
                 padre=self.wids["ventana"],
             )
             fechalarma = None
         if fechalarma:
             hora = utils.mostrar_hora(
                 titulo="SELECCIONE HORA DE ALARMA",
                 padre=self.wids["ventana"],
                 horas=mx.DateTime.localtime().hour,
                 minutos=mx.DateTime.localtime().minute,
             )
             if not hora:
                 return  # Canceló
             try:
                 horas = int(hora.split(":")[0])
                 minutos = int(hora.split(":")[1])
                 fechalarma = mx.DateTime.DateTimeFrom(
                     day=fechalarma.day, month=fechalarma.month, year=fechalarma.year, hour=horas, minute=minutos
                 )
             except (IndexError, TypeError, ValueError, AttributeError):
                 utils.dialogo_info(
                     titulo="HORA INCORRECTA",
                     texto="La hora %s no es correcta." % (hora),
                     padre=self.wids["ventana"],
                 )
                 fechalarma = None
             if fechalarma:
                 try:
                     estado = pclases.Estado.get(1)  # *Debería* existir.
                 except:
                     estado = None
                 # print idfras
                 for id in idfras:
                     tarea = pclases.Alarma(
                         facturaVentaID=id,
                         texto=texto,
                         fechahora=mx.DateTime.localtime(),
                         estado=estado,
                         fechahoraAlarma=fechalarma,
                         objetoRelacionado=None,
                     )
                 self.buscar_alertas()