Pagina di misura: dopo un reload le quote già misurate nel ciclo non vengono ripristinate #40

Closed
opened 2026-09-21 21:56:03 +00:00 by Adriano · 3 comments
Owner

COSA: task_execute.html tiene measurements solo in memoria; F5, redirect del timer o auto-logout a metà ciclo mostrano tutte le quote da misurare, e rimisurarle produce doppioni in SPC.
PERCHÉ NON È STATO CHIUSO IN #37: /api/measurements/task-progress dà solo conteggi aggregati per task, non i dati per quota (subtask_id, value, pass_fail), e fuori da una produzione non distingue un ciclo dal precedente.
GIÀ FATTO: route proxy GET /measure/api/task-progress/<task_id> in src/frontend/flask_app/blueprints/measure.py (commit cc68612).
CRITERIO DI FATTO: il backend espone le misure del ciclo corrente per quota (serve un identificatore di ciclo sul run, o il filtro production_run_id + numero di ciclo su GET /api/measurements); init() ripopola measurements e posiziona currentIndex.

ORIGINE: residui dichiarati alla chiusura delle issue della revisione del 21/09/2026.

COSA: `task_execute.html` tiene `measurements` solo in memoria; F5, redirect del timer o auto-logout a metà ciclo mostrano tutte le quote da misurare, e rimisurarle produce doppioni in SPC. PERCHÉ NON È STATO CHIUSO IN #37: `/api/measurements/task-progress` dà solo conteggi aggregati per task, non i dati per quota (subtask_id, value, pass_fail), e fuori da una produzione non distingue un ciclo dal precedente. GIÀ FATTO: route proxy `GET /measure/api/task-progress/<task_id>` in src/frontend/flask_app/blueprints/measure.py (commit cc68612). CRITERIO DI FATTO: il backend espone le misure del ciclo corrente per quota (serve un identificatore di ciclo sul run, o il filtro `production_run_id` + numero di ciclo su GET /api/measurements); `init()` ripopola `measurements` e posiziona `currentIndex`. ORIGINE: residui dichiarati alla chiusura delle issue della revisione del 21/09/2026.
Adriano added the sviluppo label 2026-09-21 21:56:03 +00:00
Author
Owner

ESITO: richiesta
RIF: gitea:Adriano/TieMeasureFlow#40
COSA: analisi (passo 1). Ripristinare dopo un reload le quote già misurate nel ciclo in corso.
CONFINE DEL CICLO, senza migrazione: dentro un production run R, per il task T, il ciclo corrente comincia all'ultimo evento di production_events di R fra start, cycle_completed, e remeasure con task T. Le misure del ciclo corrente sono quelle di R e T con measured_at successivo a quell'evento. Se esiste un task_measured di T dopo il confine, il task è già chiuso nel ciclo e la lista è vuota.
FILE:

  • src/backend/services/measurement_service.py: current_cycle_measurements(db, run_id, task_id) → lista (subtask_id, value, pass_fail, measured_at); a parità di subtask vale l'ultima misura.
  • src/backend/api/routers/measurements.py: GET /api/measurements/current-cycle?production_run_id=&task_id= (stessi permessi di task-progress); risposta con schema Pydantic.
  • src/frontend/flask_app/blueprints/measure.py: il proxy esistente /measure/api/task-progress/<task_id> (commit cc68612), oppure uno nuovo /measure/api/current-cycle/<task_id> che legge production_run_id dalla sessione, come fa il resto della pagina.
  • templates/measure/task_execute.html init(): se c'è un run attivo, chiama il proxy, ripopola measurements e mette currentIndex sulla prima quota non misurata. Fuori da una produzione: nessun ripristino, comportamento di oggi (dichiarato).
    TEST: misure di due cicli con un cycle_completed in mezzo → solo le ultime; un remeasure del task azzera; un task_measured dopo il confine → lista vuota; permessi; test del frontend sul proxy.
    NON TOCCARE: schema DB, migrazioni, auth.
    FATTO SE: uv run pytest verde; F5 a metà ciclo, provato a mano con docker compose dev se fattibile, altrimenti dichiarato.
ESITO: richiesta RIF: gitea:Adriano/TieMeasureFlow#40 COSA: analisi (passo 1). Ripristinare dopo un reload le quote già misurate nel ciclo in corso. CONFINE DEL CICLO, senza migrazione: dentro un production run R, per il task T, il ciclo corrente comincia all'ultimo evento di production_events di R fra start, cycle_completed, e remeasure con task T. Le misure del ciclo corrente sono quelle di R e T con measured_at successivo a quell'evento. Se esiste un task_measured di T dopo il confine, il task è già chiuso nel ciclo e la lista è vuota. FILE: - src/backend/services/measurement_service.py: current_cycle_measurements(db, run_id, task_id) → lista (subtask_id, value, pass_fail, measured_at); a parità di subtask vale l'ultima misura. - src/backend/api/routers/measurements.py: GET /api/measurements/current-cycle?production_run_id=&task_id= (stessi permessi di task-progress); risposta con schema Pydantic. - src/frontend/flask_app/blueprints/measure.py: il proxy esistente /measure/api/task-progress/<task_id> (commit cc68612), oppure uno nuovo /measure/api/current-cycle/<task_id> che legge production_run_id dalla sessione, come fa il resto della pagina. - templates/measure/task_execute.html init(): se c'è un run attivo, chiama il proxy, ripopola measurements e mette currentIndex sulla prima quota non misurata. Fuori da una produzione: nessun ripristino, comportamento di oggi (dichiarato). TEST: misure di due cicli con un cycle_completed in mezzo → solo le ultime; un remeasure del task azzera; un task_measured dopo il confine → lista vuota; permessi; test del frontend sul proxy. NON TOCCARE: schema DB, migrazioni, auth. FATTO SE: uv run pytest verde; F5 a metà ciclo, provato a mano con docker compose dev se fattibile, altrimenti dichiarato.
Adriano added the assegnata:jeeg label 2026-10-06 09:27:52 +00:00
Author
Owner

⚡ jeeg — preso in carico 2026-10-06T09:27:52Z
ramo: lavoro/jeeg · capacità: docker, gpu, systemd

⚡ jeeg — **preso in carico** 2026-10-06T09:27:52Z ramo: `lavoro/jeeg` · capacità: docker, gpu, systemd
Author
Owner

Soluzione

ESITO: fatto
COMMIT: 1d93ede su V3.0.0 (ramo lavoro/jeeg-tmf40)
COSA: dopo un reload a metà ciclo la pagina di misura ripristina le quote già misurate.
FILE:

  • src/backend/services/measurement_service.py current_cycle_measurements: il confine del ciclo è l'ultimo evento del run fra start, cycle_completed e remeasure del task (per id); un task_measured del task dopo il confine → lista vuota; per ogni quota vale l'ultima lettura. Nessuna migrazione.
  • src/backend/api/routers/measurements.py: GET /api/measurements/current-cycle?production_run_id=&task_id= (require_measurement_tec).
  • src/frontend/flask_app/blueprints/measure.py: proxy /measure/api/current-cycle/<task_id>, run da _current_run_id(), stesso controllo di stazione di task-progress, errore del backend → lista vuota.
  • templates/measure/task_execute.html loadCurrentCycle() in init(): ripopola measurements e mette currentIndex sulla prima quota non misurata.
    SICUREZZA DOPPIONI: le misure si salvano una alla volta (save_measurement); la lista locale è solo presentazione, quindi le quote ripristinate non si rispediscono.
    PROVA: uv run pytest → 640 passed, 4 skipped. Test in src/backend/tests/test_current_cycle.py (7) e test_measure.py (4 sul proxy).
    NON FATTO: prova a mano di F5 nel browser. Fuori da una produzione non c'è ripristino (non esiste un ciclo).
**Soluzione** ESITO: fatto COMMIT: 1d93ede su V3.0.0 (ramo lavoro/jeeg-tmf40) COSA: dopo un reload a metà ciclo la pagina di misura ripristina le quote già misurate. FILE: - src/backend/services/measurement_service.py current_cycle_measurements: il confine del ciclo è l'ultimo evento del run fra start, cycle_completed e remeasure del task (per id); un task_measured del task dopo il confine → lista vuota; per ogni quota vale l'ultima lettura. Nessuna migrazione. - src/backend/api/routers/measurements.py: GET /api/measurements/current-cycle?production_run_id=&task_id= (require_measurement_tec). - src/frontend/flask_app/blueprints/measure.py: proxy /measure/api/current-cycle/<task_id>, run da _current_run_id(), stesso controllo di stazione di task-progress, errore del backend → lista vuota. - templates/measure/task_execute.html loadCurrentCycle() in init(): ripopola measurements e mette currentIndex sulla prima quota non misurata. SICUREZZA DOPPIONI: le misure si salvano una alla volta (save_measurement); la lista locale è solo presentazione, quindi le quote ripristinate non si rispediscono. PROVA: uv run pytest → 640 passed, 4 skipped. Test in src/backend/tests/test_current_cycle.py (7) e test_measure.py (4 sul proxy). NON FATTO: prova a mano di F5 nel browser. Fuori da una produzione non c'è ripristino (non esiste un ciclo).
Adriano removed the assegnata:jeeg label 2026-10-06 09:32:29 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#40