File size: 4,687 Bytes
2a1a0bb
 
9c64c2a
 
2a1a0bb
 
9c64c2a
2a1a0bb
 
b2ed3a7
 
2a1a0bb
d974879
 
beba5c6
7f663ee
4bda1b3
d974879
 
2a1a0bb
 
 
 
 
 
beba5c6
2a1a0bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b2ed3a7
 
 
 
 
 
 
 
2a1a0bb
 
 
 
9c64c2a
 
2a1a0bb
 
 
 
 
9c64c2a
 
 
 
 
 
 
 
 
 
 
 
2a1a0bb
 
 
 
 
 
 
 
 
 
 
 
 
beba5c6
2a1a0bb
9c64c2a
257a3b6
9c64c2a
2a1a0bb
 
ba922c7
 
 
51e47a1
ba922c7
51e47a1
ba922c7
 
217f6f5
f5b5257
ba922c7
217f6f5
965f7c0
f5b5257
ba922c7
 
27cfdc8
 
 
ba922c7
9c64c2a
06e718f
9c64c2a
 
 
 
6c15d60
965f7c0
6c15d60
9c64c2a
 
 
 
2a1a0bb
9c64c2a
e5eb1a5
 
 
 
 
 
bfdafe7
e5eb1a5
 
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
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()