Réglages: base_url documentée, boutons copier pour les URLs Tasker, saisie horaire native

Documente la clé base_url (schéma/domaine) déjà supportée par config.json pour les
liens email et URLs de présence, et ajoute un bouton "Copier" à côté de chaque URL
arrivée/départ. Passe aussi les champs horaires du tableau hebdomadaire en <input
type="time"> et journalise l'IP source des appels de présence Tasker.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Antoine
2026-08-20 17:13:18 +02:00
parent 3162968bfb
commit c1c063da51
4 changed files with 88 additions and 16 deletions

View File

@ -385,17 +385,17 @@ def _oob_time_cells(date, jour, plages):
matin_html = (
f'<div id="cg-matin-{_e(date)}" hx-swap-oob="true" class="{matin_cls}">'
f'<div class="time-pair">'
f'<input class="time-input" type="text" name="matin_entree" inputmode="numeric" pattern="[0-9]{2}:[0-9]{2}" maxlength="5" placeholder="--:--" data-date="{_e(date)}" value="{_e(jour["matin_entree"] or "")}">'
f'<input class="time-input" type="time" name="matin_entree" data-date="{_e(date)}" value="{_e(jour["matin_entree"] or "")}">'
f'<span class="time-sep">→</span>'
f'<input class="time-input" type="text" name="matin_sortie" inputmode="numeric" pattern="[0-9]{2}:[0-9]{2}" maxlength="5" placeholder="--:--" data-date="{_e(date)}" value="{_e(jour["matin_sortie"] or "")}">'
f'<input class="time-input" type="time" name="matin_sortie" data-date="{_e(date)}" value="{_e(jour["matin_sortie"] or "")}">'
f'</div></div>'
)
aprem_html = (
f'<div id="cg-aprem-{_e(date)}" hx-swap-oob="true" class="{aprem_cls}">'
f'<div class="time-pair">'
f'<input class="time-input" type="text" name="aprem_entree" inputmode="numeric" pattern="[0-9]{2}:[0-9]{2}" maxlength="5" placeholder="--:--" data-date="{_e(date)}" value="{_e(jour["aprem_entree"] or "")}">'
f'<input class="time-input" type="time" name="aprem_entree" data-date="{_e(date)}" value="{_e(jour["aprem_entree"] or "")}">'
f'<span class="time-sep">→</span>'
f'<input class="time-input" type="text" name="aprem_sortie" inputmode="numeric" pattern="[0-9]{2}:[0-9]{2}" maxlength="5" placeholder="--:--" data-date="{_e(date)}" value="{_e(jour["aprem_sortie"] or "")}">'
f'<input class="time-input" type="time" name="aprem_sortie" data-date="{_e(date)}" value="{_e(jour["aprem_sortie"] or "")}">'
f'</div></div>'
)
return matin_html + aprem_html
@ -882,11 +882,13 @@ def settings_regenerate_presence_token(request: Request):
f'<div id="presence-urls" hx-swap-oob="true">'
f'<div class="settings-urlrow">'
f'<span class="settings-urllabel">Arrivée</span>'
f'<code class="settings-url">{arrivee_url}</code>'
f'<code class="settings-url" id="url-arrivee">{arrivee_url}</code>'
f'<button type="button" class="settings-copy-btn" data-copy-target="url-arrivee">Copier</button>'
f'</div>'
f'<div class="settings-urlrow">'
f'<span class="settings-urllabel">Départ</span>'
f'<code class="settings-url">{depart_url}</code>'
f'<code class="settings-url" id="url-depart">{depart_url}</code>'
f'<button type="button" class="settings-copy-btn" data-copy-target="url-depart">Copier</button>'
f'</div>'
f'<div class="settings-saved">Token régénéré. Mets à jour les URLs dans Automation.</div>'
f'</div>'
@ -937,26 +939,26 @@ def settings_plages_save(
@app.post("/presence/{token}/arrivee")
def presence_arrivee(token: str):
def presence_arrivee(request: Request, token: str):
user_id = find_user_by_token(token)
if not user_id:
logger.warning("POST /presence/.../arrivee: token inconnu")
return JSONResponse({"error": "invalid token"}, status_code=404)
logger.info("présence: arrivée détectée pour %r", user_id)
save_presence(user_id, present=True, since=datetime.now().isoformat())
append_log(user_id, "presence", "arrivée", "Présence détectée par Tasker")
append_log(user_id, "presence", "arrivée", f"Présence détectée par Tasker (IP {_client_ip(request)})")
return {"ok": True}
@app.post("/presence/{token}/depart")
def presence_depart(token: str):
def presence_depart(request: Request, token: str):
user_id = find_user_by_token(token)
if not user_id:
logger.warning("POST /presence/.../depart: token inconnu")
return JSONResponse({"error": "invalid token"}, status_code=404)
logger.info("présence: départ détecté pour %r", user_id)
save_presence(user_id, present=False, since=datetime.now().isoformat())
append_log(user_id, "presence", "départ", "Départ détecté par Tasker")
append_log(user_id, "presence", "départ", f"Départ détecté par Tasker (IP {_client_ip(request)})")
return {"ok": True}