cadastro / app.py
souzat19's picture
Rename cadastro.py to app.py
77fdcbf verified
import sys
from pathlib import Path
# Adicionar o diretório raiz ao PYTHONPATH
root_dir = Path(__file__).parent.parent
sys.path.append(str(root_dir))
import streamlit as st
import pandas as pd
from user_manager import UserManager
from supabase_conex import SupabaseConnection
from datetime import datetime
from assistentes import CriaAssistente, AssistenteConfig
def create_admin_user(email: str, password: str, nome: str, is_admin: bool = False):
"""Cria um novo usuário diretamente"""
try:
# Usar admin client para ter permissões totais
admin_client = SupabaseConnection().get_admin_client()
# 1. Criar usuário na auth
auth_response = admin_client.auth.admin.create_user({
"email": email,
"password": password,
"email_confirm": True,
"user_metadata": {
"nome": nome,
"is_admin": is_admin
}
})
# Debug detalhado
print("\n=== Debug Auth Response ===")
print(f"Tipo: {type(auth_response)}")
print(f"Dir: {dir(auth_response)}")
print(f"Raw: {auth_response}")
if not auth_response:
raise Exception("Falha na criação da autenticação")
# Tentar diferentes formas de acessar o ID
user_id = None
if hasattr(auth_response, 'user'):
user_id = auth_response.user.id
elif hasattr(auth_response, 'id'):
user_id = auth_response.id
else:
# Último recurso: converter para dict
auth_dict = auth_response.model_dump() if hasattr(auth_response, 'model_dump') else vars(auth_response)
print(f"Auth Dict: {auth_dict}")
user_id = auth_dict.get('id') or auth_dict.get('user', {}).get('id')
if not user_id:
raise Exception("Não foi possível obter o ID do usuário")
# 2. Inserir dados na tabela public.users
user_data = {
"id": user_id,
"email": email,
"nome": nome,
"is_admin": is_admin,
"created_at": datetime.utcnow().isoformat(),
"updated_at": datetime.utcnow().isoformat(),
"is_active": True
}
response = admin_client.from_('users')\
.insert(user_data)\
.execute()
return response.data[0]
except Exception as e:
print(f"\n=== Erro Detalhado ===")
print(f"Tipo do erro: {type(e)}")
print(f"Mensagem: {str(e)}")
import traceback
print(f"Traceback:\n{traceback.format_exc()}")
raise Exception(f"Erro ao criar usuário: {str(e)}")
def delete_user(user_id: str):
"""Deleta um usuário do sistema"""
try:
admin_client = SupabaseConnection().get_admin_client()
# 1. Deletar da tabela users primeiro
response = admin_client.from_('users')\
.delete()\
.eq('id', user_id)\
.execute()
# 2. Deletar da autenticação
auth_response = admin_client.auth.admin.delete_user(user_id)
return True
except Exception as e:
print(f"\n=== Erro ao deletar usuário ===")
print(f"Tipo do erro: {type(e)}")
print(f"Mensagem: {str(e)}")
import traceback
print(f"Traceback:\n{traceback.format_exc()}")
raise Exception(f"Erro ao deletar usuário: {str(e)}")
def create_user(email: str, password: str, nome: str):
"""Cria um novo usuário e seu assistente"""
try:
# 1. Criar usuário no Supabase
user = create_admin_user(
email=email,
password=password,
nome=nome,
is_admin=False
)
# 2. Criar assistente no Pinecone
safe_name = "".join(c for c in nome if c.isalnum() or c.isspace()).strip()
safe_name = safe_name.lower().replace(" ", "-")
assistant_name = f"assistant-{safe_name}-{user['id'][:8]}"
config = AssistenteConfig(
nome=assistant_name,
instrucoes="Você é uma assistente amigável que responde perguntas do usuário. Responda sempre em português do Brasil."
)
try:
criador = CriaAssistente()
assistente = criador.criar(config)
# 3. Atualizar usuário com referências do assistente
admin_client = SupabaseConnection().get_admin_client()
response = admin_client.from_('users')\
.update({
"assistant_name": assistant_name # Salvando apenas o nome
})\
.eq('id', user['id'])\
.execute()
st.success(f"✅ Usuário {nome} criado com sucesso!")
st.success(f"✅ Assistente '{assistant_name}' criado com sucesso!")
return response.data[0]
except Exception as e:
st.error(f"❌ Erro ao criar assistente: {str(e)}")
delete_user(user['id'])
raise
except Exception as e:
st.error(f"❌ Erro ao criar usuário: {str(e)}")
raise
def main():
st.set_page_config(page_title="Cadastro de Usuários", page_icon="👤")
st.title("👤 Cadastro de Usuários")
st.markdown("### Área Administrativa")
# Formulário de cadastro
with st.form("admin_cadastro_form"):
nome = st.text_input("Nome completo", help="Digite o nome completo do usuário")
email = st.text_input("Email", help="Digite o email do usuário")
password = st.text_input("Senha", type="password", help="Mínimo 6 caracteres")
confirm_password = st.text_input("Confirmar senha", type="password")
is_admin = st.checkbox("👑 Usuário Administrador")
if st.form_submit_button("Criar Usuário"):
try:
# Validações
if not all([nome, email, password, confirm_password]):
st.error("❌ Todos os campos são obrigatórios!")
st.stop()
if password != confirm_password:
st.error("❌ As senhas não coincidem!")
st.stop()
if len(password) < 6:
st.error("❌ A senha deve ter no mínimo 6 caracteres!")
st.stop()
# Criar usuário
user = create_user(
email=email,
password=password,
nome=nome
)
st.json(user) # Mostra os dados do usuário criado
except Exception as e:
st.error(f"❌ Erro ao criar usuário: {str(e)}")
# Lista de usuários existentes
st.markdown("---")
st.subheader("📋 Usuários Cadastrados")
try:
admin_client = SupabaseConnection().get_admin_client()
response = admin_client.from_('users').select('*').execute()
if response.data:
# Criar DataFrame com os dados
df = pd.DataFrame(response.data)
# Mostrar tabela
st.dataframe(
df,
column_config={
"nome": "Nome",
"email": "Email",
"is_admin": "Admin",
"is_active": "Ativo",
"created_at": "Criado em"
},
hide_index=True
)
# Seleção de usuário para deletar
usuarios = [(f"{u['nome']} ({u['email']})", u['id']) for u in response.data]
selected_user = st.selectbox(
"Selecione um usuário para deletar:",
options=usuarios,
format_func=lambda x: x[0]
)
# Botão de deletar com confirmação
if st.button("🗑️ Deletar Usuário"):
if st.session_state.get('is_admin'): # Verifica se é admin
user_id = selected_user[1]
# Confirmação adicional
if st.warning(f"⚠️ Tem certeza que deseja deletar este usuário? Esta ação não pode ser desfeita."):
try:
delete_user(user_id)
st.success("✅ Usuário deletado com sucesso!")
st.rerun() # Atualiza a página
except Exception as e:
st.error(f"❌ Erro ao deletar usuário: {str(e)}")
else:
st.error("❌ Apenas administradores podem deletar usuários!")
else:
st.info("Nenhum usuário cadastrado.")
except Exception as e:
st.error(f"❌ Erro ao listar usuários: {str(e)}")
if __name__ == "__main__":
main()