feat: limite de 20 registros e botao de limpar log (admin)
This commit is contained in:
+38
-5
@@ -2,25 +2,58 @@
|
||||
Rota /log: histórico de ações do painel (LOG_PAINEL, app/db/log.py) e,
|
||||
quando configurado, os últimos envios automáticos de chave via WhatsApp
|
||||
(Data Table pagamentos_processados do n8n, app/n8n_client.py).
|
||||
|
||||
Mostra só os 20 registros de LOG_PAINEL mais recentes — sem paginação.
|
||||
Administradores têm um botão para limpar o histórico inteiro
|
||||
(POST /log/limpar); db_log.limpar() apaga tudo e o router grava, logo em
|
||||
seguida, uma única entrada de auditoria registrando quem limpou e quando
|
||||
— por isso o histórico nunca fica sem nenhuma explicação do que
|
||||
aconteceu com ele.
|
||||
"""
|
||||
from typing import Optional
|
||||
from urllib.parse import urlencode
|
||||
|
||||
from fastapi import APIRouter, Depends, Request
|
||||
from fastapi.responses import HTMLResponse
|
||||
from fastapi.responses import HTMLResponse, RedirectResponse
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
from .. import n8n_client
|
||||
from ..auth import exigir_login
|
||||
from ..auth import UsuarioLogado, exigir_admin, exigir_login
|
||||
from ..csrf import exigir_csrf, token_do_contexto
|
||||
from ..db import log as db_log
|
||||
|
||||
router = APIRouter()
|
||||
templates = Jinja2Templates(directory="app/templates")
|
||||
|
||||
LIMITE_ACOES = 20
|
||||
|
||||
|
||||
def _redirect_com_mensagem(mensagem: str, tipo: str = "success") -> RedirectResponse:
|
||||
return RedirectResponse(f"/log?{urlencode({'mensagem': mensagem, 'mensagem_tipo': tipo})}", status_code=303)
|
||||
|
||||
|
||||
@router.get("/log", response_class=HTMLResponse)
|
||||
def pagina(request: Request, usuario: str = Depends(exigir_login)):
|
||||
acoes = db_log.listar(limite=100)
|
||||
def pagina(
|
||||
request: Request,
|
||||
mensagem: Optional[str] = None,
|
||||
mensagem_tipo: Optional[str] = None,
|
||||
usuario: UsuarioLogado = Depends(exigir_login),
|
||||
):
|
||||
acoes = db_log.listar(limite=LIMITE_ACOES)
|
||||
envios = n8n_client.listar_envios(limite=50)
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"log.html",
|
||||
{"acoes": acoes, "envios": envios, "envios_configurado": n8n_client.configurado()},
|
||||
{
|
||||
"acoes": acoes, "envios": envios, "envios_configurado": n8n_client.configurado(),
|
||||
"eh_admin": usuario.eh_admin, "csrf_token": token_do_contexto(request),
|
||||
"mensagem": mensagem, "mensagem_tipo": mensagem_tipo,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.post("/log/limpar", dependencies=[Depends(exigir_csrf)])
|
||||
def limpar(usuario: UsuarioLogado = Depends(exigir_admin)):
|
||||
db_log.limpar()
|
||||
db_log.registrar(str(usuario), "limpar", "log", None, True)
|
||||
return _redirect_com_mensagem("Log limpo.")
|
||||
|
||||
@@ -5,6 +5,12 @@
|
||||
<h1>Log</h1>
|
||||
|
||||
<h2>Ações no painel</h2>
|
||||
{% if eh_admin %}
|
||||
<form method="post" action="/log/limpar" style="margin-bottom:14px">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
||||
<button type="submit" onclick="return confirm('Limpar todo o histórico de ações? Isso não pode ser desfeito.')">Limpar log</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if acoes %}
|
||||
<div class="tabela-wrap">
|
||||
<table>
|
||||
|
||||
Reference in New Issue
Block a user