def test_validate_fechas_formato_invalidos(self): datos = ['1/1/2014'] self.assertFalse(validate_fechas(datos))
def test_validate_fechas_validos(self): datos = ['01/01/2014', '01/01/14', '16/07/16', '31/07/16'] self.assertTrue(validate_fechas(datos))
def test_validate_fechas_no_fecha(self): datos = ['test'] self.assertFalse(validate_fechas(datos))
def test_validate_fechas_vacias(self): datos = [] self.assertFalse(validate_fechas(datos))
def inferir_metadata_desde_lineas_base_existente(self, base_datos_contacto, lineas_unsafe): """Infiere los metadatos desde las lineas pasadas por parametros. con base de datos exitente Devuelve instancias de MetadataBaseDatosContactoDTO. Copiado desde self.inferir_metadata_desde_lineas() """ assert isinstance(lineas_unsafe, (list, tuple)) lineas = [] for linea in lineas_unsafe: lineas.append( [smart_text(col) for col in linea] ) del lineas_unsafe logger.debug("inferir_metadata_desde_lineas(): %s", lineas) if len(lineas) < 2: logger.debug(_("Se deben proveer al menos 2 lineas: {0}".format(lineas))) raise(NoSePuedeInferirMetadataError(_("Se deben proveer al menos 2 " "lineas para poder inferir " "los metadatos"))) # Primero chequeamos q' haya igual cant. de columnas set_cant_columnas = set([len(linea) for linea in lineas]) if len(set_cant_columnas) != 1: logger.debug("Distintas cantidades " "de columnas: %s", set_cant_columnas) raise(NoSePuedeInferirMetadataError(_("Las lineas recibidas " "poseen distintas cantidades " "de columnas"))) primer_linea = lineas[0] otras_lineas = lineas[1:] metadata = base_datos_contacto.get_metadata() # Ahora chequeamos que haya al menos 1 columna if len(primer_linea) == 0: logger.debug("Las lineas no poseen ninguna " "columna: %s", primer_linea) raise(NoSePuedeInferirMetadataError(_("Las lineas no poseen ninguna " "columna"))) if metadata.cantidad_de_columnas != len(primer_linea): logger.debug("Distintas cantidades " "de columnas: %s", set_cant_columnas) raise (NoSePuedeInferirMetadataError(_("Las lineas recibidas " "poseen distintas cantidades " "de columnas"))) metadata.cantidad_de_columnas = len(primer_linea) # chequeamos que el nombre de las columnas sean los mismo cargado previamente for columna_base, columna_csv in zip(metadata.nombres_de_columnas, primer_linea): if str(columna_base).capitalize() != str(columna_csv).capitalize(): raise (NoSePuedeInferirMetadataErrorEncabezado( _("El nombre de la columna {0} no coincide con el " "guardado en la base ".format(columna_base)))) # ====================================================================== # Primero detectamos columnas de datos # ====================================================================== columnas_con_telefonos = self._inferir_columnas( otras_lineas, validate_telefono) logger.debug("columnas_con_telefonos: %s", columnas_con_telefonos) columnas_con_fechas = self._inferir_columnas( otras_lineas, lambda x: validate_fechas([x])) logger.debug("columnas_con_fechas: %s", columnas_con_fechas) columnas_con_horas = self._inferir_columnas( otras_lineas, lambda x: validate_horas([x])) logger.debug("columnas_con_horas: %s", columnas_con_horas) columna_con_telefono = None if len(columnas_con_telefonos) == 0: logger.debug("No se encontro columna con telefono") else: # Se detecto 1 o mas columnas con telefono. Usamos la 1ra. logger.debug("Se detecto: columnas_con_telefonos: %s", columnas_con_telefonos) if columnas_con_telefonos[0] in columnas_con_fechas: logger.warn(_("La columna con telefono tambien esta entre " "las columnas detectadas como fecha")) elif columnas_con_telefonos[0] in columnas_con_horas: logger.warn(_("La columna con telefono tambien esta entre " "las columnas detectadas como hora")) else: columna_con_telefono = columnas_con_telefonos[0] if columna_con_telefono is not None: metadata.columna_con_telefono = columna_con_telefono metadata.columnas_con_fecha = columnas_con_fechas metadata.columnas_con_hora = columnas_con_horas # Si no hemos inferido nada, salimos if columna_con_telefono is None: # En realidad, al menos el numero de columans debio ser # inferido. Pero si ni siquiera se detecto numero de # telefono, se debe a que (a) hay un bug en esta logica # (b) la BD es invalida. Asi que, de cualquire manera, # no creo q' valga la pena devolver la instancia de mentadata, # me parece mas significativo reportar el hecho de que # no se pudo inferir el metadato. raise(NoSePuedeInferirMetadataError(_("No se pudo inferir ningun " "tipo de dato"))) # ====================================================================== # Si detectamos telefono, fecha u hora podemos verificar si la # primer linea es encabezado o dato # ====================================================================== validaciones_primer_linea = [] if columna_con_telefono is not None: validaciones_primer_linea.append( validate_telefono(primer_linea[columna_con_telefono])) for col_fecha in metadata.columnas_con_fecha: validaciones_primer_linea.append( validate_fechas([primer_linea[col_fecha]])) for col_hora in metadata.columnas_con_hora: validaciones_primer_linea.append( validate_horas([primer_linea[col_hora]])) assert validaciones_primer_linea logger.debug("validaciones_primer_linea: %s", validaciones_primer_linea) primera_fila_es_dato = all(validaciones_primer_linea) metadata.primer_fila_es_encabezado = not primera_fila_es_dato nombres = [] if metadata.primer_fila_es_encabezado: nombres_orig = [x.strip() for x in primer_linea] for num, nombre_columna in enumerate(nombres_orig): nombre_columna = self.sanear_nombre_de_columna(nombre_columna) # si no hay nombre, le asignamos un nombre generico if not nombre_columna: nombre_columna = self.sanear_nombre_de_columna( "COLUMNA_{0}".format(num + 1)) # revisamos q' no se repita con los preexistentes while nombre_columna in nombres: nombre_columna = self.sanear_nombre_de_columna( nombre_columna + "_REPETIDO") nombres.append(nombre_columna) else: nombres = [ self.sanear_nombre_de_columna("Columna {0}".format(num + 1)) for num in range(metadata.cantidad_de_columnas) ] metadata.nombres_de_columnas = nombres return metadata