def parametro_tocsv(self, campo, path=tmpdir, dbsession=None): """Salva parametro em arquivo. Salva os valores do parâmetro de risco em um arquivo csv no formato 'valor', 'tipo_filtro'. """ lista = [] lista.append(('valor', 'tipo_filtro')) dict_filtros = self._riscosativos.get(campo) if dbsession: risco = dbsession.query(ParametroRisco).filter( ParametroRisco.id == campo).first() risco_all = dbsession.query(ValorParametro).filter( ValorParametro.risco_id == campo).all() if risco: campo = risco.nome_campo if risco_all is None and dict_filtros is None: raise ESemValorParametro( 'Não há valores de parâmetro de risco a exportar') for valor in risco_all: filtro = str(valor.tipo_filtro) lista.append((valor.valor, filtro[filtro.find('.') + 1:])) elif dict_filtros: for tipo_filtro, lista_filtros in dict_filtros.items(): for valor in lista_filtros: lista.append((valor, tipo_filtro.name)) sanitizar(campo) filename = os.path.join(path, campo + '.csv') with open(filename, 'w', encoding=ENCODE, newline='') as f: writer = csv.writer(f) writer.writerows(lista) return filename
def trata_registro_pesagem_dte(registro): def float_or_zero(s: str)-> float: try: return float(s) except ValueError: return 0. new_dict = {} for key, value in registro.items(): key = sanitizar(key, mongo_sanitizar) if value is not None: value = sanitizar(value, mongo_sanitizar) new_dict[key] = value new_dict['codigoconteinerentrada'] = new_dict['codigoconteiner_entrada'] new_dict['codigoconteinersaida'] = new_dict['codigoconteiner_saida'] new_dict.pop('codigoconteiner_entrada') new_dict.pop('codigoconteiner_saida') datahoraentrada = new_dict['datahoraentrada'] if datahoraentrada: new_dict['datahoraentradaiso'] = datetime.strptime( new_dict['datahoraentrada'], '%Y-%m-%d %H:%M:%S') datahorasaida = new_dict['datahorasaida'] if datahorasaida: new_dict['datahorasaidaiso'] = datetime.strptime( new_dict['datahorasaida'], '%Y-%m-%d %H:%M:%S') new_dict['pesoentradafloat'] = float_or_zero(new_dict['pesocarregado_entrada'].replace(',', '.')) new_dict['pesosaidafloat'] = float_or_zero(new_dict['pesocarregado_saida'].replace(',', '.')) new_dict['taraentradafloat'] = float_or_zero(new_dict['tara_entrada'].replace(',', '.')) new_dict['tarasaidafloat'] = float_or_zero(new_dict['tara_saida'].replace(',', '.')) new_dict['veiculocarregadosaidabool'] = new_dict['veiculocarregado_saida'] == "sim" new_dict['veiculocarregadoentradabool'] = new_dict['veiculocarregado_entrada'] == "sim" return (new_dict)
def adiciona_parametro(): """Função que adiciona um novo parâmetro de risco. Args: padraoid: ID do padrão de risco risco_novo: Nome do novo parâmetro lista: Lista com os nomes dos novos parâmetros """ dbsession = app.config.get('dbsession') padraoid = request.args.get('padraoid') risco_novo = request.args.get('risco_novo') lista = request.args.get('lista') if risco_novo: sanitizado = sanitizar(risco_novo, norm_function=unicode_sanitizar) risco = ParametroRisco(sanitizado) risco.padraorisco_id = padraoid dbsession.add(risco) dbsession.commit() if lista: nova_lista = [] nova_lista.append(lista) for item in nova_lista[0].split(','): sanitizado = sanitizar(item, norm_function=unicode_sanitizar) risco = ParametroRisco(sanitizado) risco.padraorisco_id = padraoid dbsession.add(risco) dbsession.commit() return redirect(url_for('edita_risco', padraoid=padraoid))
def adiciona_depara(): """De_para - troca títulos. Função que permite unificar o nome de colunas que possuem o mesmo conteúdo. Esta função realiza a troca do titulo de uma coluna por outro, permitindo que duas colunas que tragam a mesma informação em bases diferentes sejam filtradas por um único parâmetro de risco. Args: baseid: ID da Base de Origem do arquivo titulo_antigo: Titulo original da base a ser importada titulo_novo: Titulo unificado """ dbsession = app.config.get('dbsession') baseid = request.args.get('baseid') padraoid = request.args.get('padraoid') titulo_antigo = sanitizar(request.args.get('antigo'), norm_function=unicode_sanitizar) titulo_novo = sanitizar(request.args.get('novo'), norm_function=unicode_sanitizar) if baseid: base = dbsession.query(BaseOrigem).filter( BaseOrigem.id == baseid ).first() depara = DePara(titulo_antigo, titulo_novo, base) dbsession.add(depara) dbsession.commit() return redirect(url_for('edita_depara', baseid=baseid, padraoid=padraoid))
def muda_titulos_lista(lista, de_para_dict, make_copy=True): """Muda titulos. Recebe um dicionário na forma titulo_old:titulo_new e muda a linha de titulo da lista. Passar copy=False para listas grandes faz a modificação in-line na lista original (muito mais rápido) modificando a lista original e retornando ela mesma. O padrão é copiar a lista e deixar intocada a lista original Args: plista: lista de listas representando a planilha a ter títulos modificados de_para_dict: dicionário titulo_antigo: titulo_novo copy: Se False, modifica original """ if make_copy: lista = deepcopy(lista) for r in range(len(lista[0])): # Se título não está no de_para, retorna ele mesmo titulo = sanitizar(lista[0][r], norm_function=ascii_sanitizar) novo_titulo = de_para_dict.get(titulo, titulo) lista[0][r] = novo_titulo return lista
def get_headers_base(self, baseorigemid, path, csvs=False): """Retorna lista de headers. Busca última base disponível no diretório de CSVs e traz todos os headers """ lista_csv = [] cabecalhos = [] cabecalhos_nao_repetidos = set() print('caminho........', path) caminho = os.path.join(path, str(baseorigemid)) if not os.path.isdir(caminho): return set() for r in range(3): ano_mes_dia = sorted(os.listdir(caminho)) if len(ano_mes_dia) == 0: return set() caminho = os.path.join(caminho, ano_mes_dia[-1]) print(caminho) for arquivo in os.listdir(caminho): lista_csv.append(arquivo[:-4]) with open(os.path.join(caminho, arquivo), 'r', encoding=ENCODE, newline='') as f: reader = csv.reader(f) cabecalho = next(reader) cabecalhos.extend(cabecalho) for word in cabecalhos: new_word = sanitizar(word, norm_function=unicode_sanitizar) cabecalhos_nao_repetidos.add(new_word) if csvs: return lista_csv return cabecalhos_nao_repetidos
def test_sanitizar(self): antes = 'TESTE de SANitização bagunçado.' antes2 = 'Teste número 2' depois = 'teste de sanitizacao baguncado.' depois2 = 'teste numero 2' s = sanitizar(antes) assert s == depois s = sanitizar(antes, norm_function=ascii_sanitizar) assert s == depois s = sanitizar(antes, norm_function=unicode_sanitizar) assert s == depois lista = [antes, antes2] listas = sanitizar_lista(lista) assert listas[0] == depois assert listas[1] == depois2 lista = [[antes, antes2], [antes2, antes]] listas = sanitizar_lista(lista) assert listas[0][0] == depois assert listas[0][1] == depois2 assert listas[1][1] == depois assert listas[1][0] == depois2
def adiciona_valor(): """Função que adiciona um novo valor ao parâmetro de risco selecionado. Args: padraoid: ID do padrão de risco novo_valor: Nome do valor a ser inserido no parâmetro tipo_filtro: Filtro que este valor deverá ser buscado nas bases """ dbsession = app.config.get('dbsession') padraoid = request.args.get('padraoid') novo_valor = request.args.get('novo_valor') tipo_filtro = request.args.get('filtro') valor = sanitizar(novo_valor, norm_function=unicode_sanitizar) filtro = sanitizar(tipo_filtro, norm_function=unicode_sanitizar) riscoid = request.args.get('riscoid') valor = ValorParametro(valor, filtro) valor.risco_id = riscoid dbsession.add(valor) dbsession.commit() return redirect(url_for('edita_risco', padraoid=padraoid, riscoid=riscoid))
def test_sanitizar(self): for norm_function in {ascii_sanitizar, unicode_sanitizar}: teste = 'teste' esperado = 'teste' sanitizado = sanitizar(teste, norm_function=norm_function) assert sanitizado == esperado teste = 'Cafézinho' esperado = 'cafezinho' sanitizado = sanitizar(teste, norm_function=norm_function) assert teste != sanitizado assert sanitizado == esperado teste = 'LOUCO dos espAçõs e Tabulações!!!' esperado = 'louco dos espacos e tabulacoes!!!' sanitizado = sanitizar(teste, norm_function=norm_function) assert teste != sanitizado assert sanitizado == esperado teste = 'Cafézinho não pode estar frio!!! 2017-11-28. ' + \ 'teste Sentença comprida, Ruian Metals ou ruian metals?' esperado = 'cafezinho nao pode estar frio!!! 2017-11-28. ' + \ 'teste sentenca comprida, ruian metals ou ruian metals?' sanitizado = sanitizar(teste, norm_function=norm_function) assert teste != sanitizado assert sanitizado == esperado
def dump(self, objeto): original = super().dump(objeto) result = {} for k, v in self.carga_fields.items(): result[k] = sanitizar(original.get(v)) return result
def xml_todict(xml) -> dict: """Recebe um XML string stream, retorna um dict com campos do XML. Lê o XML que acompanha as imagens no formato do Escâner da ALFSTS, retorna dict(s) com os dados considerados mais importantes e resumos (ex.: número do(s) cc(s), datas, etc) - configurar na var. fields Args: xml: string de texto na memória com o conteúdo do arquivo XML Returns: Dicionário com as tags selecionadas. A tag container é uma lista (imagens de cc de 20' podem conter dois contêineres escaneados) """ result = {} try: root = ET.fromstring(xml) except ET.ParseError as err: # pragma: no cover print(err) print('*****************XML**********************') print(xml) print('*****************XML END') xml = unicode_sanitizar(xml) # logger.error(err, exc_info=True) try: root = ET.fromstring(xml) except ET.ParseError as err: print('*****************XML**********************') print(xml) print('*****************XML END') print(str(err)) return result alerta = \ (xml.find('>AL<') != -1) or \ (xml.find('>al<') != -1) or \ (xml.find('>ALER') != -1) or \ (xml.find('>aler') != -1) or \ (xml.find('>Aler') != -1) result['alerta'] = alerta allfields = [*FIELDS, *XML_DEPARA.keys()] for field in allfields: for tag in root.iter(field): text = '' if tag.text: text = sanitizar(tag.text) if field in DATE_FIELDS: for char in 'tT_': text = text.replace(char, ' ') try: text = text.replace(',', '.') parse_str = '%Y-%m-%d %H:%M:%S.%Z' text = datetime.strptime(text, parse_str) except ValueError as err: logger.info('text: %s parser: %s err: %s' % (text, parse_str, err)) try: text = text.split('.')[0] text = text.replace('Z', '') text = text.replace('z', '') parse_str = '%Y-%m-%d %H:%M:%S' text = datetime.strptime(text, parse_str) except ValueError as err: logger.info('text: %s parser: %s err: %s' % (text, parse_str, err)) akey = XML_DEPARA.get(field) if akey is None: akey = field result[akey.lower()] = text lista_conteineres = [] for tag in root.iter('attribute'): if tag.attrib.get('name') in TAGS_NUMERO: numero = tag.text lista_conteineres.append(numero.casefold()) for atag in TAGS_NUMERO: for tag in root.iter(atag): numero = tag.text if numero is not None: numero = numero.replace('?', 'X') lista_conteineres.append(numero.casefold()) result['container'] = lista_conteineres return result