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:
co-authored by
Claude Sonnet 4.6
parent
8e29e2d04f
commit
c20e1a7476
@@ -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 ""
|
||||
Reference in New Issue
Block a user