Visione: file di riferimento orfani alla cancellazione di un task; GIF/WebP animati misurati sul primo frame #43

Closed
opened 2026-09-21 21:56:04 +00:00 by Adriano · 3 comments
Owner
  1. src/backend/api/routers/tasks.py delete_task: le righe vision_reference_images ora spariscono in cascata (migrazione 014), ma i file su disco restano; va chiamata la rimozione con la stessa regola di file_still_referenced (src/backend/services/vision_service.py).
  2. src/backend/api/routers/vision.py: GIF e WebP animati sono accettati e viene misurato solo il primo frame senza avviso; convert("L") riduce a 8 bit i PNG a 16. Decisione di prodotto: rifiutare gli animati o avvisare.
  3. GET /api/measurements non accetta production_run_id: il riepilogo di fine task (#30) filtra per lotto/seriale/operatore, meno preciso.

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

1. src/backend/api/routers/tasks.py `delete_task`: le righe `vision_reference_images` ora spariscono in cascata (migrazione 014), ma i file su disco restano; va chiamata la rimozione con la stessa regola di `file_still_referenced` (src/backend/services/vision_service.py). 2. src/backend/api/routers/vision.py: GIF e WebP animati sono accettati e viene misurato solo il primo frame senza avviso; `convert("L")` riduce a 8 bit i PNG a 16. Decisione di prodotto: rifiutare gli animati o avvisare. 3. `GET /api/measurements` non accetta `production_run_id`: il riepilogo di fine task (#30) filtra per lotto/seriale/operatore, meno preciso. ORIGINE: residui dichiarati alla chiusura delle issue della revisione del 21/09/2026.
Adriano added the bug label 2026-09-21 21:56:04 +00:00
Adriano added the assegnata:jeeg label 2026-10-06 09:23:13 +00:00
Author
Owner

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

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

ESITO: richiesta
RIF: gitea:Adriano/TieMeasureFlow#43
COSA: analisi (passo 1). Decisione di Adriano del 06/10/2026: le immagini animate si rifiutano.
FILE:

  1. File orfani. src/backend/api/routers/tasks.py:354 delete_task: prima di db.delete(task), raccogliere le VisionReferenceImage del task (le righe vanno via in cascata, migrazione 014). Dopo il commit, per ognuna: se vision_service.file_still_referenced(db, ref.path) è falso, vision_service.remove_reference_file(ref). Stesso ordine di vision.py:172 delete_reference_image: prima il commit, poi il file. Se delete_task oggi non fa commit esplicito (fa flush e basta), aggiungere il commit come in vision.py, oppure documentare dove avviene. Con il copy-on-write (_task_for_write) il task cancellato è la copia: i file condivisi con l'originale restano, ed è per questo che serve file_still_referenced.
  2. Animati rifiutati. src/backend/api/routers/vision.py _read_image (riga ~69): dopo il controllo dei magic bytes, aprire con PIL e se getattr(img, "is_animated", False) o n_frames > 1 → 422 «animated images are not supported». Vale per tutti gli endpoint che passano da _read_image (execute, preview, reference-images).
  3. Filtro per run. src/backend/api/routers/measurements.py:205 GET /api/measurements: aggiungere il parametro production_run_id: int | None = Query(None, gt=0), passato al service e applicato come filtro (Measurement.production_run_id == ...). Il riepilogo di fine task (#30, frontend: cercarlo con grep "lot_number" in src/frontend/flask_app/blueprints/measure.py e nei template di measure) passa production_run_id quando ce l'ha, invece di filtrare solo per lotto, seriale e operatore.
    TEST: cancellare un task con un'immagine di riferimento toglie il file; con il file condiviso da una copia copy-on-write il file resta; una GIF animata e una WebP animata a 2 frame → 422, una GIF a 1 frame passa; GET /api/measurements?production_run_id=N restituisce solo quel run; test del frontend per il riepilogo, se esiste già un test su quella vista.
    NON TOCCARE: src/vision_worker/main.py:56 convert("L"), che riduce a 8 bit i PNG a 16 bit: resta aperto, è un'altra decisione. Niente migrazioni. auth e datetime (#41, #42).
    FATTO SE: uv run pytest verde.
ESITO: richiesta RIF: gitea:Adriano/TieMeasureFlow#43 COSA: analisi (passo 1). Decisione di Adriano del 06/10/2026: le immagini animate si rifiutano. FILE: 1. File orfani. src/backend/api/routers/tasks.py:354 delete_task: prima di db.delete(task), raccogliere le VisionReferenceImage del task (le righe vanno via in cascata, migrazione 014). Dopo il commit, per ognuna: se vision_service.file_still_referenced(db, ref.path) è falso, vision_service.remove_reference_file(ref). Stesso ordine di vision.py:172 delete_reference_image: prima il commit, poi il file. Se delete_task oggi non fa commit esplicito (fa flush e basta), aggiungere il commit come in vision.py, oppure documentare dove avviene. Con il copy-on-write (_task_for_write) il task cancellato è la copia: i file condivisi con l'originale restano, ed è per questo che serve file_still_referenced. 2. Animati rifiutati. src/backend/api/routers/vision.py _read_image (riga ~69): dopo il controllo dei magic bytes, aprire con PIL e se getattr(img, "is_animated", False) o n_frames > 1 → 422 «animated images are not supported». Vale per tutti gli endpoint che passano da _read_image (execute, preview, reference-images). 3. Filtro per run. src/backend/api/routers/measurements.py:205 GET /api/measurements: aggiungere il parametro production_run_id: int | None = Query(None, gt=0), passato al service e applicato come filtro (Measurement.production_run_id == ...). Il riepilogo di fine task (#30, frontend: cercarlo con grep "lot_number" in src/frontend/flask_app/blueprints/measure.py e nei template di measure) passa production_run_id quando ce l'ha, invece di filtrare solo per lotto, seriale e operatore. TEST: cancellare un task con un'immagine di riferimento toglie il file; con il file condiviso da una copia copy-on-write il file resta; una GIF animata e una WebP animata a 2 frame → 422, una GIF a 1 frame passa; GET /api/measurements?production_run_id=N restituisce solo quel run; test del frontend per il riepilogo, se esiste già un test su quella vista. NON TOCCARE: src/vision_worker/main.py:56 convert("L"), che riduce a 8 bit i PNG a 16 bit: resta aperto, è un'altra decisione. Niente migrazioni. auth e datetime (#41, #42). FATTO SE: uv run pytest verde.
Author
Owner

Soluzione

ESITO: fatto
COMMIT: 70e2072 su V3.0.0 (ramo lavoro/jeeg-tmf43)
FILE:

  • src/backend/api/routers/tasks.py delete_task: le VisionReferenceImage del task si cancellano col task; dopo il commit si tolgono i file non più referenziati (file_still_referenced), quelli condivisi con una copia copy-on-write restano.
  • src/backend/api/routers/vision.py _reject_animated: GIF/WebP/APNG animati → 422 «animated images are not supported» (decisione di Adriano 06/10/2026), su execute, preview e reference-images.
  • src/backend/api/routers/measurements.py: GET /api/measurements?production_run_id=N.
  • src/frontend/flask_app/blueprints/measure.py: il riepilogo di fine task filtra per il run attivo quando c'è.
    PROVA: uv run pytest → 629 passed, 4 skipped (base 622). Test nuovi in src/backend/tests/test_task_cleanup_animated_run_filter.py e TestTaskComplete.
    NON FATTO: src/vision_worker/main.py:56 convert("L"), che riduce a 8 bit i PNG a 16 bit, resta da decidere.
**Soluzione** ESITO: fatto COMMIT: 70e2072 su V3.0.0 (ramo lavoro/jeeg-tmf43) FILE: - src/backend/api/routers/tasks.py delete_task: le VisionReferenceImage del task si cancellano col task; dopo il commit si tolgono i file non più referenziati (file_still_referenced), quelli condivisi con una copia copy-on-write restano. - src/backend/api/routers/vision.py _reject_animated: GIF/WebP/APNG animati → 422 «animated images are not supported» (decisione di Adriano 06/10/2026), su execute, preview e reference-images. - src/backend/api/routers/measurements.py: GET /api/measurements?production_run_id=N. - src/frontend/flask_app/blueprints/measure.py: il riepilogo di fine task filtra per il run attivo quando c'è. PROVA: uv run pytest → 629 passed, 4 skipped (base 622). Test nuovi in src/backend/tests/test_task_cleanup_animated_run_filter.py e TestTaskComplete. NON FATTO: src/vision_worker/main.py:56 convert("L"), che riduce a 8 bit i PNG a 16 bit, resta da decidere.
Adriano removed the assegnata:jeeg label 2026-10-06 09:27:49 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#43