Spaces:
Running
Running
File size: 4,917 Bytes
fe69607 2a1a0bb 9c64c2a fe69607 2a1a0bb 9c64c2a 2a1a0bb fe69607 2a1a0bb d974879 beba5c6 7f663ee 4bda1b3 d974879 2a1a0bb beba5c6 2a1a0bb fe69607 2a1a0bb fe69607 2a1a0bb fe69607 9c64c2a fe69607 9c64c2a fe69607 2a1a0bb beba5c6 fe69607 9c64c2a 2a1a0bb fe69607 ba922c7 fe69607 ba922c7 fe69607 ba922c7 fe69607 ba922c7 fe69607 ba922c7 27cfdc8 fe69607 9c64c2a fe69607 6c15d60 fe69607 9c64c2a e5eb1a5 87d5c73 fe69607 e5eb1a5 fe69607 bfdafe7 fe69607 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
from dotenv import load_dotenv
load_dotenv()
import streamlit as st
import pandas as pd
from sqlalchemy import create_engine, MetaData, Table, delete
from sqlalchemy.orm import sessionmaker
from utils.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:
connection_url = os.getenv("DATABASE_URL")
engine = create_engine(connection_url)
df = pd.read_sql_table(table_name=os.getenv("TABLE_NAME"), con=engine)
return df, engine # Removido o retorno da sessão
# Função para deletar linhas selecionadas
def delete_selected_rows(selected_ids, engine, table):
meta = MetaData()
table = Table(table, meta, autoload_with=engine, schema="public")
Session = sessionmaker(bind=engine)
session = Session()
try:
with session.begin():
for id_value in selected_ids:
stmt = delete(table).where(table.c.id == id_value)
session.execute(stmt)
finally:
session.close() # Garante o fechamento da sessão
# 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')
placeholder = st.empty()
with st.spinner("Carregando dados..."):
# Carrega os dados apenas uma vez
if 'df' not in st.session_state:
df, engine = load_data()
st.session_state.df = df
st.session_state.engine = engine
else:
df = st.session_state.df
engine = st.session_state.engine
# 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=[col for col in all_columns if col not in ['id', 'Seleção']],
placeholder="Selecione uma ou mais colunas",
default=[],
key="column_selector"
)
if selected_columns:
displayed_columns = selected_columns + ['id']
if 'Nome do documento' not in displayed_columns:
displayed_columns.insert(1, 'Nome do documento')
# Remove duplicatas e garante a ordem
displayed_columns = list(dict.fromkeys(displayed_columns))
displayed_df = filtered_df[displayed_columns]
else:
displayed_df = filtered_df
if st.button("🔄", type="tertiary"):
del st.session_state["df"]
st.rerun()
# Exibe o editor com ordem fixa e key estável
selected_df = st.dataframe(
displayed_df,
column_order=[col for col in displayed_df.columns if col != 'Seleção'],
hide_index=False,
key="stable_data_editor",
on_select="rerun",
selection_mode="multi-row"
)
selected_rows = selected_df['selection']['rows']
selected_ids = displayed_df.iloc[selected_rows]["id"].tolist()
# Pega os nomes dos documentos selecionados
selected_docs = displayed_df.iloc[selected_rows]["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('Deletando arquivos...'):
delete_selected_rows(selected_ids, engine, os.getenv("TABLE_NAME"))
st.success(f'Os seguintes documentos foram apagados: {selected_docs}')
del st.session_state["df"]
st.rerun()
|