import streamlit as st import pandas as pd from sqlalchemy import create_engine, MetaData, Table, delete from sqlalchemy.orm import sessionmaker from filter import filter_dataframe import os import time # Dados de login USERNAME = os.getenv("username") PASSWORD = os.getenv("password") # Configurações da página st.set_page_config( page_title="Banco de Dados - GeoCosmos", page_icon="⛰️", layout="wide" ) # Função para autenticação do usuário def authenticate_user(username: str, password: str) -> bool: return username == USERNAME and password == PASSWORD # Tela de login def login_screen(): st.subheader('⛰️ Banco de Dados - GeoCosmos') with st.form(key='login_form'): username = st.text_input("Nome de usuário") password = st.text_input("Senha", type='password') # Botão para submeter o formulário submit_button = st.form_submit_button('Entrar') if submit_button: if authenticate_user(username, password): st.session_state['logged_in'] = True st.rerun() else: st.error('Nome de usuário ou senha inválidos') # Função para ler dados da tabela SQL a partir de um arquivo def load_data() -> pd.DataFrame: # Acesse as variáveis de ambiente dialect = os.getenv("DB_DIALECT") driver = os.getenv("DB_DRIVER") username = os.getenv("DB_USERNAME") password = os.getenv("DB_PASSWORD") host = os.getenv("DB_HOST") port = os.getenv("DB_PORT") database = os.getenv("DB_DATABASE") connection_url = f"{dialect}+{driver}://{username}:{password}@{host}:{port}/{database}" engine = create_engine(connection_url) Session = sessionmaker(bind=engine) session = Session() with open('query.sql', 'r', encoding='utf-8') as file: query = file.read() df = pd.read_sql(query, engine) return df, engine, session # Função para deletar linhas selecionadas def delete_selected_rows(selected_ids, engine, session): meta = MetaData() table = Table('Extraction', meta, autoload_with=engine) with session.begin(): for id_value in selected_ids: stmt = delete(table).where(table.c.id == id_value) session.execute(stmt) session.commit() # Função para download dos dados como CSV def convert_df_to_csv(df): return df.to_csv(index=False).encode('utf-8') # Verificar o estado de login if 'logged_in' not in st.session_state: st.session_state['logged_in'] = False # Se o usuário não está logado, exibe a tela de login if not st.session_state['logged_in']: login_screen() else: st.header('⛰️ Banco de Dados - GeoCosmos') df, engine, session = load_data() # Aplica o filtro ao dataframe filtered_df = filter_dataframe(df) all_columns = filtered_df.columns.tolist() selected_columns = st.multiselect( 'Escolha as colunas para exibir:', options=[column for column in all_columns if column != 'id'], placeholder="Selecione uma ou mais colunas", default=[] ) if selected_columns: selected_columns.append('id') selected_columns.append('Nome do documento') displayed_df = filtered_df[selected_columns] else: displayed_df = filtered_df # Adiciona a coluna de seleção displayed_df.insert(0, 'Seleção', False) # Exibe o dataframe filtrado com checkboxes para seleção edited_df = st.data_editor(displayed_df, disabled=[col for col in displayed_df.columns if col != 'Seleção'], hide_index=False, column_order = [col for col in displayed_df.columns if col != 'id']) # Verifica se há pelo menos um checkbox selecionado selected_ids = edited_df.loc[edited_df['Seleção'], 'id'].tolist() # Pega os nomes dos documentos selecionados selected_docs = edited_df.loc[edited_df['Seleção'], 'Nome do documento'].tolist() if selected_ids: with st.popover("APAGAR"): st.warning("Você está prestes a apagar dados. Esta ação não pode ser desfeita.") confirmation = st.text_input("Digite 'APAGAR' e pressione ENTER para confirmar a deleção:") if confirmation == "APAGAR": if st.button("CONFIRMAR"): with st.spinner('Delentando arquivos...'): delete_selected_rows(selected_ids, engine, session) st.success(f'Os seguintes documentos foram apagados: {selected_docs}') selected_ids = [] time.sleep(3) st.rerun()