Update app.py
Browse files
app.py
CHANGED
|
@@ -257,7 +257,7 @@ else:
|
|
| 257 |
except Exception as e:
|
| 258 |
st.error(f"Erro no processamento: {e}")
|
| 259 |
|
| 260 |
-
|
| 261 |
# --- MÓDULO 3: GESTÃO DE USUÁRIOS ---
|
| 262 |
#######################################################
|
| 263 |
elif menu == "Gerenciar Usuários":
|
|
@@ -271,9 +271,6 @@ else:
|
|
| 271 |
|
| 272 |
if st.form_submit_button("Salvar"):
|
| 273 |
try:
|
| 274 |
-
# --- CÁLCULO DO HORÁRIO GMT -3 ---
|
| 275 |
-
# datetime.now() pega a hora do servidor. Subtraímos a diferença.
|
| 276 |
-
# Se o seu servidor já estiver em GMT-3, remova o timedelta.
|
| 277 |
agora_br = obter_hora_brasilia()
|
| 278 |
data_operacao = agora_br.strftime('%Y-%m-%d %H:%M:%S')
|
| 279 |
|
|
@@ -286,8 +283,7 @@ else:
|
|
| 286 |
(n_nome, n_email, gerar_hash(n_senha), n_perfil)
|
| 287 |
)
|
| 288 |
|
| 289 |
-
#
|
| 290 |
-
# Adicionamos a coluna 'data_operacao' explicitamente para garantir o fuso
|
| 291 |
cursor.execute(
|
| 292 |
"""
|
| 293 |
INSERT INTO app_logs_operacoes
|
|
@@ -304,20 +300,53 @@ else:
|
|
| 304 |
|
| 305 |
conn.commit()
|
| 306 |
conn.close()
|
| 307 |
-
st.success(f"Usuário cadastrado
|
|
|
|
| 308 |
|
| 309 |
except Exception as e:
|
| 310 |
st.error(f"Erro: {e}")
|
| 311 |
|
| 312 |
-
#
|
| 313 |
try:
|
| 314 |
conn = get_connection()
|
| 315 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 316 |
conn.close()
|
| 317 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 318 |
except Exception as e:
|
| 319 |
st.error(f"Erro ao listar usuários: {e}")
|
| 320 |
-
|
| 321 |
#######################################################
|
| 322 |
# --- MÓDULO 4: ALUNOS SEM ACESSO NO SEMESTRE ATUAL ---
|
| 323 |
#######################################################
|
|
|
|
| 257 |
except Exception as e:
|
| 258 |
st.error(f"Erro no processamento: {e}")
|
| 259 |
|
| 260 |
+
#######################################################
|
| 261 |
# --- MÓDULO 3: GESTÃO DE USUÁRIOS ---
|
| 262 |
#######################################################
|
| 263 |
elif menu == "Gerenciar Usuários":
|
|
|
|
| 271 |
|
| 272 |
if st.form_submit_button("Salvar"):
|
| 273 |
try:
|
|
|
|
|
|
|
|
|
|
| 274 |
agora_br = obter_hora_brasilia()
|
| 275 |
data_operacao = agora_br.strftime('%Y-%m-%d %H:%M:%S')
|
| 276 |
|
|
|
|
| 283 |
(n_nome, n_email, gerar_hash(n_senha), n_perfil)
|
| 284 |
)
|
| 285 |
|
| 286 |
+
# Registro de Log
|
|
|
|
| 287 |
cursor.execute(
|
| 288 |
"""
|
| 289 |
INSERT INTO app_logs_operacoes
|
|
|
|
| 300 |
|
| 301 |
conn.commit()
|
| 302 |
conn.close()
|
| 303 |
+
st.success(f"Usuário cadastrado com sucesso às {agora_br.strftime('%H:%M:%S')}!")
|
| 304 |
+
st.rerun() # Atualiza a lista abaixo imediatamente
|
| 305 |
|
| 306 |
except Exception as e:
|
| 307 |
st.error(f"Erro: {e}")
|
| 308 |
|
| 309 |
+
# --- LISTAGEM DE USUÁRIOS COM ÚLTIMO ACESSO E STATUS FORMATADO ---
|
| 310 |
try:
|
| 311 |
conn = get_connection()
|
| 312 |
+
# Query com JOIN para buscar o último registro de login de cada usuário
|
| 313 |
+
query_users = """
|
| 314 |
+
SELECT
|
| 315 |
+
u.id,
|
| 316 |
+
u.nome,
|
| 317 |
+
u.email,
|
| 318 |
+
u.perfil,
|
| 319 |
+
u.ativo,
|
| 320 |
+
MAX(l.data_acesso) as ultimo_acesso
|
| 321 |
+
FROM app_usuarios u
|
| 322 |
+
LEFT JOIN app_logs_acesso l ON u.id = l.usuario_id
|
| 323 |
+
GROUP BY u.id
|
| 324 |
+
ORDER BY u.nome ASC
|
| 325 |
+
"""
|
| 326 |
+
df_users = pd.read_sql(query_users, conn)
|
| 327 |
conn.close()
|
| 328 |
+
|
| 329 |
+
if not df_users.empty:
|
| 330 |
+
# 1. Ajuste do Status Ativo (1 -> Sim, 0 -> Não)
|
| 331 |
+
df_users['ativo'] = df_users['ativo'].map({1: 'Sim', 0: 'Não'})
|
| 332 |
+
|
| 333 |
+
# 2. Formatação da Data de Último Acesso
|
| 334 |
+
# Se for Nulo, exibe 'Nunca acessou', senão formata para padrão BR
|
| 335 |
+
df_users['ultimo_acesso'] = df_users['ultimo_acesso'].apply(
|
| 336 |
+
lambda x: x.strftime('%d/%m/%Y %H:%M') if pd.notnull(x) else "Nunca acessou"
|
| 337 |
+
)
|
| 338 |
+
|
| 339 |
+
# Renomear colunas para o cabeçalho da tabela
|
| 340 |
+
df_users.columns = ['ID', 'Nome', 'E-mail', 'Perfil', 'Ativo', 'Último Acesso']
|
| 341 |
+
|
| 342 |
+
st.write("### Usuários Cadastrados")
|
| 343 |
+
st.dataframe(df_users, use_container_width=True, hide_index=True)
|
| 344 |
+
else:
|
| 345 |
+
st.info("Nenhum usuário cadastrado.")
|
| 346 |
+
|
| 347 |
except Exception as e:
|
| 348 |
st.error(f"Erro ao listar usuários: {e}")
|
| 349 |
+
|
| 350 |
#######################################################
|
| 351 |
# --- MÓDULO 4: ALUNOS SEM ACESSO NO SEMESTRE ATUAL ---
|
| 352 |
#######################################################
|