Esempio n. 1
0
def aplicar_risco_mongo(self, visaoid, padraoid, parametros_ativos, dest_path):
    """Chama função de aplicação de risco e grava resultado em arquivo."""
    mensagem = 'Aguarde. Aplicando risco no MongoDB. Visão: ' + visaoid
    self.update_state(state=states.STARTED, meta={'status': mensagem})
    mysession = MySession(Base)
    dbsession = mysession.session
    conn = MongoClient(host=MONGODB_URI)
    db = conn[DATABASE]
    gerente = GerenteRisco()
    try:
        self.update_state(state=states.PENDING, meta={'status': mensagem})
        lista_risco = gerente.aplica_risco_por_parametros(
            dbsession,
            visaoid=visaoid,
            padraoid=padraoid,
            parametros_ativos=parametros_ativos,
            base_csv=None,
            db=db)
        if lista_risco:
            csv_salvo = os.path.join(
                dest_path,
                datetime.today().strftime('%Y-%m-%d-%H:%M:%S') + '.csv')
            gerente.save_csv(lista_risco, csv_salvo)
        return {'status': 'Planilha criada com sucesso a partir do MongoDB'}
    except Exception as err:
        logger.error(err, exc_info=True)
        self.update_state(state=states.FAILURE, meta={'status': str(err)})
Esempio n. 2
0
def arquiva_base_csv(self, baseid, base_csv):
    """Copia CSVs para MongoDB e apaga do disco."""
    # Aviso: Esta função rmtree só deve ser utilizada com caminhos seguros,
    # de preferência gerados pela própria aplicação
    self.update_state(state=states.STARTED,
                      meta={'status': 'Aguarde. Arquivando base ' + base_csv})
    mysession = MySession(Base)
    dbsession = mysession.session
    try:
        abase = dbsession.query(BaseOrigem).filter(
            BaseOrigem.id == baseid).first()
        self.update_state(state=states.PENDING,
                          meta={
                              'status':
                              'Aguarde... arquivando base ' + base_csv +
                              ' na base MongoDB ' + abase.nome
                          })
        conn = MongoClient(host=MONGODB_URI)
        db = conn[DATABASE]
        GerenteRisco.csv_to_mongo(db, abase, base_csv)
        shutil.rmtree(base_csv)
        return {'status': 'Base arquivada com sucesso'}
    except Exception as err:
        logger.error(err, exc_info=True)
        self.update_state(state=states.FAILURE, meta={'status': str(err)})
Esempio n. 3
0
def exporta_csv():
    """Grava em arquivo parâmetros ativos.

    Função que cria um arquivo CSV contendo duas colunas(valor e tipo_filtro)
    e realiza a exportação dos dados do parâmetro de risco selecionado.

    Args:
        padraoid: ID do padrão de risco

        riscoid: ID do parâmetro de risco
    """
    dbsession = app.config.get('dbsession')
    padraoid = request.args.get('padraoid')
    riscoid = request.args.get('riscoid')
    gerente = GerenteRisco()
    static_path = os.path.join(APP_PATH,
                               app.config.get('STATIC_FOLDER', 'static'),
                               current_user.name)
    try:
        filename = gerente.parametro_tocsv(
            riscoid, path=static_path, dbsession=dbsession)
        web_filename = filename.split('/')[-1]
        return redirect('/static/%s/%s' % (current_user.name, web_filename))
    except ESemValorParametro as err:
        flash(str(err))
    return redirect(url_for('edita_risco', padraoid=padraoid,
                            riscoid=riscoid))
Esempio n. 4
0
 def test_carga(self):
     # Define parâmetros de risco. Na interface de usuário estes
     # valores deverão estar persistidos em Banco de Dados e/ou serem
     # exportados ou importados via arquivo .csv
     # (GerenteRisco parametros_tocsv e parametros_fromcsv)
     #########################################################
     # Este precisa de uma extração disponível e é pesado
     # Para não rodar, renomeie o método para no_test_carga
     # O pytest só chama os métodos começados com test
     #
     ###################
     filenames = sch_processing(CARGA_ZIP_TEST)
     print(filenames)
     assert filenames is not None
     # assert(len(filenames) == 14)
     padraorisco = carrega_carga(self.session)
     gerente = GerenteRisco()
     gerente.set_padraorisco(padraorisco)
     print(padraorisco.parametros[0].valores)
     # Preferencialmente vai tentar processar o arquivo de conhecimentos
     # Se não houver, pega o primeiro da lista mesmo
     ind = 0
     for index, filename in enumerate(filenames):
         if filename[0].find('Conhecimento'):
             ind = index
             break
     with open(filenames[ind][0]) as show_the_head:
         head = [next(show_the_head) for x in range(5)]
     print(head)
     result = gerente.aplica_risco(arquivo=filenames[ind][0])
     print(result)
Esempio n. 5
0
def aplicar_risco(self, base_csv: str, padraoid: int, visaoid: int,
                  parametros_ativos: list, dest_path: str):
    """Chama função de aplicação de risco e grava resultado em arquivo."""
    mensagem = 'Aguarde. Aplicando risco na base ' + \
        '-'.join(base_csv.split('/')[-3:])
    self.update_state(state=states.STARTED, meta={'status': mensagem})
    mysession = MySession(Base)
    dbsession = mysession.session
    gerente = GerenteRisco()
    try:
        self.update_state(state=states.PENDING, meta={'status': mensagem})
        lista_risco = gerente.aplica_risco_por_parametros(
            dbsession,
            padraoid=padraoid,
            visaoid=visaoid,
            parametros_ativos=parametros_ativos,
            base_csv=base_csv)
        if lista_risco:
            csv_salvo = os.path.join(
                dest_path,
                datetime.today().strftime('%Y-%m-%d-%H:%M:%S') + '.csv')
            gerente.save_csv(lista_risco, csv_salvo)
        return {'status': 'Planilha criada com sucesso'}
    except Exception as err:
        logger.error(str(err), exc_info=True)
        self.update_state(state=states.FAILURE, meta={'status': str(err)})
Esempio n. 6
0
def juncoes():
    """Tela para cadastramento de junções.

    Args:
        baseid: ID da Base de Origem do arquivo

        visaoid: ID objeto de Banco de Dados que espeficica as configurações
        (metadados) da base
    """
    user_folder = os.path.join(CSV_FOLDER, current_user.name)
    dbsession = app.config.get('dbsession')
    baseid = request.args.get('baseid')
    visaoid = request.args.get('visaoid')
    visao_desc = request.args.get('visao_desc', '')
    bases = dbsession.query(BaseOrigem).all()
    tabelas = []
    colunas = []
    headers = []
    arquivos = []
    visoes = []
    if visaoid:
        visao = dbsession.query(Visao).filter(
            Visao.id == visaoid
        ).first()
        if visao:
            tabelas = dbsession.query(Tabela).filter(
                Tabela.visao_id == visaoid
            ).all()
            colunas = dbsession.query(Coluna).filter(
                Coluna.visao_id == visaoid
            ).all()
            baseid = visao.base_id
    if baseid:
        visoes = dbsession.query(Visao).filter(
            Visao.base_id == baseid
        ).order_by(Visao.nome).all()
        gerente = GerenteRisco()
        arquivos = gerente.get_headers_base(baseid, user_folder, csvs=True)
        headers = gerente.get_headers_base(baseid, user_folder)
        print(arquivos)
        print(headers)
    return render_template('gerencia_juncoes.html',
                           baseid=baseid,
                           bases=bases,
                           visaoid=visaoid,
                           visao_desc=visao_desc,
                           visoes=visoes,
                           colunas=colunas,
                           tabelas=tabelas,
                           lista_colunas=headers,
                           lista_arquivos=arquivos)
 def setUp(self):
     db = MongoClient()['unit_test']
     self.db = db
     # Cria documentos simulando registros importados do CARGA
     db['CARGA.Container'].insert({
         'container': 'cheio',
         'conhecimento': '1',
         'pesobrutoitem': '10,00',
         'volumeitem': '1,00'
     })
     db['CARGA.Container'].insert({
         'container': 'cheio2',
         'conhecimento': '2',
         'item': 1,
         'pesobrutoitem': '10,00',
         'volumeitem': '1,00'
     })
     db['CARGA.Conhecimento'].insert({'conhecimento': '1', 'tipo': 'mbl'})
     db['CARGA.Conhecimento'].insert({'conhecimento': '2', 'tipo': 'bl'})
     db['CARGA.NCM'].insert({'conhecimento': '1', 'item': '1', 'ncm': '1'})
     db['CARGA.NCM'].insert({'conhecimento': '2', 'item': '1', 'ncm': '2'})
     db['CARGA.NCM'].insert({'conhecimento': '2', 'item': '2', 'ncm': '3'})
     self.gerente = GerenteRisco()
     self.carga = type('Base', (object, ), {'nome': 'CARGA'})
     self.conhecimentos = type(
         'Tabela', (object, ), {
             'csv_table': 'Conhecimento',
             'primario': 'conhecimento',
             'estrangeiro': 'conhecimento',
         })
     self.containers = type(
         'Tabela', (object, ), {
             'csv_table': 'Container',
             'primario': 'conhecimento',
             'estrangeiro': 'conhecimento',
         })
     self.ncms = type(
         'Tabela', (object, ), {
             'csv_table': 'NCM',
             'primario': 'conhecimento',
             'estrangeiro': 'conhecimento',
         })
     self.containers_conhecimento_ncms = type(
         'Visao', (object, ), {
             'nome': 'ncms_conhecimento',
             'base': self.carga,
             'tabelas': [self.containers, self.conhecimentos, self.ncms],
             'colunas': []
         })
Esempio n. 8
0
def arquiva_base_csv_sync(baseid, base_csv):
    """Copia CSVs para MongoDB e apaga do disco."""
    # Aviso: Esta função rmtree só deve ser utilizada com caminhos seguros,
    # de preferência gerados pela própria aplicação
    mysession = MySession(Base)
    dbsession = mysession.session
    try:
        abase = dbsession.query(BaseOrigem).filter(
            BaseOrigem.id == baseid).first()
        conn = MongoClient(host=MONGODB_URI)
        db = conn[DATABASE]
        GerenteRisco.csv_to_mongo(db, abase, base_csv)
        shutil.rmtree(base_csv)
        return 'Base arquivada com sucesso'
    except Exception as err:
        logger.error(err, exc_info=True)
        return str(err)
Esempio n. 9
0
def importar_base(self, csv_folder, baseid, data, filename, remove=False):
    """Função para upload do arquivo de uma extração ou outra fonte externa.

    Utiliza o :class: `bhadrasana.utils.gerenterisco.GerenteRisco`.
    Suporte por ora para csv com títulos e zip com sch (padrão Carga)
    Ver também :func: `bhadrasana.app.importa_base`

    Args:
        csv_folder: caminho onde será salvo o resultado

        abase: Base de Origem do arquivo

        data: data inicial do período extraído (se não for passada,
        assume hoje)

        filename: arquivo csv, sch+txt, ou conjunto deles em formato zip

        remove: exclui arquivo original no final do processamento
    """
    self.update_state(
        state=states.STARTED,
        meta={'status': 'Processando arquivo ' + filename + '. Aguarde!!!'})
    basefilename = os.path.basename(filename)
    print(basefilename)
    mysession = MySession(Base)
    dbsession = mysession.session
    gerente = GerenteRisco()
    try:
        abase = dbsession.query(BaseOrigem).filter(
            BaseOrigem.id == baseid).first()
        self.update_state(state=states.PENDING,
                          meta={
                              'status':
                              'Processando arquivo ' + basefilename +
                              ' na base ' + abase.nome + '. Aguarde!!!'
                          })
        lista_arquivos = gerente.importa_base(csv_folder, baseid, data,
                                              filename, remove)
        # Sanitizar base já na importação para evitar
        # processamento repetido depois
        gerente.ativa_sanitizacao(ascii_sanitizar)
        gerente.checa_depara(abase)  # Aplicar na importação???
        gerente.pre_processa_arquivos(lista_arquivos)
        return {'status': 'Base ' + data + ' importada com sucesso'}
    except Exception as err:
        logger.error(err, exc_info=True)
        self.update_state(state=states.FAILURE, meta={'status': str(err)})
Esempio n. 10
0
def importa_csv(padraoid, riscoid):
    """Importar arquivo.

    Função que lê um arquivo csv contendo duas colunas(valor e tipo_filtro)
    e realiza a importação dos dados para um parâmetro de risco selecionado.

    Args:
        padraoid: ID do padrão de risco

        riscoid: ID do parâmetro de risco
    """
    dbsession = app.config.get('dbsession')
    if request.method == 'POST':
        if 'csv' not in request.files:
            flash('No file part')
            return redirect(request.url)
        csvf = request.files['csv']
        logger.info('FILE***' + csvf.filename)
        if csvf.filename == '':
            flash('No selected file')
            return redirect(request.url)
        risco = None
        if riscoid:
            risco = dbsession.query(ParametroRisco).filter(
                ParametroRisco.id == riscoid).first()
        if risco is None:
            flash('Não foi selecionado parametro de risco')
            return redirect(request.url)
        if (csvf and '.' in csvf.filename and
            csvf.filename.rsplit('.', 1)[1].lower() == 'csv'):
            # filename = secure_filename(csvf.filename)
            save_name = os.path.join(tmpdir, risco.nome_campo + '.csv')
            csvf.save(save_name)
            logger.info('CSV RECEBIDO: %s' % save_name)
            gerente = GerenteRisco()
            gerente.parametros_fromcsv(risco.nome_campo, session=dbsession)
            logger.info('TESTE: %s %s' % (risco.nome_campo, dbsession))
    return redirect(url_for('edita_risco', padraoid=padraoid,
                            riscoid=riscoid))
Esempio n. 11
0
def edita_depara():
    """Tela para configurar os titulos das bases a serem importadas.

    Args:
        baseid: ID da Base de Origem do arquivo
    """
    dbsession = app.config.get('dbsession')
    baseid = request.args.get('baseid')
    bases = dbsession.query(BaseOrigem).all()
    titulos = []
    headers1 = []
    headers2 = []
    user_folder = os.path.join(CSV_FOLDER, current_user.name)
    print('USER', current_user.name)
    if baseid:
        base = dbsession.query(BaseOrigem).filter(
            BaseOrigem.id == baseid
        ).first()
        if base:
            titulos = base.deparas
            gerente = GerenteRisco()
            headers1 = gerente.get_headers_base(
                baseid, path=user_folder)
            for padrao_risco in base.padroes:
                for parametro in padrao_risco.parametros:
                    headers2.append(parametro.nome_campo)
            if len(headers1) == 0:
                flash('Aviso: nenhuma base exemplo ou configuração muda '
                      'títulos encontrada para sugestão de campo título '
                      'anterior.')
            if len(headers2) == 0:
                flash('Aviso: nenhum parâmetro de risco '
                      'encontrado para sugestão de campo título novo.')
    return render_template('muda_titulos.html', bases=bases,
                           baseid=baseid,
                           titulos=titulos,
                           lista_autocomplete1=headers1,
                           lista_autocomplete2=headers2)
Esempio n. 12
0
 def setUp(self):
     with open(CSV_RISCO_TEST, 'r', newline='') as f:
         reader = csv.reader(f)
         self.lista = [linha for linha in reader]
     self.gerente = GerenteRisco()
     self.client = mongomock.MongoClient()
     self.mongodb = self.client['CARGA']
     self.mongodb.collection.drop()
     for _i in 'abx':
         self.mongodb.collection.create_index(
             _i, unique=False, name='idx' + _i,
             sparse=True, background=True)
     self.bulk_op = self.mongodb.collection.initialize_ordered_bulk_op()
     self.tmpdir = tempfile.mkdtemp()
     # Ensure the file is read/write by the creator only
     self.saved_umask = os.umask(0o077)
     self.db = unittest.mock.MagicMock(return_value='OK')
class TestCase(unittest.TestCase):
    def setUp(self):
        db = MongoClient()['unit_test']
        self.db = db
        # Cria documentos simulando registros importados do CARGA
        db['CARGA.Container'].insert({
            'container': 'cheio',
            'conhecimento': '1',
            'pesobrutoitem': '10,00',
            'volumeitem': '1,00'
        })
        db['CARGA.Container'].insert({
            'container': 'cheio2',
            'conhecimento': '2',
            'item': 1,
            'pesobrutoitem': '10,00',
            'volumeitem': '1,00'
        })
        db['CARGA.Conhecimento'].insert({'conhecimento': '1', 'tipo': 'mbl'})
        db['CARGA.Conhecimento'].insert({'conhecimento': '2', 'tipo': 'bl'})
        db['CARGA.NCM'].insert({'conhecimento': '1', 'item': '1', 'ncm': '1'})
        db['CARGA.NCM'].insert({'conhecimento': '2', 'item': '1', 'ncm': '2'})
        db['CARGA.NCM'].insert({'conhecimento': '2', 'item': '2', 'ncm': '3'})
        self.gerente = GerenteRisco()
        self.carga = type('Base', (object, ), {'nome': 'CARGA'})
        self.conhecimentos = type(
            'Tabela', (object, ), {
                'csv_table': 'Conhecimento',
                'primario': 'conhecimento',
                'estrangeiro': 'conhecimento',
            })
        self.containers = type(
            'Tabela', (object, ), {
                'csv_table': 'Container',
                'primario': 'conhecimento',
                'estrangeiro': 'conhecimento',
            })
        self.ncms = type(
            'Tabela', (object, ), {
                'csv_table': 'NCM',
                'primario': 'conhecimento',
                'estrangeiro': 'conhecimento',
            })
        self.containers_conhecimento_ncms = type(
            'Visao', (object, ), {
                'nome': 'ncms_conhecimento',
                'base': self.carga,
                'tabelas': [self.containers, self.conhecimentos, self.ncms],
                'colunas': []
            })

    def tearDown(self):
        db = self.db
        db['CARGA.NCM'].drop()
        db['CARGA.Conhecimento'].drop()
        db['CARGA.Container'].drop()
        db['CARGA.ContainerVazio'].drop()

    def test_gerente_load_mongo(self):
        lista = self.gerente.load_mongo(self.db,
                                        collection_name='CARGA.Container')
        assert len(lista) == 2

    def test_gerente_juncao1(self):
        # Teste com 1 tabela
        containers_visao = type(
            'Visao', (object, ), {
                'nome': 'containers',
                'base': self.carga,
                'tabelas': [self.containers],
                'colunas': []
            })
        lista = self.gerente.aplica_juncao_mongo(self.db,
                                                 containers_visao,
                                                 filtrar=False)
        assert len(lista) == 3

    def test_gerente_juncao2(self):
        # Teste com 2 tabelas
        containers_conhecimento = type(
            'Visao', (object, ), {
                'nome': 'containers_conhecimento',
                'base': self.carga,
                'tabelas': [self.containers, self.conhecimentos],
                'colunas': []
            })
        lista = self.gerente.aplica_juncao_mongo(self.db,
                                                 containers_conhecimento,
                                                 filtrar=False)
        assert len(lista) == 3

    def test_gerente_juncao3(self):
        # Teste com 3 tabelas
        lista = self.gerente.aplica_juncao_mongo(
            self.db, self.containers_conhecimento_ncms, filtrar=False)
        assert len(lista) == 4

    def test_gerente_juncao_campos(self):
        # Teste com 3 tabelas e lista de campos
        coluna1 = type('Visao', (object, ), {'nome': 'conhecimento'})
        coluna2 = type('Visao', (object, ), {'nome': 'container'})
        self.containers_conhecimento_ncms.colunas = [coluna1, coluna2]
        lista = self.gerente.aplica_juncao_mongo(
            self.db, self.containers_conhecimento_ncms, filtrar=False)
        # pprint.pprint(lista)
        assert len(lista) == 4
        assert len(lista[0]) == 4

    def test_gerente_juncao_filtro_parametros(self):
        # Teste com 3 tabelas e filtro (risco)
        cheio = type('ValorParametro', (object, ), {
            'tipo_filtro': Filtro.igual,
            'valor': 'cheio'
        })
        risco_cheio = type('ParametroRisco', (object, ), {
            'nome_campo': 'container',
            'valores': [cheio]
        })
        ncm = type('ValorParametro', (object, ), {
            'tipo_filtro': Filtro.igual,
            'valor': '3'
        })
        risco_ncm = type('ParametroRisco', (object, ), {
            'nome_campo': 'ncm',
            'valores': [ncm]
        })
        self.gerente.add_risco(risco_cheio)
        self.gerente.add_risco(risco_ncm)
        lista = self.gerente.aplica_juncao_mongo(
            self.db, self.containers_conhecimento_ncms, filtrar=True)
        print('LISTA', lista)
        assert len(lista) == 3
        parametros_ativos = ['ncm']
        lista = self.gerente.aplica_juncao_mongo(
            self.db,
            self.containers_conhecimento_ncms,
            parametros_ativos=parametros_ativos,
            filtrar=True)
        print('LISTA', lista)
        assert len(lista) == 2
        parametros_ativos = ['container']
        lista = self.gerente.aplica_juncao_mongo(
            self.db,
            self.containers_conhecimento_ncms,
            parametros_ativos=parametros_ativos,
            filtrar=True)
        print('LISTA', lista)
        assert len(lista) == 2
        parametros_ativos = ['container', 'ncm']
        lista = self.gerente.aplica_juncao_mongo(
            self.db,
            self.containers_conhecimento_ncms,
            parametros_ativos=parametros_ativos,
            filtrar=True)
        print('LISTA', lista)
        assert len(lista) == 3

    def test_gerente_juncao_filtro2(self):
        cheio = type('ValorParametro', (object, ), {
            'tipo_filtro': Filtro.igual,
            'valor': 'cheio'
        })
        risco_cheio = type('ParametroRisco', (object, ), {
            'nome_campo': 'container',
            'valores': [cheio]
        })
        container_numero_cheio = type('PadraoRisco', (object, ), {
            'nome': 'dummy',
            'parametros': [risco_cheio]
        })

        self.gerente.set_padraorisco(container_numero_cheio)
        lista = self.gerente.aplica_juncao_mongo(
            self.db, self.containers_conhecimento_ncms, filtrar=True)
        print('LISTA', lista)
        assert len(lista) == 2
Esempio n. 14
0
 def test_planilhas_BD(self):
     gerente = GerenteRisco()
     gerente.import_named_csv(CSV_NAMEDRISCO, self.session)
     gerente.parametros_tocsv(self.tmpdir)  # path='.')
     gerente.clear_risco()
     gerente.parametros_fromcsv('alimento', path=self.tmpdir)
Esempio n. 15
0
"""Arquivo temporário para testes exploratórios com novos métodos MongoDB."""
from pymongo import MongoClient

from bhadrasana.models.models import Base, MySession, PadraoRisco, Visao
from bhadrasana.utils.gerente_risco import GerenteRisco

gerente = GerenteRisco()
mysession = MySession(Base, test=False).session
db = MongoClient()['test']
visao = mysession.query(Visao).filter(Visao.id == 1).first()
padrao = mysession.query(PadraoRisco).filter(PadraoRisco.id == 1).first()
gerente.set_padraorisco(padrao)
df = gerente.aplica_juncao_mongo(db,
                                 visao,
                                 parametros_ativos=['cpfcnpjconsignatario'],
                                 filtrar=True,
                                 pandas=False)
print(df)

filtro = {
    '$or': [{
        'alimento': {
            '$in': ['bacon', 'coxinha', 'frutose', 'dextrose de milho']
        }
    }, {
        'esporte': {
            '$in': ['basejump', 'surf', 'ufc', 'escalada']
        }
    }]
}
"""
Esempio n. 16
0
def risco():
    """Função para aplicar parâmetros de risco em arquivo(s) importados.

    Args:
        baseid: ID da Base de Origem do arquivo

        padraoid: ID do padrão de risco aplicável

        visaoid: ID do objeto Visao (junção de CSVs e seleção de campos)

        file: caminho do(s) csv(s) já processados e no diretório

        acao:
            'aplicar' - aplica_risco no diretório file
            'arquivar' - adiciona diretório ao BD e apaga dir
            'excluir' - apaga dir
            'mongo' - busca no banco de dados arquivado
    """
    dbsession = app.config.get('dbsession')
    mongodb = app.config.get('mongodb')
    static_path = os.path.join(APP_PATH,
                               app.config.get('STATIC_FOLDER', 'static'),
                               current_user.name)
    user_folder = os.path.join(CSV_FOLDER, current_user.name)
    try:
        os.mkdir(static_path)
    except FileExistsError:
        pass
    total_linhas = 0
    path = request.args.get('filename', '')
    acao = request.args.get('acao')
    baseid = request.args.get('baseid', '0')
    padraoid = request.args.get('padraoid', '0')
    visaoid = request.args.get('visaoid', '0')
    parametros_ativos = request.args.get('parametros_ativos')
    sync = request.args.get('sync')
    tasks = []
    # Lista de planilhas geradas pelo agendamento de aplica_risco
    planilhas = get_planilhas_criadas_agendamento(static_path)
    print(planilhas)
    task = request.args.get('task')
    if task:
        tasks.append(task)
    if parametros_ativos:
        parametros_ativos = parametros_ativos.split(',')
    bases = dbsession.query(BaseOrigem).order_by(BaseOrigem.nome).all()
    if baseid:
        abase = dbsession.query(BaseOrigem).filter(
            BaseOrigem.id == baseid).first()
        if abase:
            padroes = abase.padroes
            visoes = abase.visoes
        else:
            padroes = []
            visoes = []
    parametros = []
    if path:
        base_csv = os.path.join(user_folder, baseid, path)
    if acao == 'arquivar' or acao == 'excluir':
        try:
            if abase and base_csv:
                if acao == 'excluir':
                    try:
                        shutil.rmtree(base_csv)
                        flash('Base excluída!')
                    except FileNotFoundError as err:
                        flash('Não encontrou arquivo ' + str(err))
                else:
                    # As três linhas antes de chamar a task são para remover
                    # a linha da base escolhida da tela, evitando que o Usuário
                    # tente efetuar novas ações na base que está sendo
                    # arquivada pelo Celery
                    # basedir = os.path.basename(base_csv)
                    # temp_base_csv = os.path.join(tmpdir, basedir)
                    # shutil.move(base_csv, temp_base_csv)
                    if sync:
                        taskid = None
                        flash(arquiva_base_csv_sync(
                            abase.id, base_csv))
                    else:
                        task = arquiva_base_csv.delay(
                            abase.id, base_csv)
                        taskid = task.id
            else:
                flash('Informe Base Original e arquivo!')
        except Exception as err:
            logger.error(err, exc_info=True)
            flash('Erro ao arquivar base! ' +
                  'Detalhes no log da aplicação.')
            flash(type(err))
            flash(err)
        return redirect(url_for('risco', baseid=baseid,
                                task=taskid))
    lista_arquivos = []
    try:
        for ano in os.listdir(os.path.join(user_folder, baseid)):
            for mes in os.listdir(os.path.join(user_folder, baseid, ano)):
                for dia in os.listdir(os.path.join(user_folder,
                                                   baseid, ano, mes)):
                    lista_arquivos.append(ano + '/' + mes + '/' + dia)
    except FileNotFoundError:
        pass
    padrao = dbsession.query(PadraoRisco).filter(
        PadraoRisco.id == padraoid
    ).first()
    if padrao is not None:
        parametros = padrao.parametros

    gerente = GerenteRisco()
    lista_risco = []
    csv_salvo = ''
    try:
        if acao == 'mongo':
            path = 'Arquivo ' + abase.nome if abase else base_csv
            if visaoid == '0':
                if padrao:
                    gerente.set_padraorisco(padrao)
                lista_risco = gerente.load_mongo(
                    mongodb, base=abase,
                    parametros_ativos=parametros_ativos)
            else:
                task = aplicar_risco_mongo.delay(
                    visaoid, padraoid,
                    parametros_ativos, static_path
                )
        else:
            if acao == 'aplicar':
                lista_risco = gerente.aplica_risco_por_parametros(
                    dbsession, padraoid, visaoid,
                    parametros_ativos=parametros_ativos,
                    base_csv=base_csv
                )
            elif acao == 'agendar':
                task = aplicar_risco.delay(
                    base_csv, padraoid, visaoid, parametros_ativos, static_path
                )

    except Exception as err:
        logger.error(err, exc_info=True)
        flash('Erro ao aplicar risco! ' +
              'Detalhes no log da aplicação.')
        flash(type(err))
        flash(err)
    # Salvar resultado um arquivo para donwload
    # Limita resultados em 100 linhas na tela
    if lista_risco:
        csv_salvo = os.path.join(static_path, u'Última planilha.csv')
        gerente.save_csv(lista_risco, csv_salvo)
        total_linhas = len(lista_risco) - 1
        lista_risco = lista_risco[:100]
    if acao and task:
        return redirect(url_for('risco',
                                baseid=baseid,
                                padraoid=padraoid,
                                visaoid=visaoid,
                                filename=path,
                                task=task))
    return render_template('aplica_risco.html',
                           lista_arquivos=lista_arquivos,
                           bases=bases,
                           padroes=padroes,
                           visoes=visoes,
                           baseid=baseid,
                           padraoid=padraoid,
                           visaoid=visaoid,
                           parametros=parametros,
                           parametros_ativos=parametros_ativos,
                           filename=path,
                           csv_salvo=os.path.basename(csv_salvo),
                           lista_risco=lista_risco,
                           total_linhas=total_linhas,
                           tasks=tasks,
                           planilhas=planilhas)
Esempio n. 17
0
def edita_risco():
    """Editar Padrões e Valores de Risco.

    Tela para configurar os parâmetros de risco das bases importadas,
    permite a alteração e criação de novos parâmetros e seus dados.

    Args:
        padraoid: ID do padrão de risco criado e/ou escolhido para
        realizar a alteração

        riscoid: ID do objeto de risco para aplicar a edição
    """
    user_folder = os.path.join(CSV_FOLDER, current_user.name)
    dbsession = app.config.get('dbsession')
    padraoid = request.args.get('padraoid')
    baseid = request.args.get('baseid')
    padroes = dbsession.query(PadraoRisco).order_by(PadraoRisco.nome).all()
    bases = dbsession.query(BaseOrigem).order_by(BaseOrigem.nome).all()
    parametros = []
    headers = []
    basesid = []
    if padraoid:
        padrao = dbsession.query(PadraoRisco).filter(
            PadraoRisco.id == padraoid
        ).first()
        if padrao:
            basesid = padrao.bases
            parametros = padrao.parametros
    riscoid = request.args.get('riscoid')
    valores = []
    if riscoid:
        valor = dbsession.query(ParametroRisco).filter(
            ParametroRisco.id == riscoid
        ).first()
        if valor:
            valores = valor.valores
    headers = []
    if basesid:
        logger.debug(basesid)
        for base in basesid:
            gerente = GerenteRisco()
            logger.debug(base)
            base_id = base.id
            headers = gerente.get_headers_base(
                base_id, path=user_folder)
            headers = list(headers)
            base_headers = [depara.titulo_novo for depara in
                            dbsession.query(DePara).filter(
                                DePara.base_id == base_id
                            ).all()]
            base_headers = list(base_headers)
            headers.extend(base_headers)
        if len(headers) == 0:
            flash('Aviso: nenhuma base exemplo ou configuração muda títulos '
                  'encontrada para sugestão de campo parâmetro.')
        headers.sort()
        logger.debug(headers)
    return render_template('edita_risco.html',
                           padraoid=padraoid,
                           baseid=baseid,
                           padroes=padroes,
                           bases=bases,
                           basesid=basesid,
                           riscoid=riscoid,
                           parametros=parametros,
                           lista_autocomplete=headers,
                           valores=valores)
Esempio n. 18
0
 def test_planilha1(self):
     gerente = GerenteRisco()
     gerente.import_named_csv(CSV_NAMEDRISCO)
     gerente.parametros_tocsv(self.tmpdir)  # path='.')
     gerente.clear_risco()
     gerente.parametros_fromcsv('alimento', path=self.tmpdir)
     # , path='.')
     lista_risco = gerente.aplica_risco(arquivo=CSV_TEST_1)
     print(lista_risco)
Esempio n. 19
0
 def test_planilhas(self):
     gerente = GerenteRisco()
     gerente.import_named_csv(CSV_NAMEDRISCO_TEST)
     gerente.parametros_tocsv(self.tmpdir)  # path='.')
     gerente.clear_risco()
     gerente.parametros_fromcsv('Nome Motorista', path=self.tmpdir)