souzat19 commited on
Commit
77fdcbf
·
verified ·
1 Parent(s): 7ad7699

Rename cadastro.py to app.py

Browse files
Files changed (1) hide show
  1. cadastro.py → app.py +250 -250
cadastro.py → app.py RENAMED
@@ -1,250 +1,250 @@
1
- import sys
2
- from pathlib import Path
3
-
4
- # Adicionar o diretório raiz ao PYTHONPATH
5
- root_dir = Path(__file__).parent.parent
6
- sys.path.append(str(root_dir))
7
-
8
- import streamlit as st
9
- import pandas as pd
10
- from oauth.user_manager import UserManager
11
- from oauth.supabase_conex import SupabaseConnection
12
- from datetime import datetime
13
- from sollai.assistentes import CriaAssistente, AssistenteConfig
14
-
15
- def create_admin_user(email: str, password: str, nome: str, is_admin: bool = False):
16
- """Cria um novo usuário diretamente"""
17
- try:
18
- # Usar admin client para ter permissões totais
19
- admin_client = SupabaseConnection().get_admin_client()
20
-
21
- # 1. Criar usuário na auth
22
- auth_response = admin_client.auth.admin.create_user({
23
- "email": email,
24
- "password": password,
25
- "email_confirm": True,
26
- "user_metadata": {
27
- "nome": nome,
28
- "is_admin": is_admin
29
- }
30
- })
31
-
32
- # Debug detalhado
33
- print("\n=== Debug Auth Response ===")
34
- print(f"Tipo: {type(auth_response)}")
35
- print(f"Dir: {dir(auth_response)}")
36
- print(f"Raw: {auth_response}")
37
-
38
- if not auth_response:
39
- raise Exception("Falha na criação da autenticação")
40
-
41
- # Tentar diferentes formas de acessar o ID
42
- user_id = None
43
- if hasattr(auth_response, 'user'):
44
- user_id = auth_response.user.id
45
- elif hasattr(auth_response, 'id'):
46
- user_id = auth_response.id
47
- else:
48
- # Último recurso: converter para dict
49
- auth_dict = auth_response.model_dump() if hasattr(auth_response, 'model_dump') else vars(auth_response)
50
- print(f"Auth Dict: {auth_dict}")
51
- user_id = auth_dict.get('id') or auth_dict.get('user', {}).get('id')
52
-
53
- if not user_id:
54
- raise Exception("Não foi possível obter o ID do usuário")
55
-
56
- # 2. Inserir dados na tabela public.users
57
- user_data = {
58
- "id": user_id,
59
- "email": email,
60
- "nome": nome,
61
- "is_admin": is_admin,
62
- "created_at": datetime.utcnow().isoformat(),
63
- "updated_at": datetime.utcnow().isoformat(),
64
- "is_active": True
65
- }
66
-
67
- response = admin_client.from_('users')\
68
- .insert(user_data)\
69
- .execute()
70
-
71
- return response.data[0]
72
-
73
- except Exception as e:
74
- print(f"\n=== Erro Detalhado ===")
75
- print(f"Tipo do erro: {type(e)}")
76
- print(f"Mensagem: {str(e)}")
77
- import traceback
78
- print(f"Traceback:\n{traceback.format_exc()}")
79
- raise Exception(f"Erro ao criar usuário: {str(e)}")
80
-
81
- def delete_user(user_id: str):
82
- """Deleta um usuário do sistema"""
83
- try:
84
- admin_client = SupabaseConnection().get_admin_client()
85
-
86
- # 1. Deletar da tabela users primeiro
87
- response = admin_client.from_('users')\
88
- .delete()\
89
- .eq('id', user_id)\
90
- .execute()
91
-
92
- # 2. Deletar da autenticação
93
- auth_response = admin_client.auth.admin.delete_user(user_id)
94
-
95
- return True
96
-
97
- except Exception as e:
98
- print(f"\n=== Erro ao deletar usuário ===")
99
- print(f"Tipo do erro: {type(e)}")
100
- print(f"Mensagem: {str(e)}")
101
- import traceback
102
- print(f"Traceback:\n{traceback.format_exc()}")
103
- raise Exception(f"Erro ao deletar usuário: {str(e)}")
104
-
105
- def create_user(email: str, password: str, nome: str):
106
- """Cria um novo usuário e seu assistente"""
107
- try:
108
- # 1. Criar usuário no Supabase
109
- user = create_admin_user(
110
- email=email,
111
- password=password,
112
- nome=nome,
113
- is_admin=False
114
- )
115
-
116
- # 2. Criar assistente no Pinecone
117
- safe_name = "".join(c for c in nome if c.isalnum() or c.isspace()).strip()
118
- safe_name = safe_name.lower().replace(" ", "-")
119
- assistant_name = f"assistant-{safe_name}-{user['id'][:8]}"
120
-
121
- config = AssistenteConfig(
122
- nome=assistant_name,
123
- instrucoes="Você é uma assistente amigável que responde perguntas do usuário. Responda sempre em português do Brasil."
124
- )
125
-
126
- try:
127
- criador = CriaAssistente()
128
- assistente = criador.criar(config)
129
-
130
- # 3. Atualizar usuário com referências do assistente
131
- admin_client = SupabaseConnection().get_admin_client()
132
- response = admin_client.from_('users')\
133
- .update({
134
- "assistant_name": assistant_name # Salvando apenas o nome
135
- })\
136
- .eq('id', user['id'])\
137
- .execute()
138
-
139
- st.success(f"✅ Usuário {nome} criado com sucesso!")
140
- st.success(f"✅ Assistente '{assistant_name}' criado com sucesso!")
141
-
142
- return response.data[0]
143
-
144
- except Exception as e:
145
- st.error(f"❌ Erro ao criar assistente: {str(e)}")
146
- delete_user(user['id'])
147
- raise
148
-
149
- except Exception as e:
150
- st.error(f"❌ Erro ao criar usuário: {str(e)}")
151
- raise
152
-
153
- def main():
154
- st.set_page_config(page_title="Cadastro de Usuários", page_icon="👤")
155
-
156
- st.title("👤 Cadastro de Usuários")
157
- st.markdown("### Área Administrativa")
158
-
159
- # Formulário de cadastro
160
- with st.form("admin_cadastro_form"):
161
- nome = st.text_input("Nome completo", help="Digite o nome completo do usuário")
162
- email = st.text_input("Email", help="Digite o email do usuário")
163
- password = st.text_input("Senha", type="password", help="Mínimo 6 caracteres")
164
- confirm_password = st.text_input("Confirmar senha", type="password")
165
- is_admin = st.checkbox("👑 Usuário Administrador")
166
-
167
- if st.form_submit_button("Criar Usuário"):
168
- try:
169
- # Validações
170
- if not all([nome, email, password, confirm_password]):
171
- st.error("❌ Todos os campos são obrigatórios!")
172
- st.stop()
173
-
174
- if password != confirm_password:
175
- st.error("❌ As senhas não coincidem!")
176
- st.stop()
177
-
178
- if len(password) < 6:
179
- st.error("❌ A senha deve ter no mínimo 6 caracteres!")
180
- st.stop()
181
-
182
- # Criar usuário
183
- user = create_user(
184
- email=email,
185
- password=password,
186
- nome=nome
187
- )
188
-
189
- st.json(user) # Mostra os dados do usuário criado
190
-
191
- except Exception as e:
192
- st.error(f"❌ Erro ao criar usuário: {str(e)}")
193
-
194
- # Lista de usuários existentes
195
- st.markdown("---")
196
- st.subheader("📋 Usuários Cadastrados")
197
-
198
- try:
199
- admin_client = SupabaseConnection().get_admin_client()
200
- response = admin_client.from_('users').select('*').execute()
201
-
202
- if response.data:
203
- # Criar DataFrame com os dados
204
- df = pd.DataFrame(response.data)
205
-
206
- # Mostrar tabela
207
- st.dataframe(
208
- df,
209
- column_config={
210
- "nome": "Nome",
211
- "email": "Email",
212
- "is_admin": "Admin",
213
- "is_active": "Ativo",
214
- "created_at": "Criado em"
215
- },
216
- hide_index=True
217
- )
218
-
219
- # Seleção de usuário para deletar
220
- usuarios = [(f"{u['nome']} ({u['email']})", u['id']) for u in response.data]
221
- selected_user = st.selectbox(
222
- "Selecione um usuário para deletar:",
223
- options=usuarios,
224
- format_func=lambda x: x[0]
225
- )
226
-
227
- # Botão de deletar com confirmação
228
- if st.button("🗑️ Deletar Usuário"):
229
- if st.session_state.get('is_admin'): # Verifica se é admin
230
- user_id = selected_user[1]
231
-
232
- # Confirmação adicional
233
- if st.warning(f"⚠️ Tem certeza que deseja deletar este usuário? Esta ação não pode ser desfeita."):
234
- try:
235
- delete_user(user_id)
236
- st.success("✅ Usuário deletado com sucesso!")
237
- st.rerun() # Atualiza a página
238
- except Exception as e:
239
- st.error(f"❌ Erro ao deletar usuário: {str(e)}")
240
- else:
241
- st.error("❌ Apenas administradores podem deletar usuários!")
242
-
243
- else:
244
- st.info("Nenhum usuário cadastrado.")
245
-
246
- except Exception as e:
247
- st.error(f"❌ Erro ao listar usuários: {str(e)}")
248
-
249
- if __name__ == "__main__":
250
- main()
 
1
+ import sys
2
+ from pathlib import Path
3
+
4
+ # Adicionar o diretório raiz ao PYTHONPATH
5
+ root_dir = Path(__file__).parent.parent
6
+ sys.path.append(str(root_dir))
7
+
8
+ import streamlit as st
9
+ import pandas as pd
10
+ from user_manager import UserManager
11
+ from supabase_conex import SupabaseConnection
12
+ from datetime import datetime
13
+ from assistentes import CriaAssistente, AssistenteConfig
14
+
15
+ def create_admin_user(email: str, password: str, nome: str, is_admin: bool = False):
16
+ """Cria um novo usuário diretamente"""
17
+ try:
18
+ # Usar admin client para ter permissões totais
19
+ admin_client = SupabaseConnection().get_admin_client()
20
+
21
+ # 1. Criar usuário na auth
22
+ auth_response = admin_client.auth.admin.create_user({
23
+ "email": email,
24
+ "password": password,
25
+ "email_confirm": True,
26
+ "user_metadata": {
27
+ "nome": nome,
28
+ "is_admin": is_admin
29
+ }
30
+ })
31
+
32
+ # Debug detalhado
33
+ print("\n=== Debug Auth Response ===")
34
+ print(f"Tipo: {type(auth_response)}")
35
+ print(f"Dir: {dir(auth_response)}")
36
+ print(f"Raw: {auth_response}")
37
+
38
+ if not auth_response:
39
+ raise Exception("Falha na criação da autenticação")
40
+
41
+ # Tentar diferentes formas de acessar o ID
42
+ user_id = None
43
+ if hasattr(auth_response, 'user'):
44
+ user_id = auth_response.user.id
45
+ elif hasattr(auth_response, 'id'):
46
+ user_id = auth_response.id
47
+ else:
48
+ # Último recurso: converter para dict
49
+ auth_dict = auth_response.model_dump() if hasattr(auth_response, 'model_dump') else vars(auth_response)
50
+ print(f"Auth Dict: {auth_dict}")
51
+ user_id = auth_dict.get('id') or auth_dict.get('user', {}).get('id')
52
+
53
+ if not user_id:
54
+ raise Exception("Não foi possível obter o ID do usuário")
55
+
56
+ # 2. Inserir dados na tabela public.users
57
+ user_data = {
58
+ "id": user_id,
59
+ "email": email,
60
+ "nome": nome,
61
+ "is_admin": is_admin,
62
+ "created_at": datetime.utcnow().isoformat(),
63
+ "updated_at": datetime.utcnow().isoformat(),
64
+ "is_active": True
65
+ }
66
+
67
+ response = admin_client.from_('users')\
68
+ .insert(user_data)\
69
+ .execute()
70
+
71
+ return response.data[0]
72
+
73
+ except Exception as e:
74
+ print(f"\n=== Erro Detalhado ===")
75
+ print(f"Tipo do erro: {type(e)}")
76
+ print(f"Mensagem: {str(e)}")
77
+ import traceback
78
+ print(f"Traceback:\n{traceback.format_exc()}")
79
+ raise Exception(f"Erro ao criar usuário: {str(e)}")
80
+
81
+ def delete_user(user_id: str):
82
+ """Deleta um usuário do sistema"""
83
+ try:
84
+ admin_client = SupabaseConnection().get_admin_client()
85
+
86
+ # 1. Deletar da tabela users primeiro
87
+ response = admin_client.from_('users')\
88
+ .delete()\
89
+ .eq('id', user_id)\
90
+ .execute()
91
+
92
+ # 2. Deletar da autenticação
93
+ auth_response = admin_client.auth.admin.delete_user(user_id)
94
+
95
+ return True
96
+
97
+ except Exception as e:
98
+ print(f"\n=== Erro ao deletar usuário ===")
99
+ print(f"Tipo do erro: {type(e)}")
100
+ print(f"Mensagem: {str(e)}")
101
+ import traceback
102
+ print(f"Traceback:\n{traceback.format_exc()}")
103
+ raise Exception(f"Erro ao deletar usuário: {str(e)}")
104
+
105
+ def create_user(email: str, password: str, nome: str):
106
+ """Cria um novo usuário e seu assistente"""
107
+ try:
108
+ # 1. Criar usuário no Supabase
109
+ user = create_admin_user(
110
+ email=email,
111
+ password=password,
112
+ nome=nome,
113
+ is_admin=False
114
+ )
115
+
116
+ # 2. Criar assistente no Pinecone
117
+ safe_name = "".join(c for c in nome if c.isalnum() or c.isspace()).strip()
118
+ safe_name = safe_name.lower().replace(" ", "-")
119
+ assistant_name = f"assistant-{safe_name}-{user['id'][:8]}"
120
+
121
+ config = AssistenteConfig(
122
+ nome=assistant_name,
123
+ instrucoes="Você é uma assistente amigável que responde perguntas do usuário. Responda sempre em português do Brasil."
124
+ )
125
+
126
+ try:
127
+ criador = CriaAssistente()
128
+ assistente = criador.criar(config)
129
+
130
+ # 3. Atualizar usuário com referências do assistente
131
+ admin_client = SupabaseConnection().get_admin_client()
132
+ response = admin_client.from_('users')\
133
+ .update({
134
+ "assistant_name": assistant_name # Salvando apenas o nome
135
+ })\
136
+ .eq('id', user['id'])\
137
+ .execute()
138
+
139
+ st.success(f"✅ Usuário {nome} criado com sucesso!")
140
+ st.success(f"✅ Assistente '{assistant_name}' criado com sucesso!")
141
+
142
+ return response.data[0]
143
+
144
+ except Exception as e:
145
+ st.error(f"❌ Erro ao criar assistente: {str(e)}")
146
+ delete_user(user['id'])
147
+ raise
148
+
149
+ except Exception as e:
150
+ st.error(f"❌ Erro ao criar usuário: {str(e)}")
151
+ raise
152
+
153
+ def main():
154
+ st.set_page_config(page_title="Cadastro de Usuários", page_icon="👤")
155
+
156
+ st.title("👤 Cadastro de Usuários")
157
+ st.markdown("### Área Administrativa")
158
+
159
+ # Formulário de cadastro
160
+ with st.form("admin_cadastro_form"):
161
+ nome = st.text_input("Nome completo", help="Digite o nome completo do usuário")
162
+ email = st.text_input("Email", help="Digite o email do usuário")
163
+ password = st.text_input("Senha", type="password", help="Mínimo 6 caracteres")
164
+ confirm_password = st.text_input("Confirmar senha", type="password")
165
+ is_admin = st.checkbox("👑 Usuário Administrador")
166
+
167
+ if st.form_submit_button("Criar Usuário"):
168
+ try:
169
+ # Validações
170
+ if not all([nome, email, password, confirm_password]):
171
+ st.error("❌ Todos os campos são obrigatórios!")
172
+ st.stop()
173
+
174
+ if password != confirm_password:
175
+ st.error("❌ As senhas não coincidem!")
176
+ st.stop()
177
+
178
+ if len(password) < 6:
179
+ st.error("❌ A senha deve ter no mínimo 6 caracteres!")
180
+ st.stop()
181
+
182
+ # Criar usuário
183
+ user = create_user(
184
+ email=email,
185
+ password=password,
186
+ nome=nome
187
+ )
188
+
189
+ st.json(user) # Mostra os dados do usuário criado
190
+
191
+ except Exception as e:
192
+ st.error(f"❌ Erro ao criar usuário: {str(e)}")
193
+
194
+ # Lista de usuários existentes
195
+ st.markdown("---")
196
+ st.subheader("📋 Usuários Cadastrados")
197
+
198
+ try:
199
+ admin_client = SupabaseConnection().get_admin_client()
200
+ response = admin_client.from_('users').select('*').execute()
201
+
202
+ if response.data:
203
+ # Criar DataFrame com os dados
204
+ df = pd.DataFrame(response.data)
205
+
206
+ # Mostrar tabela
207
+ st.dataframe(
208
+ df,
209
+ column_config={
210
+ "nome": "Nome",
211
+ "email": "Email",
212
+ "is_admin": "Admin",
213
+ "is_active": "Ativo",
214
+ "created_at": "Criado em"
215
+ },
216
+ hide_index=True
217
+ )
218
+
219
+ # Seleção de usuário para deletar
220
+ usuarios = [(f"{u['nome']} ({u['email']})", u['id']) for u in response.data]
221
+ selected_user = st.selectbox(
222
+ "Selecione um usuário para deletar:",
223
+ options=usuarios,
224
+ format_func=lambda x: x[0]
225
+ )
226
+
227
+ # Botão de deletar com confirmação
228
+ if st.button("🗑️ Deletar Usuário"):
229
+ if st.session_state.get('is_admin'): # Verifica se é admin
230
+ user_id = selected_user[1]
231
+
232
+ # Confirmação adicional
233
+ if st.warning(f"⚠️ Tem certeza que deseja deletar este usuário? Esta ação não pode ser desfeita."):
234
+ try:
235
+ delete_user(user_id)
236
+ st.success("✅ Usuário deletado com sucesso!")
237
+ st.rerun() # Atualiza a página
238
+ except Exception as e:
239
+ st.error(f"❌ Erro ao deletar usuário: {str(e)}")
240
+ else:
241
+ st.error("❌ Apenas administradores podem deletar usuários!")
242
+
243
+ else:
244
+ st.info("Nenhum usuário cadastrado.")
245
+
246
+ except Exception as e:
247
+ st.error(f"❌ Erro ao listar usuários: {str(e)}")
248
+
249
+ if __name__ == "__main__":
250
+ main()