Stazioni: sorgente camera da elenco acquisitore, link pagina acquisizione #88

Closed
opened 2026-10-24 12:45:59 +00:00 by Adriano · 1 comment
Owner

ANALISI (passo 1, claude-opus-5-5)
RIF: gitea:Adriano/TieMeasureFlow#88, base ramo lavoro/daitarn-tmf-dxfcal 2760623 (contiene #87: acquisitore con GET /acquisizione).
COSA: Admin > Stazioni: «Sorgente camera» si sceglie dall'elenco dell'acquisitore invece di scriverla a mano; link alla pagina acquisizione dell'acquisitore.

PROBLEMA OGGI

  • src/frontend/flask_app/templates/admin/stations.html:238-256: camera_url e camera_source sono input liberi; per sapere il seriale (camera:601654) bisogna aprire l'acquisitore a parte.
  • Il link della colonna Calibrazione punta a <camera_url>/calibrazione (maker.py:601, station_calibration.js:44): ora la pagina e' «Acquisizione camera», rotta /acquisizione (alias della stessa pagina).

MODIFICHE

  1. src/frontend/flask_app/blueprints/admin.py — rotta nuova
    GET /admin/api/camera/sources?url=<camera_url> (@login_required + @admin_required, come le altre /api/stations)
    • url senza schema http/https o senza host -> 400 {"error": true, "detail": _("Indirizzo della camera non valido")}
    • requests.get(f"{url.rstrip('/')}/camera/sources", timeout=5); import come in maker.py (import requests as http_requests)
    • RequestException -> 502 {"error": true, "detail": _("Servizio camera non raggiungibile: %(detail)s", ...)}
    • status != 200 o JSON senza lista "sources" -> 502 {"error": true, "detail": _("Risposta non valida dal servizio camera")}
    • ok -> 200 {"sources": [{"name","label","kind"}...]} (solo questi tre campi, stringhe)
  2. stations.html, modale crea/modifica:
    • input camera_source: aggiunge list="cameraSourcesList" + con x-for su sources: . Resta testo libero.
    • accanto: pulsante «Leggi sorgenti» (type="button"; disabilitato se form.camera_url vuoto) -> loadCameraSources().
    • loadCameraSources() chiamata anche: all'apertura della modale se form.camera_url non vuoto; su @change di camera_url.
    • riga di stato sotto il campo (al posto dell'esempio fisso quando c'e' un esito): «%(n)s sorgenti trovate» | detail dell'errore | in lettura «Lettura...». Senza esito resta il testo d'esempio attuale.
    • se form.camera_source non e' fra le sorgenti lette (e la lettura e' riuscita): avviso giallo «Sorgente non presente nell'acquisitore».
    • link «Apri pagina acquisizione» -> form.camera_url (senza / finale) + '/acquisizione', target=_blank rel=noopener, visibile se camera_url non vuoto.
    • Niente alert/confirm/prompt. Stile e classi come i campi vicini.
  3. Link colonna Calibrazione: testo «Calibra» -> «Acquisizione»; href <camera_url>/acquisizione in maker.py:601 e station_calibration.js:44; aggiornare le due asserzioni in tests/test_dxf_recipe_routes.py:123,133.
  4. Traduzioni: ogni msgid nuovo in translations/it/LC_MESSAGES/messages.po (msgstr = msgid) e translations/en/LC_MESSAGES/messages.po (inglese). Non serve rigenerare il .pot.

TEST (src/frontend/flask_app/tests/test_admin_stations.py, stile dei test esistenti):

  • proxy ok con requests.get finto -> 200 e sources filtrate ai tre campi
  • url "ftp://x" e "" -> 400
  • RequestException -> 502
  • 200 con JSON senza "sources" -> 502
  • utente non admin -> come le altre rotte admin (redirect o 403, guarda i test esistenti)
  • template: contiene cameraSourcesList, loadCameraSources, "/acquisizione"
    Comando: cd src/frontend/flask_app && uv run --python 3.13 --extra dev pytest tests -q (adattare a come girano i test del frontend; tutti verdi)

NON TOCCARE: scripts/, src/backend/, src/vision*, vendor/, packaging/.

ANALISI (passo 1, claude-opus-5-5) RIF: gitea:Adriano/TieMeasureFlow#88, base ramo lavoro/daitarn-tmf-dxfcal 2760623 (contiene #87: acquisitore con GET /acquisizione). COSA: Admin > Stazioni: «Sorgente camera» si sceglie dall'elenco dell'acquisitore invece di scriverla a mano; link alla pagina acquisizione dell'acquisitore. PROBLEMA OGGI - src/frontend/flask_app/templates/admin/stations.html:238-256: camera_url e camera_source sono input liberi; per sapere il seriale (camera:601654) bisogna aprire l'acquisitore a parte. - Il link della colonna Calibrazione punta a <camera_url>/calibrazione (maker.py:601, station_calibration.js:44): ora la pagina e' «Acquisizione camera», rotta /acquisizione (alias della stessa pagina). MODIFICHE 1. src/frontend/flask_app/blueprints/admin.py — rotta nuova GET /admin/api/camera/sources?url=<camera_url> (@login_required + @admin_required, come le altre /api/stations) - url senza schema http/https o senza host -> 400 {"error": true, "detail": _("Indirizzo della camera non valido")} - requests.get(f"{url.rstrip('/')}/camera/sources", timeout=5); import come in maker.py (import requests as http_requests) - RequestException -> 502 {"error": true, "detail": _("Servizio camera non raggiungibile: %(detail)s", ...)} - status != 200 o JSON senza lista "sources" -> 502 {"error": true, "detail": _("Risposta non valida dal servizio camera")} - ok -> 200 {"sources": [{"name","label","kind"}...]} (solo questi tre campi, stringhe) 2. stations.html, modale crea/modifica: - input camera_source: aggiunge list="cameraSourcesList" + <datalist id="cameraSourcesList"> con x-for su sources: <option :value="s.name" :label="s.label">. Resta testo libero. - accanto: pulsante «Leggi sorgenti» (type="button"; disabilitato se form.camera_url vuoto) -> loadCameraSources(). - loadCameraSources() chiamata anche: all'apertura della modale se form.camera_url non vuoto; su @change di camera_url. - riga di stato sotto il campo (al posto dell'esempio fisso quando c'e' un esito): «%(n)s sorgenti trovate» | detail dell'errore | in lettura «Lettura...». Senza esito resta il testo d'esempio attuale. - se form.camera_source non e' fra le sorgenti lette (e la lettura e' riuscita): avviso giallo «Sorgente non presente nell'acquisitore». - link «Apri pagina acquisizione» -> form.camera_url (senza / finale) + '/acquisizione', target=_blank rel=noopener, visibile se camera_url non vuoto. - Niente alert/confirm/prompt. Stile e classi come i campi vicini. 3. Link colonna Calibrazione: testo «Calibra» -> «Acquisizione»; href <camera_url>/acquisizione in maker.py:601 e station_calibration.js:44; aggiornare le due asserzioni in tests/test_dxf_recipe_routes.py:123,133. 4. Traduzioni: ogni msgid nuovo in translations/it/LC_MESSAGES/messages.po (msgstr = msgid) e translations/en/LC_MESSAGES/messages.po (inglese). Non serve rigenerare il .pot. TEST (src/frontend/flask_app/tests/test_admin_stations.py, stile dei test esistenti): - proxy ok con requests.get finto -> 200 e sources filtrate ai tre campi - url "ftp://x" e "" -> 400 - RequestException -> 502 - 200 con JSON senza "sources" -> 502 - utente non admin -> come le altre rotte admin (redirect o 403, guarda i test esistenti) - template: contiene cameraSourcesList, loadCameraSources, "/acquisizione" Comando: cd src/frontend/flask_app && uv run --python 3.13 --extra dev pytest tests -q (adattare a come girano i test del frontend; tutti verdi) NON TOCCARE: scripts/, src/backend/, src/vision*, vendor/, packaging/.
Adriano added the sviluppo label 2026-10-24 12:45:59 +00:00
Author
Owner

Soluzione

ESITO: fatto
COSA: Admin > Stazioni: sorgente camera con suggerimenti letti dall'acquisitore (datalist + «Leggi sorgenti»), avviso sorgente assente, link «Apri pagina acquisizione»; link colonna Calibrazione -> «Acquisizione» su /acquisizione.
FILE: src/frontend/flask_app/blueprints/admin.py (GET /admin/api/camera/sources), templates/admin/stations.html, blueprints/maker.py:601, static/js/station_calibration.js, traduzioni it/en; commit 390d621 + cb66371 (x-cloak rimesso), merge in lavoro/daitarn-tmf-dxfcal.
PROVA: pytest frontend senza .mo -> verdi (84/84 nei file toccati; 4 test falliscono solo con .mo compilati presenti, preesistente). Playwright su TMF da sorgente daitarn: modale Modifica ST-DEFAULT -> «4 sorgenti trovate», datalist con camera:601020 GenTL Opto Engineering; console senza errori.

**Soluzione** ESITO: fatto COSA: Admin > Stazioni: sorgente camera con suggerimenti letti dall'acquisitore (datalist + «Leggi sorgenti»), avviso sorgente assente, link «Apri pagina acquisizione»; link colonna Calibrazione -> «Acquisizione» su /acquisizione. FILE: src/frontend/flask_app/blueprints/admin.py (GET /admin/api/camera/sources), templates/admin/stations.html, blueprints/maker.py:601, static/js/station_calibration.js, traduzioni it/en; commit 390d621 + cb66371 (x-cloak rimesso), merge in lavoro/daitarn-tmf-dxfcal. PROVA: pytest frontend senza .mo -> verdi (84/84 nei file toccati; 4 test falliscono solo con .mo compilati presenti, preesistente). Playwright su TMF da sorgente daitarn: modale Modifica ST-DEFAULT -> «4 sorgenti trovate», datalist con camera:601020 GenTL Opto Engineering; console senza errori.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#88