patchcenter/app/services/quickwin_log_service.py
Khalid MOUTAOUAKIL e96d79aae3 QuickWin: prereq/snapshot services, referentiel, logs, correspondance
- Split quickwin services: prereq, snapshot, log services
- Add referentiel router and template
- QuickWin detail: prereq/snapshot terminal divs for production
- Server edit partial updates
- QuickWin correspondance and logs templates
- Base template updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 18:13:00 +02:00

74 lines
2.4 KiB
Python

"""Service logs QuickWin — journalisation des actions et erreurs par campagne"""
from sqlalchemy import text
def log_entry(db, run_id, step, level, message, detail=None,
entry_id=None, hostname=None, created_by=None):
"""Ajoute une ligne de log pour un run QuickWin.
level: info, warn, error, success"""
db.execute(text("""
INSERT INTO quickwin_logs (run_id, entry_id, hostname, step, level, message, detail, created_by)
VALUES (:rid, :eid, :host, :step, :lvl, :msg, :det, :by)
"""), {
"rid": run_id, "eid": entry_id, "host": hostname,
"step": step, "lvl": level, "msg": message,
"det": detail, "by": created_by,
})
def log_info(db, run_id, step, message, **kwargs):
log_entry(db, run_id, step, "info", message, **kwargs)
def log_warn(db, run_id, step, message, **kwargs):
log_entry(db, run_id, step, "warn", message, **kwargs)
def log_error(db, run_id, step, message, **kwargs):
log_entry(db, run_id, step, "error", message, **kwargs)
def log_success(db, run_id, step, message, **kwargs):
log_entry(db, run_id, step, "success", message, **kwargs)
def get_logs(db, run_id, level=None, step=None, hostname=None, limit=500):
"""Recupere les logs d'un run avec filtres optionnels."""
where = ["run_id = :rid"]
params = {"rid": run_id}
if level:
where.append("level = :lvl")
params["lvl"] = level
if step:
where.append("step = :step")
params["step"] = step
if hostname:
where.append("hostname ILIKE :host")
params["host"] = f"%{hostname}%"
params["lim"] = limit
return db.execute(text(f"""
SELECT * FROM quickwin_logs
WHERE {' AND '.join(where)}
ORDER BY created_at DESC
LIMIT :lim
"""), params).fetchall()
def get_log_stats(db, run_id):
"""Compteurs par level pour un run."""
return db.execute(text("""
SELECT level, COUNT(*) as cnt
FROM quickwin_logs WHERE run_id = :rid
GROUP BY level ORDER BY level
"""), {"rid": run_id}).fetchall()
def clear_logs(db, run_id, step=None):
"""Supprime les logs d'un run (optionnel: seulement une etape)."""
if step:
db.execute(text("DELETE FROM quickwin_logs WHERE run_id = :rid AND step = :step"),
{"rid": run_id, "step": step})
else:
db.execute(text("DELETE FROM quickwin_logs WHERE run_id = :rid"), {"rid": run_id})
db.commit()