Frontend: difetti minori dalla revisione del 21/09 #37

Closed
opened 2026-09-21 20:14:54 +00:00 by Adriano · 3 comments
Owner

GRAVITÀ: bassa

  1. src/frontend/flask_app/blueprints/measure.py:511,538,562,585,604,619,647 ; maker.py ; statistics.py:51,104 — a backend giù status_code: 0 usato come status HTTP. VERIFICATO: test client → 0 UNKNOWN.
  2. src/frontend/flask_app/templates/base.html:140 — auto-logout non conta le letture del calibro (il numpad fa preventDefault su keydown, keypress non parte): chi usa solo il calibro viene disconnesso a metà task. PRESUNTO.
  3. src/frontend/flask_app/templates/maker/recipe_editor.html (saveRecipe) + src/backend/services/recipe_service.py:42 — intervallo di misura e immagine, una volta impostati, non si possono più togliere.
  4. src/frontend/flask_app/blueprints/measure.py:396-401 — code concatenato nel path senza quote(): barcode AB/123 → 404; {"code": 5} → 500; ../ raggiunge altri GET del backend coi permessi dell'utente.
  5. src/frontend/flask_app/templates/admin/stations.html:105 — traduzione EN con apostrofo dentro letterale Alpine: errore di espressione su ogni riga. Il pattern '{{ _(...) }}' è diffuso.
  6. src/frontend/flask_app/blueprints/statistics.py:23 ; templates/statistics/dashboard.html:315-316 — tendina ricette limitata a 100; filtri data naive contro func.now() di MySQL (PRESUNTO il fuso).
  7. src/frontend/flask_app/templates/measure/task_execute.html:1446-1452 — countdown a timerRemaining-- mai risincronizzato col server (il banner lo fa ogni 60 s): con tablet in standby resta indietro. PRESUNTO.
  8. src/frontend/flask_app/templates/measure/task_execute.html:933,1091-1097 — measurements solo in memoria: un reload a metà ciclo mostra tutte le quote da misurare; /api/measurements/task-progress esiste e non è usato qui. PRESUNTO.
  9. src/frontend/flask_app/templates/measure/task_execute.html:1252 — il blocco capoturno è deciso sul pf del client, non su result.pass_fail del server.

ORIGINE: revisione fable del 21/09/2026 su ramo V3.0.0, commit 8cc5e82. Documento completo: _output/2026-09-21-TieMeasureFlow-revisione.md su Wasabi.

GRAVITÀ: bassa 1. src/frontend/flask_app/blueprints/measure.py:511,538,562,585,604,619,647 ; maker.py ; statistics.py:51,104 — a backend giù `status_code: 0` usato come status HTTP. VERIFICATO: test client → `0 UNKNOWN`. 2. src/frontend/flask_app/templates/base.html:140 — auto-logout non conta le letture del calibro (il numpad fa preventDefault su keydown, `keypress` non parte): chi usa solo il calibro viene disconnesso a metà task. PRESUNTO. 3. src/frontend/flask_app/templates/maker/recipe_editor.html (saveRecipe) + src/backend/services/recipe_service.py:42 — intervallo di misura e immagine, una volta impostati, non si possono più togliere. 4. src/frontend/flask_app/blueprints/measure.py:396-401 — `code` concatenato nel path senza `quote()`: barcode `AB/123` → 404; `{"code": 5}` → 500; `../` raggiunge altri GET del backend coi permessi dell'utente. 5. src/frontend/flask_app/templates/admin/stations.html:105 — traduzione EN con apostrofo dentro letterale Alpine: errore di espressione su ogni riga. Il pattern `'{{ _(...) }}'` è diffuso. 6. src/frontend/flask_app/blueprints/statistics.py:23 ; templates/statistics/dashboard.html:315-316 — tendina ricette limitata a 100; filtri data naive contro `func.now()` di MySQL (PRESUNTO il fuso). 7. src/frontend/flask_app/templates/measure/task_execute.html:1446-1452 — countdown a `timerRemaining--` mai risincronizzato col server (il banner lo fa ogni 60 s): con tablet in standby resta indietro. PRESUNTO. 8. src/frontend/flask_app/templates/measure/task_execute.html:933,1091-1097 — `measurements` solo in memoria: un reload a metà ciclo mostra tutte le quote da misurare; `/api/measurements/task-progress` esiste e non è usato qui. PRESUNTO. 9. src/frontend/flask_app/templates/measure/task_execute.html:1252 — il blocco capoturno è deciso sul `pf` del client, non su `result.pass_fail` del server. ORIGINE: revisione fable del 21/09/2026 su ramo `V3.0.0`, commit 8cc5e82. Documento completo: `_output/2026-09-21-TieMeasureFlow-revisione.md` su Wasabi.
Adriano added the bug label 2026-09-21 20:14:54 +00:00
Adriano added the assegnata:jeeg label 2026-09-21 20:23:31 +00:00
Author
Owner

⚡ jeeg — preso in carico 2026-09-21T20:23:32Z
ramo: lavoro/jeeg · capacità: docker, gpu, systemd

⚡ jeeg — **preso in carico** 2026-09-21T20:23:32Z ramo: `lavoro/jeeg` · capacità: docker, gpu, systemd
Author
Owner

ANALISI (passo 1) — ramo lavoro/jeeg, worktree ~/lavoro/TieMeasureFlow su jeeg, lotto B1+B2

MODIFICHE B2 (python/altri template):

  1. blueprints measure.py, maker.py, statistics.py: status_code 0 → 502. Fallo in un punto solo: in src/frontend/flask_app/services/api_client.py restituisci 502 invece di 0 quando il backend è irraggiungibile (verifica che nessuno confronti == 0).
  2. templates/maker/recipe_editor.html saveRecipe + src/backend/services/recipe_service.py:42 — QUESTA parte tocca il backend: invia null esplicito quando il campo è svuotato; nel backend distingui «non inviato» da «null» con model_fields_set/exclude_unset per measurement_interval_minutes e image_path (unica eccezione ammessa al confine dei lotti: recipe_service.py righe ~35-50, funzione di update dei metadati; non toccare altro in quel file).
  3. blueprints/measure.py:396-401: urllib.parse.quote(code, safe=""), code non stringa → 400.
  4. templates/admin/stations.html:105 e ogni '{{ _(...) }}' dentro attributi Alpine: usa {{ _('...')|tojson_attr }} (filtro in app.py:122) o sposta la stringa in x-data.
  5. blueprints/statistics.py:23: pagina tutte le ricette (ciclo sulle pagine o per_page massimo consentito dal backend con ciclo).
    MODIFICHE B1 (task_execute.html, base.html):
  6. templates/base.html:140: aggiungi keydown agli eventi di attività.
  7. task_execute.html:1446-1452: countdown calcolato da una scadenza assoluta (deadline = Date.now()+remaining*1000, a ogni tick remaining = ceil((deadline-Date.now())/1000)), e risincronizzazione col server su visibilitychange.
  8. task_execute.html init(): carica da /api/measurements/task-progress (via la route Flask esistente usata da task_list; se manca un proxy adatto, aggiungilo tu in measure.py? NO: measure.py è del lotto B2 — se serve, scrivi MANCA) le quote già misurate nel ciclo corrente.
  9. task_execute.html:1252: il blocco capoturno si decide su result.pass_fail del server.
    TEST: B2: backend giù → 502; barcode AB/123 quotato; {"code":5} → 400; render EN di admin/stations senza errori di apici (parser HTML + controllo che l'attributo sia JS valido a occhio: almeno che non contenga 's ).
ANALISI (passo 1) — ramo `lavoro/jeeg`, worktree `~/lavoro/TieMeasureFlow` su jeeg, lotto B1+B2 MODIFICHE B2 (python/altri template): 1. blueprints measure.py, maker.py, statistics.py: `status_code` 0 → 502. Fallo in un punto solo: in src/frontend/flask_app/services/api_client.py restituisci 502 invece di 0 quando il backend è irraggiungibile (verifica che nessuno confronti `== 0`). 3. templates/maker/recipe_editor.html `saveRecipe` + src/backend/services/recipe_service.py:42 — QUESTA parte tocca il backend: invia `null` esplicito quando il campo è svuotato; nel backend distingui «non inviato» da «null» con `model_fields_set`/`exclude_unset` per `measurement_interval_minutes` e `image_path` (unica eccezione ammessa al confine dei lotti: recipe_service.py righe ~35-50, funzione di update dei metadati; non toccare altro in quel file). 4. blueprints/measure.py:396-401: `urllib.parse.quote(code, safe="")`, `code` non stringa → 400. 5. templates/admin/stations.html:105 e ogni `'{{ _(...) }}'` dentro attributi Alpine: usa `{{ _('...')|tojson_attr }}` (filtro in app.py:122) o sposta la stringa in `x-data`. 6. blueprints/statistics.py:23: pagina tutte le ricette (ciclo sulle pagine o per_page massimo consentito dal backend con ciclo). MODIFICHE B1 (task_execute.html, base.html): 2. templates/base.html:140: aggiungi `keydown` agli eventi di attività. 7. task_execute.html:1446-1452: countdown calcolato da una scadenza assoluta (`deadline = Date.now()+remaining*1000`, a ogni tick `remaining = ceil((deadline-Date.now())/1000)`), e risincronizzazione col server su `visibilitychange`. 8. task_execute.html init(): carica da `/api/measurements/task-progress` (via la route Flask esistente usata da task_list; se manca un proxy adatto, aggiungilo tu in measure.py? NO: measure.py è del lotto B2 — se serve, scrivi MANCA) le quote già misurate nel ciclo corrente. 9. task_execute.html:1252: il blocco capoturno si decide su `result.pass_fail` del server. TEST: B2: backend giù → 502; barcode `AB/123` quotato; `{"code":5}` → 400; render EN di admin/stations senza errori di apici (parser HTML + controllo che l'attributo sia JS valido a occhio: almeno che non contenga `'s `).
Author
Owner

Soluzione

ESITO: fatto
COSA: Fatti: 1 (backend giù → 502), 2 (keydown nell'auto-logout), 3 (intervallo e immagine azzerabili, model_fields_set), 4 (barcode quotato, code non stringa → 400), 5 (stringhe tradotte negli attributi Alpine via tojson_attr), 6 (tendina ricette paginata), 7 (countdown su scadenza assoluta, risincronizzato su visibilitychange), 9 (blocco capoturno sul pass_fail del server). Punto 8 (ripristino del ciclo dopo reload): solo la route proxy; il resto in issue nuova.
COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): cc68612; 2b59c3e; 72f0cb1; f739f96; 31fa78b
PROVA: uv run --extra server --extra client --extra dev pytest -q → 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).

**Soluzione** ESITO: fatto COSA: Fatti: 1 (backend giù → 502), 2 (keydown nell'auto-logout), 3 (intervallo e immagine azzerabili, `model_fields_set`), 4 (barcode quotato, code non stringa → 400), 5 (stringhe tradotte negli attributi Alpine via `tojson_attr`), 6 (tendina ricette paginata), 7 (countdown su scadenza assoluta, risincronizzato su visibilitychange), 9 (blocco capoturno sul `pass_fail` del server). Punto 8 (ripristino del ciclo dopo reload): solo la route proxy; il resto in issue nuova. COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): cc68612; 2b59c3e; 72f0cb1; f739f96; 31fa78b PROVA: `uv run --extra server --extra client --extra dev pytest -q` → 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).
Adriano removed the assegnata:jeeg label 2026-09-21 21:56:45 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#37