Filtrer les couches retirées du flux /api/tiles et de la fusion en direct
Au rechargement de la page, l'index obsolète du worker (16 couches) polluait le /api/tiles fusionné et mergeTilesData réajoutait les couches retirées au menu. viz_meta est désormais filtré aux couches du panneau (PANEL_VIZ) côté serveur, et le panneau client est figé au chargement (clés VIZ_META initiales) : aucun flux ne peut réintroduire de couche hors panneau, même avec un index distant périmé.
This commit is contained in:
@ -3263,6 +3263,10 @@ function finishRunningTasks(d) {
|
|||||||
// l'<img> se recharge et le nouveau rendu remplace l'ancien à l'écran —
|
// l'<img> se recharge et le nouveau rendu remplace l'ancien à l'écran —
|
||||||
// cache navigateur compris.
|
// cache navigateur compris.
|
||||||
let liveTilesStamp = null;
|
let liveTilesStamp = null;
|
||||||
|
// Le panneau est figé au chargement (VIZ_META initial) : le flux /api/tiles
|
||||||
|
// fusionne l'index du worker, qui peut encore proposer des couches retirées
|
||||||
|
// (index obsolète) — on n'ajoute au menu que des clés déjà connues.
|
||||||
|
const PANEL_KEYS = new Set(Object.keys(VIZ_META));
|
||||||
function mergeTilesData(data) {
|
function mergeTilesData(data) {
|
||||||
if (!data || !Array.isArray(data.tiles)) return;
|
if (!data || !Array.isArray(data.tiles)) return;
|
||||||
const byKey = new Map();
|
const byKey = new Map();
|
||||||
@ -3296,7 +3300,7 @@ function mergeTilesData(data) {
|
|||||||
let metaChanged = false;
|
let metaChanged = false;
|
||||||
if (data.viz_meta) {
|
if (data.viz_meta) {
|
||||||
for (const k of Object.keys(data.viz_meta)) {
|
for (const k of Object.keys(data.viz_meta)) {
|
||||||
if (VIZ_META[k]) continue;
|
if (!PANEL_KEYS.has(k) || VIZ_META[k]) continue;
|
||||||
VIZ_META[k] = data.viz_meta[k];
|
VIZ_META[k] = data.viz_meta[k];
|
||||||
if (!state.layers.order.includes(k)) {
|
if (!state.layers.order.includes(k)) {
|
||||||
state.layers.order.push(k);
|
state.layers.order.push(k);
|
||||||
|
|||||||
@ -339,7 +339,12 @@ def test_tiles_endpoint_stamp_diffing(tmp_path, monkeypatch):
|
|||||||
|
|
||||||
|
|
||||||
def test_tiles_endpoint_merges_remote_index(tmp_path, monkeypatch):
|
def test_tiles_endpoint_merges_remote_index(tmp_path, monkeypatch):
|
||||||
"""L'index du worker prime ; le cache local complète les positions perdues."""
|
"""L'index du worker prime ; le cache local complète les positions perdues.
|
||||||
|
|
||||||
|
viz_meta est filtré aux couches du panneau (PANEL_VIZ) : une couche
|
||||||
|
retirée (absente de PANEL_VIZ) proposée par un index obsolète n'est
|
||||||
|
pas réintroduite.
|
||||||
|
"""
|
||||||
import json
|
import json
|
||||||
import lidar_pipeline.webapp as webapp
|
import lidar_pipeline.webapp as webapp
|
||||||
monkeypatch.setattr(webapp, "OUTPUT_DIR", tmp_path)
|
monkeypatch.setattr(webapp, "OUTPUT_DIR", tmp_path)
|
||||||
@ -349,7 +354,10 @@ def test_tiles_endpoint_merges_remote_index(tmp_path, monkeypatch):
|
|||||||
{"col": 1054, "row": 6882, "resolution": 0.2, "viz": {}}, # commun
|
{"col": 1054, "row": 6882, "resolution": 0.2, "viz": {}}, # commun
|
||||||
{"col": 1050, "row": 6882, "resolution": 0.2, "viz": {}}, # local seul
|
{"col": 1050, "row": 6882, "resolution": 0.2, "viz": {}}, # local seul
|
||||||
],
|
],
|
||||||
"viz_meta": {"local": {"label": "Locale"}},
|
"viz_meta": {
|
||||||
|
"aspect": {"label": "Aspect local"},
|
||||||
|
"slope": {"label": "Pente locale"},
|
||||||
|
},
|
||||||
"stats": {},
|
"stats": {},
|
||||||
}), encoding="utf-8")
|
}), encoding="utf-8")
|
||||||
import os
|
import os
|
||||||
@ -361,7 +369,10 @@ def test_tiles_endpoint_merges_remote_index(tmp_path, monkeypatch):
|
|||||||
{"col": 1054, "row": 6882, "resolution": 0.2, "viz": {"slope": {}}},
|
{"col": 1054, "row": 6882, "resolution": 0.2, "viz": {"slope": {}}},
|
||||||
{"col": 1055, "row": 6882, "resolution": 0.2, "viz": {}}, # distant seul
|
{"col": 1055, "row": 6882, "resolution": 0.2, "viz": {}}, # distant seul
|
||||||
],
|
],
|
||||||
"viz_meta": {"slope": {"label": "Pente"}},
|
"viz_meta": {
|
||||||
|
"slope": {"label": "Pente"},
|
||||||
|
"wavelet": {"label": "Ondulets"}, # hors panneau : filtrée
|
||||||
|
},
|
||||||
})
|
})
|
||||||
d = webapp.tiles_data()
|
d = webapp.tiles_data()
|
||||||
entries = {(t["col"], json.dumps(t["viz"], sort_keys=True)) for t in d["tiles"]}
|
entries = {(t["col"], json.dumps(t["viz"], sort_keys=True)) for t in d["tiles"]}
|
||||||
@ -369,7 +380,8 @@ def test_tiles_endpoint_merges_remote_index(tmp_path, monkeypatch):
|
|||||||
assert (1055, '{}') in entries # tuile non cachée visible
|
assert (1055, '{}') in entries # tuile non cachée visible
|
||||||
assert (1050, '{}') in entries # historique local conservé
|
assert (1050, '{}') in entries # historique local conservé
|
||||||
assert d["viz_meta"]["slope"]["label"] == "Pente" # distant prime
|
assert d["viz_meta"]["slope"]["label"] == "Pente" # distant prime
|
||||||
assert d["viz_meta"]["local"]["label"] == "Locale" # local complété
|
assert d["viz_meta"]["aspect"]["label"] == "Aspect local" # local complété
|
||||||
|
assert "wavelet" not in d["viz_meta"] # couche hors panneau filtrée
|
||||||
assert d["stamp"] == remote_stamp # max des deux stamps
|
assert d["stamp"] == remote_stamp # max des deux stamps
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -763,6 +763,13 @@ def tiles_data(stamp: Optional[float] = None):
|
|||||||
keys.add(k)
|
keys.add(k)
|
||||||
viz_meta = dict((data or {}).get("viz_meta") or {})
|
viz_meta = dict((data or {}).get("viz_meta") or {})
|
||||||
viz_meta.update((remote or {}).get("viz_meta") or {})
|
viz_meta.update((remote or {}).get("viz_meta") or {})
|
||||||
|
# Le panneau de couches est figé (PANEL_VIZ) : un index obsolète (ex.
|
||||||
|
# worker antérieur à la restriction) ne doit pas réintroduire de couches
|
||||||
|
# retirées dans le menu au rechargement de la page.
|
||||||
|
from .index import PANEL_VIZ
|
||||||
|
if PANEL_VIZ is not None:
|
||||||
|
allowed = set(PANEL_VIZ)
|
||||||
|
viz_meta = {k: v for k, v in viz_meta.items() if k in allowed}
|
||||||
return {
|
return {
|
||||||
"tiles": merged,
|
"tiles": merged,
|
||||||
"viz_meta": viz_meta,
|
"viz_meta": viz_meta,
|
||||||
|
|||||||
Reference in New Issue
Block a user