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
Example #2
0
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)
Example #3
0
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))
Example #4
0
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))
Example #5
0
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
Example #7
0
 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
Example #8
0
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))
Example #9
0
 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
Example #11
0
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