- 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>
74 lines
2.4 KiB
Python
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()
|