Centrer la carte sur le GPS du téléphone (HTTPS terminé par le proxy)

Le bouton ⌖ recentre la carte sur la position GPS du téléphone. L'API
Geolocation exige un contexte sécurisé : la webapp sert désormais du HTTP
et le TLS est porté par le reverse proxy (Traefik, labels dans l'override
local) ; le webapp est transparent au proxy (URLs relatives, X-Forwarded-For
pour la restriction LIDAR_REGEN_CIDR). Ajoute le modèle d'override
docker-compose.webapp.override.yml.example, un rebuild d'index à la demande
et met à jour doc/déploiement ; les tuiles sont servies à la demande.
This commit is contained in:
Antoine Jacquin
2026-09-13 19:57:09 +02:00
parent dd1aca3cfe
commit e2533bac48
16 changed files with 407 additions and 279 deletions

View File

@ -686,63 +686,25 @@ def test_viz_step_labels_without_pipeline():
assert labels["pos_open"] == "Openness positive"
def test_sync_runs_command_then_rebuild(tmp_path, monkeypatch):
"""POST /api/sync exécute LIDAR_SYNC_CMD puis build_index en arrière-plan."""
def test_sync_is_rebuild_only(tmp_path, monkeypatch):
"""/api/sync régénère l'index en arrière-plan (plus de rsync)."""
import time as _time
import lidar_pipeline.webapp as webapp
import lidar_pipeline.index as index_mod
calls = []
monkeypatch.setattr(index_mod, "build_index", lambda out: calls.append(out))
monkeypatch.setattr(webapp, "SYNC_CMD", "exit 0")
webapp._rebuild["done"] = None # ignore l'état d'un test précédent
assert webapp.sync_and_rebuild()["sync"] is True
assert webapp.sync_and_rebuild()["demarré"] is True
for _ in range(200):
s = webapp.rebuild_status()
if s["done"] is not None and not s["running"]:
break
_time.sleep(0.05)
assert calls # l'index a été reconstruit après la synchronisation
assert calls # l'index a été reconstruit
assert webapp.rebuild_status()["error"] is None
assert webapp.rebuild_status()["done"] is not None
def test_sync_failure_reported_but_index_rebuilt(tmp_path, monkeypatch):
"""Un rsync en échec est remonté dans l'état sans bloquer le rebuild."""
import time as _time
import lidar_pipeline.webapp as webapp
import lidar_pipeline.index as index_mod
calls = []
monkeypatch.setattr(index_mod, "build_index", lambda out: calls.append(out))
monkeypatch.setattr(webapp, "SYNC_CMD", "exit 3")
webapp._rebuild["done"] = None
webapp.sync_and_rebuild()
for _ in range(200):
s = webapp.rebuild_status()
if s["done"] is not None and not s["running"]:
break
_time.sleep(0.05)
assert calls # rebuild quand même (données locales éventuelles)
assert "rc=3" in webapp.rebuild_status()["error"]
def test_sync_without_cmd_is_rebuild_only(monkeypatch):
"""Sans LIDAR_SYNC_CMD (machine locale), /api/sync = simple rebuild."""
import time as _time
import lidar_pipeline.webapp as webapp
import lidar_pipeline.index as index_mod
calls = []
monkeypatch.setattr(index_mod, "build_index", lambda out: calls.append(out))
monkeypatch.setattr(webapp, "SYNC_CMD", None)
webapp._rebuild["done"] = None
assert webapp.sync_and_rebuild()["sync"] is False
for _ in range(200):
s = webapp.rebuild_status()
if s["done"] is not None and not s["running"]:
break
_time.sleep(0.05)
assert calls and webapp.rebuild_status()["error"] is None
def test_require_token():
"""Le jeton (si défini) bloque les appels sans ou avec mauvais mauvais header."""
from fastapi import HTTPException
@ -851,25 +813,4 @@ def test_regen_cidr_accepts_comma_separated_list():
webapp.REGEN_CIDR = old
def test_auto_sync_once_skips_when_busy(monkeypatch):
"""Le cycle de cache ne lance rien si un rebuild tourne déjà."""
import time as _time
import lidar_pipeline.webapp as webapp
import lidar_pipeline.index as index_mod
calls = []
monkeypatch.setattr(index_mod, "build_index", lambda out: calls.append(out))
monkeypatch.setattr(webapp, "SYNC_CMD", "exit 0")
# Un cycle démarre bien (sync + rebuild)
assert webapp._auto_sync_once() is True
for _ in range(200):
if not webapp.rebuild_status()["running"]:
break
_time.sleep(0.05)
assert calls
# Rebuild artificiellement occupé : le cycle suivant est sauté sans erreur
webapp._rebuild["running"] = True
try:
assert webapp._auto_sync_once() is False
assert len(calls) == 1
finally:
webapp._rebuild["running"] = False