Update app.py
Browse files
app.py
CHANGED
|
@@ -112,6 +112,7 @@ else:
|
|
| 112 |
# OPÇÃO EXCLUSIVA PARA ADMIN
|
| 113 |
if perfil_usuario == 'admin':
|
| 114 |
opcoes_menu.append("Gerenciar Usuários")
|
|
|
|
| 115 |
|
| 116 |
menu = st.sidebar.radio("Navegação", opcoes_menu)
|
| 117 |
|
|
@@ -301,5 +302,45 @@ else:
|
|
| 301 |
|
| 302 |
except Exception as e:
|
| 303 |
st.error(f"Erro ao processar relatório de acessos: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 304 |
|
| 305 |
|
|
|
|
| 112 |
# OPÇÃO EXCLUSIVA PARA ADMIN
|
| 113 |
if perfil_usuario == 'admin':
|
| 114 |
opcoes_menu.append("Gerenciar Usuários")
|
| 115 |
+
opcoes_menu.append("Logs do Sistema")
|
| 116 |
|
| 117 |
menu = st.sidebar.radio("Navegação", opcoes_menu)
|
| 118 |
|
|
|
|
| 302 |
|
| 303 |
except Exception as e:
|
| 304 |
st.error(f"Erro ao processar relatório de acessos: {e}")
|
| 305 |
+
|
| 306 |
+
# --- MÓDULO 5: AUDITORIA DE LOGS (APENAS ADMIN) ---
|
| 307 |
+
elif menu == "Logs do Sistema" and perfil_usuario == 'admin':
|
| 308 |
+
st.title("📜 Auditoria e Logs do Sistema")
|
| 309 |
+
|
| 310 |
+
# Seletor de Tipo de Log
|
| 311 |
+
tipo_log = st.selectbox("Selecione o tipo de registro:",
|
| 312 |
+
["Acessos ao Sistema", "Operações de Usuários"])
|
| 313 |
+
|
| 314 |
+
try:
|
| 315 |
+
conn = get_connection()
|
| 316 |
+
|
| 317 |
+
if tipo_log == "Acessos ao Sistema":
|
| 318 |
+
st.subheader("Histórico de Logins")
|
| 319 |
+
query = "SELECT nome_usuario, email, data_acesso FROM app_logs_acesso ORDER BY data_acesso DESC"
|
| 320 |
+
df_logs = pd.read_sql(query, conn)
|
| 321 |
+
|
| 322 |
+
else:
|
| 323 |
+
st.subheader("Histórico de Alterações Administrativas")
|
| 324 |
+
query = "SELECT nome_executor, operacao, detalhes, data_operacao FROM app_logs_operacoes ORDER BY data_operacao DESC"
|
| 325 |
+
df_logs = pd.read_sql(query, conn)
|
| 326 |
+
|
| 327 |
+
conn.close()
|
| 328 |
+
|
| 329 |
+
if not df_logs.empty:
|
| 330 |
+
# Formatação amigável das datas no Pandas antes de exibir
|
| 331 |
+
col_data = 'data_acesso' if tipo_log == "Acessos ao Sistema" else 'data_operacao'
|
| 332 |
+
df_logs[col_data] = pd.to_datetime(df_logs[col_data]).dt.strftime('%d/%m/%Y %H:%M:%S')
|
| 333 |
+
|
| 334 |
+
st.dataframe(df_logs, use_container_width=True, hide_index=True)
|
| 335 |
+
|
| 336 |
+
# Botão para exportar os logs
|
| 337 |
+
csv = df_logs.to_csv(index=False).encode('utf-8-sig')
|
| 338 |
+
st.download_button(f"📥 Exportar {tipo_log}", csv, f"logs_{tipo_log.lower()}.csv", "text/csv")
|
| 339 |
+
else:
|
| 340 |
+
st.info("Nenhum registro encontrado nesta categoria.")
|
| 341 |
+
|
| 342 |
+
except Exception as e:
|
| 343 |
+
st.error(f"Erro ao carregar logs: {e}")
|
| 344 |
+
|
| 345 |
|
| 346 |
|