Merge lavoro/daitarn-46-operatore (#46)
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
"""MeasurementTec blueprint - recipe selection and measurement execution."""
|
||||
import urllib.parse
|
||||
|
||||
import requests as http_requests
|
||||
|
||||
from flask import (
|
||||
Blueprint, abort, flash, jsonify, redirect, render_template,
|
||||
Blueprint, Response, abort, flash, jsonify, redirect, render_template,
|
||||
request, session, url_for,
|
||||
)
|
||||
from flask_babel import gettext as _
|
||||
@@ -820,3 +822,67 @@ def api_close_production(run_id: int):
|
||||
def api_get_file(file_path: str):
|
||||
"""Proxy: Serve file from API server (browser can't send X-API-Key)."""
|
||||
return proxy_file(file_path)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Route: vision execute (#46) - the browser sends an image, we relay it to
|
||||
# POST /api/vision/execute (multipart) because it cannot send X-API-Key itself.
|
||||
# ---------------------------------------------------------------------------
|
||||
@measure_bp.route("/api/vision/execute", methods=["POST"])
|
||||
@login_required
|
||||
@role_required("MeasurementTec")
|
||||
def api_vision_execute():
|
||||
"""Proxy: run the task's VisionSuite recipe on the uploaded image."""
|
||||
image = request.files.get("image")
|
||||
task_id = request.form.get("task_id")
|
||||
if image is None or not task_id:
|
||||
return jsonify({
|
||||
"error": True,
|
||||
"detail": _("Dati mancanti: task_id e image sono obbligatori"),
|
||||
}), 400
|
||||
|
||||
# Same context fields as the manual flow; empty ones are left out so the
|
||||
# backend sees them as absent rather than as "".
|
||||
form = {"task_id": task_id}
|
||||
for key in ("task_type", "lot_number", "serial_number", "production_run_id"):
|
||||
val = request.form.get(key)
|
||||
if val:
|
||||
form[key] = val
|
||||
form.setdefault("lot_number", session.get("lot_number", ""))
|
||||
form.setdefault("serial_number", session.get("serial_number", ""))
|
||||
|
||||
resp = api_client.post(
|
||||
"/api/vision/execute",
|
||||
data=form,
|
||||
files={"image": (
|
||||
image.filename or "capture.jpg",
|
||||
image.read(),
|
||||
image.mimetype or "application/octet-stream",
|
||||
)},
|
||||
)
|
||||
if resp.get("error"):
|
||||
status_code = resp.get("status_code", 500)
|
||||
body = {"error": True, "detail": resp.get("detail", _("Errore nell'esecuzione"))}
|
||||
if resp.get("session_expired"):
|
||||
body["session_expired"] = True
|
||||
return jsonify(body), status_code if status_code >= 400 else 500
|
||||
return jsonify(resp), 200
|
||||
|
||||
|
||||
@measure_bp.route("/api/vision/results/<int:result_id>/image", methods=["GET"])
|
||||
@login_required
|
||||
@role_required("MeasurementTec")
|
||||
def api_vision_result_image(result_id: int):
|
||||
"""Proxy: the image saved with a vision result (needs X-API-Key)."""
|
||||
base_url = Config.API_SERVER_URL.rstrip("/")
|
||||
resp = http_requests.get(
|
||||
f"{base_url}/api/vision/results/{result_id}/image",
|
||||
headers={"X-API-Key": session.get("api_key", "")},
|
||||
timeout=30,
|
||||
)
|
||||
if resp.status_code != 200:
|
||||
return Response(resp.text, status=resp.status_code)
|
||||
return Response(
|
||||
resp.content,
|
||||
content_type=resp.headers.get("content-type", "application/octet-stream"),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user