Spaces:
Sleeping
Sleeping
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() | |