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)})
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)})
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))
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)
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)})
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': [] })
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)
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)})
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))
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)
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
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)
"""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'] } }] } """
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)
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)
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)
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)