diff --git a/app/main.py b/app/main.py
index c1beaa6..ff5eb72 100644
--- a/app/main.py
+++ b/app/main.py
@@ -24,7 +24,7 @@ from models import (
from calcul import compute_week, minutes_to_hhmm, hhmm_to_minutes, heures_dues
from stats import compute_all_stats
from export import export_semaine_ods, export_annee_ods
-from notifications import reminder_loop
+from notifications import reminder_loop, send_ntfy
logging.basicConfig(
level=getattr(logging, load_config().get("log_level", "DEBUG").upper(), logging.DEBUG),
@@ -594,6 +594,39 @@ def settings_save(
return RedirectResponse("/settings?saved=1", status_code=303)
+@app.post("/settings/test-ntfy", response_class=HTMLResponse)
+def settings_test_ntfy(request: Request):
+ user_id = _get_user(request)
+ if not user_id:
+ return RedirectResponse("/login", status_code=302)
+
+ notif = load_notif_config(user_id)
+ topic = notif.get("ntfy_topic")
+ server = notif.get("ntfy_server", "https://ntfy.sh")
+
+ if not topic:
+ logger.warning("test ntfy: pas de topic configuré pour %r", user_id)
+ return HTMLResponse(
+ '
'
+ 'Renseigne et enregistre un topic ntfy avant de tester.'
+ '
'
+ )
+
+ logger.info("test ntfy: envoi de test pour %r sur %r/%r", user_id, server, topic)
+ ok = send_ntfy(
+ server, topic,
+ "Ceci est une notification de test — ta configuration ntfy fonctionne.",
+ "Test pointeuse", user_id=user_id,
+ )
+ cls = "settings-saved" if ok else "settings-error"
+ msg = ("Notification envoyée. Vérifie ton téléphone, elle doit arriver en quelques secondes."
+ if ok else
+ "Échec de l'envoi. Vérifie le serveur et le topic, et l'optimisation batterie de l'app ntfy.")
+ return HTMLResponse(
+ f'