IOI-RUN / auditoria.py
Roudrigus's picture
Upload 82 files
0f0ef8d verified
raw
history blame
2.96 kB
import streamlit as st
from banco import SessionLocal
from models import LogAcesso, Usuario
import pandas as pd
from io import BytesIO
import os
# Debug opcional – confirma o banco em uso
print("📂 BANCO LIDO NA AUDITORIA:", os.path.abspath("load.db"))
def main():
st.title("🧾 Auditoria do Sistema Load")
db = SessionLocal()
try:
# =========================
# FILTRO POR PERFIL
# =========================
perfis = (
db.query(Usuario.perfil)
.distinct()
.order_by(Usuario.perfil)
.all()
)
lista_perfis = ["Todos"] + [p[0] for p in perfis]
perfil_selecionado = st.selectbox(
"Filtrar por perfil:",
lista_perfis
)
# =========================
# CONSULTA COM JOIN
# =========================
# ✅ Incluímos o e-mail do usuário na seleção
query = (
db.query(
LogAcesso.usuario,
Usuario.perfil,
Usuario.email, # <-- novo
LogAcesso.acao,
LogAcesso.tabela,
LogAcesso.registro_id,
LogAcesso.data_hora
)
.join(Usuario, Usuario.usuario == LogAcesso.usuario)
.order_by(LogAcesso.data_hora.desc())
)
if perfil_selecionado != "Todos":
query = query.filter(Usuario.perfil == perfil_selecionado)
logs = query.all()
if not logs:
st.info("Nenhum registro encontrado.")
return
# =========================
# DATAFRAME FORMATADO
# =========================
dados = []
for l in logs:
# l = (usuario, perfil, email, acao, tabela, registro_id, data_hora)
dados.append({
"Usuário": l[0],
"Perfil": l[1],
"E-mail": l[2] or "—", # ✅ e-mail pode ser nulo
"Ação": l[3],
"Tabela": l[4],
"Registro": l[5],
"Data": l[6].strftime("%d/%m/%Y"),
"Hora": l[6].strftime("%H:%M:%S"),
})
df = pd.DataFrame(dados)
st.dataframe(df, use_container_width=True)
# =========================
# EXPORTAÇÃO PARA EXCEL
# =========================
buffer = BytesIO()
with pd.ExcelWriter(buffer, engine="openpyxl") as writer:
df.to_excel(writer, index=False, sheet_name="Auditoria")
st.download_button(
label="📥 Exportar Auditoria para Excel",
data=buffer.getvalue(),
file_name="auditoria_sistema.xlsx",
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
finally:
db.close()