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()
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()
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
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()
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()
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()
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()
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()
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
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()))
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)
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)
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()
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"], )
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)
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
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
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'])
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
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))
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
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)
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
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()
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()
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]
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
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()
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()
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()