maker: Modifica ricetta da DXF, il wizard si riapre compilato (Refs #105)
Due proxy Flask (/source e /files, byte) e wizard che all'init legge la ricetta esistente: etichetta del bottone dinamica, apertura con banda, soglia, polarita', mm/px, DXF e immagine di riferimento; risposte tardive non sovrascrivono le scelte manuali. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jbf7qKuxsnAVjxthRy7dnB
This commit is contained in:
@@ -5,6 +5,7 @@ import math
|
||||
import requests as http_requests
|
||||
|
||||
from functools import wraps
|
||||
from urllib.parse import quote # #105: percorso del file ricetta nell'URL del backend
|
||||
|
||||
from flask import Blueprint, Response, abort, flash, jsonify, redirect, render_template, request, session, url_for
|
||||
from flask_babel import gettext as _
|
||||
@@ -701,6 +702,46 @@ def api_dxf_compare_recipe(task_id: int):
|
||||
return jsonify(resp), 200
|
||||
|
||||
|
||||
# #105: parametri della ricetta DXF gia' salvata sul task, per riaprire il wizard compilato
|
||||
@maker_bp.route("/api/vision/tasks/<int:task_id>/recipe/dxf-compare/source", methods=["GET"])
|
||||
@login_required
|
||||
@role_required("Maker")
|
||||
def api_dxf_compare_source(task_id: int):
|
||||
"""Proxy: parametri e file della ricetta DXF del task (404 se non ce n'e' una) (#105)."""
|
||||
resp = api_client.get(f"/api/vision/tasks/{task_id}/recipe/dxf-compare/source")
|
||||
# Codice e corpo del backend arrivano com'e': il 404 vuol dire «nessuna ricetta da DXF»
|
||||
if resp.get("error"):
|
||||
return jsonify(resp), resp.get("status_code", 500)
|
||||
return jsonify(resp), 200
|
||||
|
||||
|
||||
# #105: un file della cartella ricetta (DXF, immagine di riferimento) come byte, non JSON
|
||||
@maker_bp.route("/api/vision/tasks/<int:task_id>/recipe/files/<path:path>", methods=["GET"])
|
||||
@login_required
|
||||
@role_required("Maker")
|
||||
def api_vision_recipe_file(task_id: int, path: str):
|
||||
"""Proxy: byte di un file della cartella ricetta del task, con content-type del backend (#105)."""
|
||||
# Niente segmenti '..' o backslash: urllib3 normalizzerebbe l'URL fuori da questa rotta del backend
|
||||
if "\\" in path or ".." in path.split("/"):
|
||||
return jsonify({"error": True, "detail": _("File non trovato")}), 404
|
||||
try:
|
||||
resp = http_requests.get(
|
||||
f"{Config.API_SERVER_URL.rstrip('/')}/api/vision/tasks/{task_id}/recipe/files/{quote(path)}",
|
||||
headers={"X-API-Key": session.get("api_key", "")},
|
||||
timeout=30,
|
||||
)
|
||||
except http_requests.RequestException as exc:
|
||||
return jsonify({
|
||||
"error": True,
|
||||
"detail": _("Servizio non raggiungibile: %(detail)s", detail=str(exc)),
|
||||
}), 502
|
||||
return Response(
|
||||
resp.content,
|
||||
status=resp.status_code,
|
||||
content_type=resp.headers.get("content-type", "application/octet-stream"),
|
||||
)
|
||||
|
||||
|
||||
# #101: anteprima del DXF appena scelto nel wizard (contorni letti dal vision worker)
|
||||
@maker_bp.route("/api/vision/dxf-preview", methods=["POST"])
|
||||
@login_required
|
||||
|
||||
Reference in New Issue
Block a user