adicionado sessão de login persistente
This commit is contained in:
parent
2a296d759f
commit
2fadd723dc
202
manager.py
202
manager.py
@ -7,9 +7,123 @@ import plotly.express as px
|
|||||||
import os
|
import os
|
||||||
import redis
|
import redis
|
||||||
|
|
||||||
|
# 1. Primeiro: Configuração da página
|
||||||
|
st.set_page_config(
|
||||||
|
page_title="TranscreveZAP by Impacte AI",
|
||||||
|
page_icon="🎙️",
|
||||||
|
layout="wide",
|
||||||
|
initial_sidebar_state="expanded",
|
||||||
|
)
|
||||||
|
|
||||||
# Conectar ao Redis
|
# 2. Depois: Inicialização do Redis
|
||||||
redis_client = redis.Redis(host=os.getenv('REDIS_HOST', 'localhost'), port=int(os.getenv('REDIS_PORT', 6380)), decode_responses=True)
|
redis_client = redis.Redis(
|
||||||
|
host=os.getenv('REDIS_HOST', 'localhost'),
|
||||||
|
port=int(os.getenv('REDIS_PORT', 6380)),
|
||||||
|
decode_responses=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# 3. Funções de sessão (atualizado para usar st.query_params)
|
||||||
|
def init_session():
|
||||||
|
"""Inicializa o sistema de sessão"""
|
||||||
|
if 'session_id' not in st.session_state:
|
||||||
|
# Verificar se existe uma sessão válida no Redis
|
||||||
|
session_token = st.query_params.get('session', None)
|
||||||
|
if session_token:
|
||||||
|
session_data = redis_client.get(f"session:{session_token}")
|
||||||
|
if session_data:
|
||||||
|
st.session_state.session_id = session_token
|
||||||
|
st.session_state.authenticated = True
|
||||||
|
return
|
||||||
|
|
||||||
|
# Se não houver sessão válida, gerar um novo ID
|
||||||
|
st.session_state.session_id = None
|
||||||
|
st.session_state.authenticated = False
|
||||||
|
|
||||||
|
# Garantir que init_session seja chamado antes de qualquer coisa
|
||||||
|
init_session()
|
||||||
|
|
||||||
|
def create_session():
|
||||||
|
"""Cria uma nova sessão no Redis"""
|
||||||
|
import uuid
|
||||||
|
session_id = str(uuid.uuid4())
|
||||||
|
expiry = 7 * 24 * 60 * 60 # 7 dias em segundos
|
||||||
|
|
||||||
|
# Salvar sessão no Redis
|
||||||
|
redis_client.setex(f"session:{session_id}", expiry, "active")
|
||||||
|
|
||||||
|
# Atualizar estado da sessão
|
||||||
|
st.session_state.session_id = session_id
|
||||||
|
st.session_state.authenticated = True
|
||||||
|
|
||||||
|
# Adicionar session_id como parâmetro de URL
|
||||||
|
st.query_params['session'] = session_id
|
||||||
|
|
||||||
|
def end_session():
|
||||||
|
"""Encerra a sessão atual"""
|
||||||
|
if 'session_id' in st.session_state and st.session_state.session_id:
|
||||||
|
# Remover sessão do Redis
|
||||||
|
redis_client.delete(f"session:{st.session_state.session_id}")
|
||||||
|
|
||||||
|
# Limpar todos os estados relevantes
|
||||||
|
for key in ['session_id', 'authenticated', 'username']:
|
||||||
|
if key in st.session_state:
|
||||||
|
del st.session_state[key]
|
||||||
|
|
||||||
|
# Remover parâmetro de sessão da URL
|
||||||
|
if 'session' in st.query_params:
|
||||||
|
del st.query_params['session']
|
||||||
|
|
||||||
|
# 4. Inicializar a sessão
|
||||||
|
init_session()
|
||||||
|
|
||||||
|
# Estilos CSS personalizados
|
||||||
|
st.markdown("""
|
||||||
|
<style>
|
||||||
|
.main > div {
|
||||||
|
padding-top: 2rem;
|
||||||
|
}
|
||||||
|
.stButton>button {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.stTextInput>div>div>input, .stSelectbox>div>div>select {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
h1, h2, h3 {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.sidebar-header {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ffffff;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.footer a {
|
||||||
|
color: #ffffff;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.main > div {
|
||||||
|
padding-top: 1rem;
|
||||||
|
}
|
||||||
|
.sidebar-header {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
""", unsafe_allow_html=True)
|
||||||
|
|
||||||
|
# Configuração do storage
|
||||||
|
storage = StorageHandler()
|
||||||
|
|
||||||
# Dicionário de idiomas em português
|
# Dicionário de idiomas em português
|
||||||
IDIOMAS = {
|
IDIOMAS = {
|
||||||
@ -68,63 +182,6 @@ def fetch_whatsapp_groups(server_url, instance, api_key):
|
|||||||
if response.text:
|
if response.text:
|
||||||
st.error(f"Resposta do servidor: {response.text}")
|
st.error(f"Resposta do servidor: {response.text}")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
# Configuração da página
|
|
||||||
st.set_page_config(
|
|
||||||
page_title="TranscreveZAP by Impacte AI",
|
|
||||||
page_icon="🎙️",
|
|
||||||
layout="wide",
|
|
||||||
initial_sidebar_state="expanded",
|
|
||||||
)
|
|
||||||
|
|
||||||
# Estilos CSS personalizados
|
|
||||||
st.markdown("""
|
|
||||||
<style>
|
|
||||||
.main > div {
|
|
||||||
padding-top: 2rem;
|
|
||||||
}
|
|
||||||
.stButton>button {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.stTextInput>div>div>input, .stSelectbox>div>div>select {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
h1, h2, h3 {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
.sidebar-header {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 2rem;
|
|
||||||
}
|
|
||||||
.footer {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: 100%;
|
|
||||||
background-color: #000000;
|
|
||||||
color: #ffffff;
|
|
||||||
text-align: center;
|
|
||||||
padding: 10px 0;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
.footer a {
|
|
||||||
color: #ffffff;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
.main > div {
|
|
||||||
padding-top: 1rem;
|
|
||||||
}
|
|
||||||
.sidebar-header {
|
|
||||||
font-size: 1.2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
""", unsafe_allow_html=True)
|
|
||||||
|
|
||||||
# Configuração do storage
|
|
||||||
storage = StorageHandler()
|
|
||||||
|
|
||||||
# Função para carregar configurações do Redis para o Streamlit
|
# Função para carregar configurações do Redis para o Streamlit
|
||||||
def load_settings():
|
def load_settings():
|
||||||
@ -189,21 +246,34 @@ def login_page():
|
|||||||
submit_button = st.form_submit_button('Entrar')
|
submit_button = st.form_submit_button('Entrar')
|
||||||
if submit_button:
|
if submit_button:
|
||||||
if username == os.getenv('MANAGER_USER') and password == os.getenv('MANAGER_PASSWORD'):
|
if username == os.getenv('MANAGER_USER') and password == os.getenv('MANAGER_PASSWORD'):
|
||||||
st.session_state.authenticated = True
|
create_session()
|
||||||
|
st.success("Login realizado com sucesso!")
|
||||||
st.experimental_rerun()
|
st.experimental_rerun()
|
||||||
else:
|
else:
|
||||||
st.error('Credenciais inválidas')
|
st.error('Credenciais inválidas')
|
||||||
|
|
||||||
|
# Modificar a função de logout no dashboard
|
||||||
def dashboard():
|
def dashboard():
|
||||||
show_logo()
|
show_logo()
|
||||||
st.sidebar.markdown('<div class="sidebar-header">TranscreveZAP - Menu</div>', unsafe_allow_html=True)
|
st.sidebar.markdown('<div class="sidebar-header">TranscreveZAP - Menu</div>', unsafe_allow_html=True)
|
||||||
|
# Mostrar nome do usuário logado (se disponível)
|
||||||
|
if hasattr(st.session_state, 'session_id'):
|
||||||
|
st.sidebar.markdown("---")
|
||||||
|
st.sidebar.markdown("👤 **Usuário Conectado**")
|
||||||
|
|
||||||
page = st.sidebar.radio(
|
page = st.sidebar.radio(
|
||||||
"Navegação",
|
"Navegação",
|
||||||
["📊 Painel de Controle", "👥 Gerenciar Grupos", "🚫 Gerenciar Bloqueios", "⚙️ Configurações"]
|
["📊 Painel de Controle", "👥 Gerenciar Grupos", "🚫 Gerenciar Bloqueios", "⚙️ Configurações"]
|
||||||
)
|
)
|
||||||
if st.sidebar.button("Sair"):
|
|
||||||
st.session_state.authenticated = False
|
# Botão de logout
|
||||||
st.experimental_rerun()
|
if st.sidebar.button("🚪 Sair da Conta"):
|
||||||
|
confirm = st.sidebar.empty()
|
||||||
|
if confirm.button("✅ Confirmar Saída"):
|
||||||
|
end_session()
|
||||||
|
st.experimental_rerun()
|
||||||
|
elif st.sidebar.button("❌ Cancelar"):
|
||||||
|
st.experimental_rerun()
|
||||||
|
|
||||||
if page == "📊 Painel de Controle":
|
if page == "📊 Painel de Controle":
|
||||||
show_statistics()
|
show_statistics()
|
||||||
@ -794,9 +864,11 @@ def manage_settings():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
st.error(f"Erro ao salvar configurações: {str(e)}")
|
st.error(f"Erro ao salvar configurações: {str(e)}")
|
||||||
|
|
||||||
if "authenticated" not in st.session_state:
|
# Adicionar no início da execução principal
|
||||||
st.session_state.authenticated = False
|
if __name__ == "__main__":
|
||||||
|
init_session()
|
||||||
|
|
||||||
|
# Modificar a parte final do código
|
||||||
if st.session_state.authenticated:
|
if st.session_state.authenticated:
|
||||||
dashboard()
|
dashboard()
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user