예제 #1
0
def edit_int(cell, path, newtext, tv, numcol, clase, atributo):
    """
    Cambia el texto del model[path][numcol] y del objeto relacionado que 
    saca a partir del ID de la última columna del model.
    """
    try:
        numero = utils.parse_numero(newtext)
    except (ValueError, TypeError):
        parent = tv.parent
        while parent != None:
            parent = parent.parent
        utils.dialogo_info(titulo = "ERROR EN NÚMERO", 
            texto = "El texto «%s» no es un número entero válido." % (newtext), 
            padre = parent)
    else:
        model = tv.get_model()
        id = model[path][-1]
        objeto = clase.get(id)
        setattr(objeto, atributo, numero) 
        objeto.syncUpdate()
    model[path][numcol] = getattr(objeto, atributo)
예제 #2
0
 def set_loteCem(self, w):
     comprobar_y_preguntar_si_guardar(self)
     codlote = utils.dialogo_entrada(titulo = 'Nº LOTE', 
                 texto = 'Introduzca número o código de lote de fibra '
                         'de cemento:',
                 padre = self.wids['ventana'])
     if codlote != None:
         numlote = utils.parse_numero(codlote)
         loteCems = pclases.LoteCem.select(pclases.OR(
             pclases.LoteCem.q.numlote == numlote, 
             pclases.LoteCem.q.codigo.contains(codlote)))
         if loteCems.count() == 0:
             utils.dialogo_info(titulo = 'LOTE NO ENCONTRADO', 
                 texto = 'No se encontró ningún lote de fibra de cemento'
                         ' %s.' % (codlote), 
                 padre = self.wids['ventana'])
             return
         elif loteCems.count() > 1:
             filas = [(l.id, l.numlote, l.codigo, l.tenacidad, 
                       l.elongacion, l.humedad, l.encogimiento) 
                      for l in loteCems]
             idloteCem = utils.dialogo_resultado(filas, 
                 titulo = 'SELECCIONE LOTE',
                 cabeceras = ('ID', 'Número', 'Código', 'Tenacidad', 
                              'Elongación', 'Humedad', 'Encogimiento'), 
                 padre = self.wids['ventana'])
             if idloteCem < 0:
                 return
             loteCem = pclases.LoteCem.get(idloteCem)
         else:
             loteCem = loteCems[0]
         if len(loteCem.bigbags) == 0:
             utils.dialogo_info(titulo = 'LOTE VACÍO', 
                 texto = 'El lote de cemento no contiene bigbags, no '
                         'puede\nrealizar pruebas sobre un lote vacío.', 
                 padre = self.wids['ventana'])
             self.loteCem = None
             return
         self.loteCem = loteCem
         self.actualizar_ventana()
예제 #3
0
 def guardar(self, widget):
     """
     Guarda el contenido de los entry y demás widgets de entrada
     de datos en el objeto y lo sincroniza con la BD.
     """
     producto = self.objeto
     codigo = self.wids['e_codigo'].get_text()
     if len(codigo) < 12:
         utils.dialogo_info(titulo = "CÓDIGO DEMASIADO CORTO", 
                            texto = "El código debe tener 13 dígitos para ajustarse al formato EAN-13.\nSe va a completar con ceros.", 
                            padre = self.wids['ventana'])
         codigo += "0" * (12 - len(codigo))  # Completo hasta 12 para que después se le haga la suma de control.
     if len(codigo) == 12:
         codigo = codigo + self.calcular_digitoc(codigo)
     if len(codigo) > 13:
         utils.dialogo_info(titulo = "CÓDIGO INCORRECTO", 
                            texto = "Código EAN-13 incorrecto. Debe tener exactamente 13 dígitos.\nPuede introducir 12 y dejar que se calcule atomáticamente el dígito de control, si le es más cómodo.\n\nA continuación se va a recortar el código a 13 dígitos y se intentará comprobar la suma de control.", 
                            padre = self.wids['ventana'])
         codigo = codigo[:13]
     if len(codigo) == 13:
         digitocontrol = self.calcular_digitoc(codigo[:12])
         if codigo[12] != digitocontrol:
             utils.dialogo_info(titulo = "FALLÓ SUMA DE COMPROBACIÓN", 
                                texto = "El dígito de control no es correct"
                                        "o. Se corregirá automáticamente.", 
                                padre = self.wids['ventana'])
             codigo = codigo[:12] + digitocontrol
     descripcion = self.wids['e_descripcion'].get_text()
     linea = pclases.LineaDeProduccion.select(
         pclases.LineaDeProduccion.q.nombre.contains('fibra'))[0]
     lineaembol = pclases.LineaDeProduccion.select(
         pclases.LineaDeProduccion.q.nombre.contains('bolsa'))[0]
     nombre = self.wids['e_nombre'].get_text()
     arancel = self.wids['e_arancel'].get_text()
     try:
         precio = float(self.wids['e_precio'].get_text().replace(',','.'))
     except ValueError:
         precio = producto.preciopordefecto
     try:
         minimo = float(self.wids['e_minimo'].get_text())
     except ValueError:
         minimo = producto.minimo
     try:
         dtex = float(self.wids['e_dtex'].get_text())
     except ValueError:
         dtex = producto.camposEspecificosBala.dtex
     try:
         corte = int(self.wids['e_corte'].get_text())
     except ValueError:
         dtex = producto.camposEspecificosBala.dtex
     gramosBolsa = utils.parse_numero(self.wids['e_gramosBolsa'].get_text())
     producto.camposEspecificosBala.gramosBolsa = gramosBolsa
     bolsasCaja = utils.parse_numero(self.wids['e_bolsasCaja'].get_text())
     producto.camposEspecificosBala.bolsasCaja = bolsasCaja
     cajasPale = utils.parse_numero(self.wids['e_cajasPale'].get_text())
     producto.camposEspecificosBala.cajasPale = cajasPale
     color = self.wids['e_color'].get_text()
     antiuv = self.wids['chk_antiuv'].get_active()
     reciclada = self.wids['ch_reciclada'].get_active()
     idtipoMaterialBala = utils.combo_get_value(self.wids['cb_material']) 
     prodestandar = self.wids['e_prodestandar'].get_text()
     try:
         prodestandar = float(prodestandar)
     except ValueError:
         prodestandar = 0.0
     # Desactivo el notificador momentáneamente
     producto.notificador.activar(lambda: None)
     # Actualizo los datos del objeto
     producto.prodestandar = prodestandar
     try:
         producto.codigo = codigo
     except pclases.psycopg_ProgrammingError:
         try:
             producto_asignado = pclases.ProductoVenta.select(
                 pclases.ProductoVenta.q.codigo == codigo)[0]
             producto_asignado = producto_asignado.descripcion
         except IndexError:
             producto_asignado = "?"
         utils.dialogo_info(titulo = "CÓDIGO DUPLICADO", 
                            texto = "El código EAN %s no se encuentra "
                            "disponible.\nActualmente está asignado a:"
                            " %s" % (codigo, producto_asignado), 
                            padre = self.wids['ventana'])
     producto.descripcion = descripcion
     if producto.camposEspecificosBala.gramosBolsa:
         producto.lineaDeProduccionID = lineaembol.id
     else:
         producto.lineaDeProduccionID = linea.id
     producto.nombre = nombre
     producto.preciopordefecto = precio
     producto.minimo = minimo
     producto.arancel = arancel
     producto.camposEspecificosBala.dtex = dtex
     producto.camposEspecificosBala.corte = corte
     producto.camposEspecificosBala.color = color
     producto.camposEspecificosBala.antiuv = antiuv
     producto.camposEspecificosBala.reciclada = reciclada
     producto.camposEspecificosBala.tipoMaterialBalaID = idtipoMaterialBala
     # Fuerzo la actualización de la BD y no espero a que SQLObject lo 
     # haga por mí:
     producto.syncUpdate()
     # Vuelvo a activar el notificador
     producto.notificador.activar(self.aviso_actualizacion)
     self.actualizar_ventana()
     self.wids['b_guardar'].set_sensitive(False)