feat: log de actividad por usuario

- Tabla activity_log en SQLite (migración automática)
- Registra: login, login_fallido, rda_enviado, rda_masivo, rda_directo,
  automation_run, contrato_creado, contrato_editado, contrato_toggle
- Endpoint GET /logs/actividad con filtros por usuario, acción y fecha
- UI /logs/actividad con badges de color por tipo de acción
- Enlace "Actividad" en navegación lateral

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-10 17:11:33 -05:00
co-authored by Claude Sonnet 4.6
parent 8e29e2d04f
commit c20e1a7476
10 changed files with 257 additions and 0 deletions
View File
+21
View File
@@ -0,0 +1,21 @@
from app.database import get_connection
def log_activity(user_id: int, username: str, accion: str, detalle: str = "", ip: str = ""):
try:
conn = get_connection()
conn.execute(
"INSERT INTO activity_log (user_id, username, accion, detalle, ip) VALUES (?,?,?,?,?)",
(user_id, username, accion, detalle, ip),
)
conn.commit()
conn.close()
except Exception:
pass
def get_ip(request) -> str:
forwarded = request.headers.get("X-Forwarded-For")
if forwarded:
return forwarded.split(",")[0].strip()
return request.client.host if request.client else ""