def cambiar_horainicio(self, tv, path, newtext): model = self.wids['tv_horas'].get_model() ide = model[path][-1] pt = pclases.ParteDeTrabajo.get(ide) try: dtdelta = mx.DateTime.DateTimeDelta(0, float(newtext.split(':')[0]), float(newtext.split(':')[1]), 0) duracion = pt.horas pt.horainicio = mx.DateTime.DateTimeFrom(year = pt.horainicio.year, month = pt.horainicio.month, day = pt.horainicio.day, hour = dtdelta.hour, minute = dtdelta.minute, second = dtdelta.second) pt.horafin = pt.horainicio + duracion pt.sync() model[path][2] = pt.horainicio.strftime('%H:%M') model[path][3] = pt.horafin.strftime('%H:%M') model[path][4] = pt.horas.strftime('%H:%M') except IndexError: utils.dialogo_info(titulo = "ERROR", texto = 'El texto "%s" no respeta el formato horario (H:MM).' % newtext, padre = self.wids['ventana']) except ValueError: utils.dialogo_info(titulo = "ERROR", texto = 'El texto "%s" no respeta el formato horario (H:M).' % newtext, padre = self.wids['ventana'])
def add(self, w): if self.producto != None: fecha = self.wids['e_fecha'].get_text() if fecha == '': utils.dialogo_info(titulo = 'SIN FECHA', texto = 'Debe introducir la fecha del resultado de la prueba.') return resultado1 = self.wids['e_resultado1'].get_text() if resultado1 == '': utils.dialogo_info(titulo = 'SIN RESULTADO', texto = 'Debe introducir el resultado de la prueba en resultado1.', padre = self.wids['ventana']) return resultado2 = self.wids['e_resultado2'].get_text() try: mfi = utils._float(self.wids['e_mfi'].get_text()) except: utils.dialogo_info(titulo = "MFI INCORRECTO", texto = "No ha introducido un valor correcto para el MFI del proveedor.", padre = self.wids['ventana']) return try: resultado = float(resultado1) prueba = pclases.PruebaGranza(fecha = utils.parse_fecha(fecha), resultado = resultado, productoCompra = self.producto, fechaEntrada = mx.DateTime.localtime(), silo = self.wids['e_silo'].get_text(), lote = self.wids['e_lote'].get_text(), mfi = mfi) pclases.Auditoria.nuevo(prueba, self.usuario, __file__) if resultado2: try: resultado = float(resultado2) prueba = pclases.PruebaGranza( fecha = utils.parse_fecha(fecha), resultado = resultado, productoCompra = self.producto, fechaEntrada = mx.DateTime.localtime(), silo = self.wids['e_silo'].get_text(), lote = self.wids['e_lote'].get_text(), mfi = mfi) pclases.Auditoria.nuevo(prueba, self.usuario, __file__) except Exception, msg: utils.dialogo_info(titulo = 'ERROR', texto = 'Verifique que ha introducido los datos correctamente.\n\n\nInformación de depuración: %s' % (msg), padre = self.wids['ventana']) except Exception, msg: utils.dialogo_info(titulo = 'ERROR', texto = 'Verifique que ha introducido los datos correctamente.\n\n\nInformación de depuración: %s' % (msg), padre = self.wids['ventana']) self.wids['e_fecha'].set_text(utils.str_fecha(time.localtime())) self.wids['e_resultado1'].set_text('') self.wids['e_resultado2'].set_text('') self.wids['e_lote'].set_text('') self.wids['e_silo'].set_text('') self.wids['e_mfi'].set_text('0') self.rellenar_pruebas()
def comparar_float(self, col): res = 0.0 try: valor_ventana = self.wids[col].get_text() except KeyError: txt_error = "categorias_laborales.py: No se pudo obtener el valor de la ventana para %s." % col print txt_error self.logger.error(txt_error) valor_ventana = 0.0 try: valor_ventana = float(valor_ventana) except ValueError: txt_error = "categorias_laborales.py: No se pudo convertir %s(%s) a float." % (col, valor_ventana) print txt_error self.logger.error(txt_error) valor_ventana = 0.0 try: valor_campo = self.objeto._SO_getValue(col) if not isinstance(valor_campo, type(0.0)): # Porque es posible que el SOCol no contenga un float. # El SOCol es la clase base. Se asume flotante por eliminación. res = False else: res = valor_ventana == valor_campo except KeyError: txt_error = "categorias_laborales.py: No se pudo obtener el valor del objeto para %s." % col print txt_error self.logger.error(txt_error) valor_campo = 0.0 return res
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 actualizar_porcentaje_tarifa(self, celleditable, path, nuevotexto): """ Se recibe la celda que ha cambiado. El contenido se toma como nuevo precio para la tarifa actual y el producto de la fila a la que pertenezca la fila. """ idprecio = self.wids['tabla_productos'].get_model()[path][-1] precio = pclases.Precio.get(idprecio) producto = precio.producto tarifa = self.objeto # OJO: No se debería devolver ni más ni menos de un producto. try: porcentaje = utils.parse_porcentaje(nuevotexto, True) except ValueError: utils.dialogo_info(titulo = 'VALOR INCORRECTO', texto = 'El texto tecleado (%s) no es un porcentaje correcto' % (nuevotexto), padre = self.wids['ventana']) else: nuevoprecio = producto.preciopordefecto * (1 + porcentaje) tarifa.asignarTarifa(producto, float(nuevoprecio)) #self.actualizar_ventana() model = self.wids['tabla_productos'].get_model() model[path][-3] = precio.precio model[path][-2] = "%s %%" % (porcentaje * 100)
def cambiar_precio(self, cell, path, texto): try: precio = float(texto) except: utils.dialogo_info(titulo = "ERROR FORMATO", texto = "El texto %s no es un número." % texto, padre = self.wids['ventana']) else: model = self.wids['tv_ldvs'].get_model() ldc = pclases.LineaDeCompra.get(model[path][-1]) ldc.precio = precio # CWT: Si el precio cambia al alza, respetar porcentaje. Si meto # un precio inferior, entonces respetar el precio final de las # tarifas y adaptar el porcentaje a ese precio de forma que nunca # venda más barato al cambiar el precio del proveedor. pc = ldc.productoCompra pc.sync() if precio > pc.precioDefecto: # Si el precio sube, actualizo tarifas respetando porcentajes. for t in pclases.Tarifa.select(orderBy = "nombre"): if t.vigente: porcentaje = t.get_porcentaje(pc, fraccion = True) nuevo_precio = precio * (1 + porcentaje) t.asignarTarifa(pc, nuevo_precio) # Si el precio ha bajado o se mantiene, respeto precio final. La # ventana ya calculará el porcentaje que sea. pc.precioDefecto = precio pc.syncUpdate() self.actualizar_ventana()
def get_valor(self, w, nombrecampo, tipocampo): res = None if isinstance(tipocampo, sqlobject.SOStringCol): # Cadena: el widget es un entry res = w.get_text() elif isinstance(tipocampo, sqlobject.SOIntCol): # Entero: el widget es un entry res = w.get_text() try: res = int(res) except ValueError: txt = "El valor %s no es correcto. Introduzca un número entero." % (res) utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = txt, padre = self.wids['ventana']) res = 0 elif isinstance(tipocampo, sqlobject.SOBoolCol): # Boolean: el widget es un checkbox res = w.get_active() elif isinstance(tipocampo, sqlobject.SOForeignKey): # Entero-clave ajena: el widget es un comboboxentry res = utils.combo_get_value(w) elif isinstance(tipocampo, sqlobject.SOCol): # Clase base, casi seguro Float: el widget es un entry res = w.get_text() try: res = float(res) except ValueError: txt = "El valor %s no es correcto. Introduzca un número." % (res) utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = txt, padre = self.wids['ventana']) res = 0.0 else: txt = "motivos_ausencia.py: No se pudo obtener el valor de %s para %s <%s>." \ % (w, nombrecampo, tipocampo) print txt self.logger.error(txt) return res
def cambiar_resultado(self, tv, path, texto): model = self.wids["tv_pruebas"].get_model() prueba = pclases.PruebaTenacidad.get(model[path][-1]) try: prueba.resultado = float(texto) except: utils.dialogo_info("RESULTADO INCORRECTO", "El número tecleado (%s) no es correcto." % texto) self.rellenar_pruebas()
def guardar(self, b): """ Guarda los valores para la cantidad en los campos de los registros correspondientes. """ try: self.cas['ensimaje'].cantidad = float(self.wids['e_censimaje'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['antiuvi'].cantidad = float(self.wids['e_cantiuvi'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['negro'].cantidad = float(self.wids['e_cnegro'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['titanio'].cantidad = float(self.wids['e_ctitanio'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['plástico grueso'].cantidad = float(self.wids['e_cplasticog'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['plástico estirable'].cantidad = float(self.wids['e_cplasticoe'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['flejes'].cantidad = float(self.wids['e_cflejes'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") self.rellenar_widgets()
def guardar(self, b): """ Guarda los valores para la cantidad en los campos de los registros correspondientes. """ try: self.cas['ensimaje'].cantidad = float(self.wids['e_censimaje'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['antiestatico'].cantidad = float(self.wids['e_cantiestatico'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['tubos'].cantidad = float(self.wids['e_ctubos'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['plastico'].cantidad = float(self.wids['e_cplastico'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['precinto'].cantidad = float(self.wids['e_cprecinto'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['casquillos'].cantidad = float(self.wids['e_ccasquillos'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") try: self.cas['grapas'].cantidad = float(self.wids['e_cgrapas'].get_text()) except: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "Corrija el formato numérico usado y vuelva a intentarlo.") self.rellenar_widgets()
def cambiar_cantidad(self, cell, path, texto): """ Cambia la cantidad de una linea de venta de un albarán de entrada, en el caso de que se escriba una cantidad menor de la que estaba en el pedido de compra (si es que tenía uno asociado), se desdobla la línea de venta original en dos líneas: una con el albarán asociado (por lo que deja de estar pendiente) y otra con la cantidad pendiente que no queda asociada al albarán. Si en el pedido quedara alguna LDV sin "albaranear" del mismo producto, al mismo precio, etc... esta segunda línea con la cantidad excedente se suma a la del pedido y se elimina, para evitar líneas sueltas de cantidades pequeñas. En el caso de que se escriba una cantidad mayor a la que estaba originalmente en el pedido se darán dos opciones: - Crear una nueva linea de compra sin pedido asociado, con la cantidad incrementada. - Incrementar la cantidad en la línea de compra del pedido original. ... Bla, bla, bla, bla. ¡Hola! Soy Troy McLure. Tal vez me recuerden de otros cambios de requisitos en caliente como «cambiemos "en albarán" por "albaraneada"», «vendamos productos de compra sin manufacturar» o «tal vez necesitemos un histórico de existencias»... Todo lo de arriba YA NO SIRVE. Ahora, con las nuevas líneas de pedido de compra, la cantidad se aumenta directamente en la línea de compra y santas pascuas. """ try: cantidad = float(texto) except: return model = self.wids['tv_ldvs'].get_model() try: ldc = pclases.LineaDeCompra.get(model[path][-1]) except pclases.SQLObjectNotFound: utils.dialogo_info(titulo = "LÍNEA BORRADA", texto = "La línea seleccionada fue eliminada desde otro puesto.", padre = self.wids['ventana']) else: antigua = ldc.cantidad ldc.cantidad = cantidad if ldc.productoCompra.controlExistencias: # DEBUG #print ldc.productoCompra.existencias # EODEBUG diferencia = cantidad - antigua ldc.productoCompra.sync() ldc.productoCompra.existencias += diferencia ldc.productoCompra.add_existencias(diferencia, almacen=self.objeto.almacen) ldc.productoCompra.syncUpdate() ldc.productoCompra.sync() # DEBUG #print ldc.productoCompra.existencias # EODEBUG #if ldc.cargaSilo: # ldc.cargaSilo.cantidad = cantidad self.actualizar_ventana()
def cambiar_horas(self, tv, path, newtext): model = self.wids['tv_horas'].get_model() ide = model[path][-1] pt = pclases.ParteDeTrabajo.get(ide) try: dtdelta = mx.DateTime.DateTimeDelta(0, float(newtext.split(':')[0]), float(newtext.split(':')[1]), 0) pt.horafin = pt.horainicio + dtdelta pt.sync() model[path][4] = (pt.horafin - pt.horainicio).strftime('%H:%M') model[path][3] = pt.horafin.strftime('%H:%M') except IndexError: utils.dialogo_info(titulo = "ERROR", texto = 'El texto "%s" no respeta el formato horario (H:MM).' % newtext, padre = self.wids['ventana']) except ValueError: utils.dialogo_info(titulo = "ERROR", texto = 'El texto "%s" no respeta el formato horario (H:M).' % newtext, padre = self.wids['ventana'])
def cambiar_resultado(self, tv, path, texto): model = self.wids['tv_pruebas'].get_model() prueba = claseprueba.get(model[path][-1]) try: prueba.resultado = float(texto) except: utils.dialogo_info('RESULTADO INCORRECTO', 'El número tecleado (%s) no es correcto.' % texto) self.rellenar_pruebas()
def cambiar_tolerancia(self, sp): loteCem = self.loteCem try: loteCem.tolerancia = float(sp.get_value()) / 100.0 self.calcular_caracteristicas() except ValueError: utils.dialogo_info(titulo = 'VALOR INCORRECTO', texto = 'El valor %s no es correcto.' % (sp.get_value()), padre = self.wids['ventana'])
def buscar(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. """ transferencia = self.objeto a_buscar = utils.dialogo_entrada(titulo = "BUSCAR TRANSFERENCIA", texto = "Introduzca identificador, importe o pulse «Aceptar» para verlas todas:", padre = self.wids['ventana']) if a_buscar != None: try: ida_buscar = int(a_buscar) except ValueError: ida_buscar = -1 try: a_buscar = float(a_buscar) except ValueError: if ida_buscar != -1: criterio = pclases.Pago.q.id == ida_buscar else: criterio = None else: criterio = pclases.OR(pclases.Pago.q.importe == a_buscar, pclases.Pago.q.id == ida_buscar) resultados = pclases.Pago.select(criterio) resultados = [r for r in resultados if r.es_transferencia()] if len(resultados) > 1: ## Refinar los resultados idtransferencia = self.refinar_resultados_busqueda(resultados) if idtransferencia == None: return resultados = [pclases.Pago.get(idtransferencia)] elif len(resultados) < 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 # Primero anulo la función de actualización if transferencia != None: transferencia.notificador.desactivar() # Pongo el objeto como actual try: transferencia = resultados[0] except IndexError: utils.dialogo_info(titulo = "ERROR", texto = "Se produjo un error al recuperar la información.\nCierre y vuelva a abrir la ventana antes de volver a intentarlo.", padre = self.wids['texto']) return # Y activo la función de notificación: transferencia.notificador.activar(self.aviso_actualizacion) self.activar_widgets(True) self.objeto = transferencia self.actualizar_ventana()
def cambiar_precio(self, cell, path, texto): try: precio = float(texto) except: return model = self.wids['tv_ldvs'].get_model() ldc = pclases.LineaDeCompra.get(model[path][-1]) ldc.precio = precio self.actualizar_ventana() self.wids['b_add_ldv'].grab_focus()
def cambiar_resultado(self, tv, path, texto): model = self.wids['tv_pruebas'].get_model() prueba = pclases.PruebaGranza.get(model[path][-1]) texto = texto.replace(",", ".") try: prueba.resultado = float(texto) except: utils.dialogo_info('RESULTADO INCORRECTO', 'El número tecleado (%s) no es correcto.\nDebe introducir exclusivamente una cantidad numércica, sin unidades\nde medida y usando únicamente el punto como signo de separación decimal.' % texto, padre = self.wids['ventana']) self.rellenar_pruebas()
def cambiar_resultado(self, tv, path, texto, columna): texto = texto.replace(" ", "") if texto != "": try: resultado = float(texto) except: utils.dialogo_info('RESULTADO INCORRECTO', 'El número tecleado (%s) no es correcto.' % texto, padre = self.wids['ventana']) return clase = self.get_clase(columna) columnaid = columna-1 # Porque en los IDS empieza por 0 if clase != None: model = self.wids['tv_pruebas'].get_model() ids = map(int, model[path][-1].split(',')) id = ids[columnaid] if id == 0: if texto != "": fecha = time.strptime(model[path][0], '%d/%m/%Y') prueba = clase(fecha = fecha, resultado = resultado, partida = self.partida) ids[columnaid] = prueba.id model[path][-1] = ','.join(map(str, ids)) if columna != 10: model[path][columna] = "%.2f" % resultado else: model[path][columna] = "%.3f" % resultado ## model[path][columna] = "%.2f" % resultado else: prueba = clase.get(int(id)) if texto == "": try: prueba.destroySelf() except: utils.dialogo_info(titulo = "ERROR", texto = "El resultado no se pudo eliminar.", padre = self.wids['ventana']) return model[path][columna] = "" ids[columnaid] = 0 model[path][-1] = ','.join(map(str, ids)) self.rellenar_pruebas() # Prefiero esto a comprobar # si la fila se ha quedado vacía, etc... else: prueba.resultado = resultado if columna != 10: model[path][columna] = "%.2f" % resultado else: model[path][columna] = "%.3f" % resultado # model[path][columna] = "%.2f" % resultado self.calcular_caracteristicas()
def add_tenacidad(self, w): """ Añade un valor de tenacidad a la lista """ tenacidad = utils.dialogo_entrada(titulo = 'VALOR DE TENACIDAD', texto = 'Introduzca el valor') try: tenacidad = tenacidad.replace(',','.') tenacidad = float(tenacidad) except: utils.dialogo_info(titulo = 'ERROR', texto = tenacidad + ' no es un valor numérico válido') return # El valor que se mete en la lista ya es un float self.tenacidad.append((tenacidad,len(self.tenacidad))) self.rellenar_tablas()
def add_encogimiento(self, w): """ Añade un valor de encogimiento a la lista """ encogimiento = utils.dialogo_entrada(titulo = 'VALOR DE ENCOGIMIENTO', texto = 'Introduzca el valor') try: encogimiento = encogimiento.replace(',','.') encogimiento = float(encogimiento) except: utils.dialogo_info(titulo = 'ERROR', texto = encogimiento + ' no es un valor numérico válido') return # El valor que se mete en la lista ya es un float self.encogimiento.append((encogimiento,len(self.encogimiento))) self.rellenar_tablas()
def add_elongacion(self, w): """ Añade un valor de elongacion a la lista """ elongacion = utils.dialogo_entrada(titulo = 'VALOR DE ELONGACIÓN', texto = 'Introduzca el valor') try: elongacion = elongacion.replace(',','.') elongacion = float(elongacion) except: utils.dialogo_info(titulo = 'ERROR', texto = elongacion + ' no es un valor numérico válido') return # El valor que se mete en la lista ya es un float self.elongacion.append((elongacion,len(self.elongacion))) self.rellenar_tablas()
def pedir_cantidad(self, producto): cant = utils.dialogo_entrada(titulo = '¿CANTIDAD?', texto = '%s\t\n\nIntroduzca cantidad' % ( producto.descripcion), valor_por_defecto = '1', padre = self.wids['ventana']) try: cant = float(cant) except: utils.dialogo_info(titulo = 'ERROR EN CANTIDAD', texto = 'Cantidad incorrecta.\nAsegúrese de escribirla con punto (.) como separador decimal.\nSe añadirá el producto al albarán, modifique la cantidad directamente ahí.', padre = self.wids['ventana']) cant = 1 return cant