IOI-RUN / auditoria_cleanup.py
Roudrigus's picture
Upload 82 files
0f0ef8d verified
import streamlit as st
from datetime import datetime, timedelta
from banco import SessionLocal
from models import LogAcesso # ✅ usar a tabela correta
from utils_auditoria import registrar_log
def main():
st.title("🧹 Limpeza de Logs de Auditoria")
st.markdown(
"""
Este módulo permite excluir registros antigos de auditoria
para suavizar o banco de dados.
"""
)
opcoes = {
"Último mês": 30,
"Últimos 2 meses": 60,
"Últimos 6 meses": 180,
"Últimos 12 meses": 365,
"Personalizado": None,
}
escolha = st.selectbox("📅 Escolha o período:", list(opcoes.keys()))
data_inicio = None
data_fim = datetime.now()
if escolha != "Personalizado":
dias = opcoes[escolha]
data_inicio = datetime.now() - timedelta(days=dias)
else:
col1, col2 = st.columns(2)
with col1:
data_inicio = st.date_input("Data inicial")
with col2:
data_fim = st.date_input("Data final")
data_inicio = datetime.combine(data_inicio, datetime.min.time())
data_fim = datetime.combine(data_fim, datetime.max.time())
st.info(f"🗓️ Registros de auditoria entre {data_inicio.date()} e {data_fim.date()} serão excluídos.")
st.divider()
# ✅ Prévia do total (opcional, ajuda na decisão)
with SessionLocal() as db:
total_prev = (
db.query(LogAcesso)
.filter(LogAcesso.data_hora >= data_inicio, LogAcesso.data_hora <= data_fim)
.count()
)
st.info(f"🔎 Prévia: {total_prev} registro(s) serão removidos no período selecionado.")
# ✅ Etapa de confirmação via caixa de seleção
st.warning(
"⚠️ **Atenção:** Todos os registros de auditoria no período selecionado serão apagados.\n\n"
"Confirme abaixo para prosseguir."
)
confirmacao = st.selectbox("Confirmar exclusão?", ["Não", "SIM"], index=0)
# Botão de exclusão (só prossegue se confirmação for SIM)
if st.button("❌ Excluir registros de auditoria"):
if confirmacao != "SIM":
st.error("Operação cancelada. Se desejar prosseguir, selecione **SIM** na confirmação.")
return
with SessionLocal() as db:
try:
registros = (
db.query(LogAcesso)
.filter(LogAcesso.data_hora >= data_inicio, LogAcesso.data_hora <= data_fim)
.all()
)
total = len(registros)
if total == 0:
st.warning("Nenhum registro encontrado para exclusão.")
return
for r in registros:
db.delete(r)
db.commit()
registrar_log(
usuario=st.session_state.get("usuario"),
acao=f"Excluiu {total} registros de auditoria entre {data_inicio.date()} e {data_fim.date()}",
tabela="log_acesso",
registro_id=None
)
st.success(f"🎉 {total} registro(s) de auditoria foram excluídos com sucesso!")
except Exception as e:
db.rollback()
st.error(f"❌ Erro ao excluir registros: {e}")