Ajoute un journal par utilisateur des notifications ntfy et de la présence Tasker
Chaque utilisateur a désormais son propre fichier logs.json dans son
dossier users/<id>/, alimenté automatiquement quand un rappel ntfy est
envoyé (ou échoue) et quand Tasker signale une arrivée ou un départ.
Une nouvelle page /logs, accessible depuis la nav, affiche ces entrées
avec filtres (Tout / Notifications / Présence), et le journal tourne à
500 entrées pour rester compact.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
"""Flat-file storage: JSON files per week for pointages, one file for congés."""
|
||||
import json
|
||||
import secrets
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from calcul import DEFAULT_PLAGES
|
||||
@ -254,3 +255,47 @@ def toggle_conge(date: str, type_conge: str, user_id: str = ""):
|
||||
|
||||
conges.sort(key=lambda c: (c["date"], c["type"]))
|
||||
save_conges(conges, user_id)
|
||||
|
||||
|
||||
# ── Journaux (notifications + présence) ───────────────────────────────────────
|
||||
|
||||
LOG_TYPES = ("notif", "presence")
|
||||
MAX_LOGS = 500
|
||||
|
||||
|
||||
def _logs_file(user_id: str) -> Path:
|
||||
return _user_root(user_id) / "logs.json"
|
||||
|
||||
|
||||
def append_log(user_id: str, entry_type: str, event: str, message: str = "", ts: str | None = None):
|
||||
"""Ajoute une entrée au journal de l'utilisateur (rotation sur MAX_LOGS)."""
|
||||
assert entry_type in LOG_TYPES, f"type de journal invalide: {entry_type!r}"
|
||||
f = _logs_file(user_id)
|
||||
logs = []
|
||||
if f.exists():
|
||||
try:
|
||||
logs = json.loads(f.read_text())
|
||||
except json.JSONDecodeError:
|
||||
logs = []
|
||||
logs.append({
|
||||
"ts": ts or datetime.now().isoformat(timespec="seconds"),
|
||||
"type": entry_type,
|
||||
"event": event,
|
||||
"message": message,
|
||||
})
|
||||
if len(logs) > MAX_LOGS:
|
||||
logs = logs[-MAX_LOGS:]
|
||||
_ensure_user_dirs(user_id)
|
||||
f.write_text(json.dumps(logs, indent=2, ensure_ascii=False))
|
||||
|
||||
|
||||
def load_logs(user_id: str) -> list[dict]:
|
||||
"""Retourne les entrées du journal, des plus récentes aux plus anciennes."""
|
||||
f = _logs_file(user_id)
|
||||
if not f.exists():
|
||||
return []
|
||||
try:
|
||||
logs = json.loads(f.read_text())
|
||||
except json.JSONDecodeError:
|
||||
return []
|
||||
return list(reversed(logs))
|
||||
|
||||
Reference in New Issue
Block a user