diff --git a/client/blueprints/statistics.py b/client/blueprints/statistics.py index 4e639e0..7715c32 100644 --- a/client/blueprints/statistics.py +++ b/client/blueprints/statistics.py @@ -1,8 +1,11 @@ """Metrologist blueprint - SPC statistics dashboard and API proxies.""" -from flask import Blueprint, jsonify, render_template, request +import requests as http_requests + +from flask import Blueprint, jsonify, render_template, request, session from flask_babel import gettext as _ from blueprints.auth import login_required, role_required +from config import Config from services.api_client import api_client statistics_bp = Blueprint("statistics", __name__) @@ -105,3 +108,71 @@ def api_subtasks(): return jsonify(resp) return jsonify(resp) + + +# ============================================================================ +# PROXY REPORT PDF → FastAPI +# ============================================================================ + +def _proxy_report(endpoint: str): + """Forward query params to a FastAPI reports endpoint and return PDF.""" + params = {} + for key in [ + "recipe_id", "version_id", "subtask_id", + "date_from", "date_to", "operator_id", + "lot_number", "serial_number", + ]: + val = request.args.get(key) + if val is not None and val != "": + params[key] = val + + base_url = Config.API_SERVER_URL.rstrip("/") + headers = {} + api_key = session.get("api_key") + if api_key: + headers["X-API-Key"] = api_key + + try: + resp = http_requests.get( + f"{base_url}/api/reports/{endpoint}", + headers=headers, + params=params, + timeout=120, + ) + except (http_requests.ConnectionError, http_requests.Timeout) as e: + return jsonify({"error": True, "detail": str(e)}), 502 + + if not resp.ok: + try: + err = resp.json() + detail = err.get("detail", f"HTTP {resp.status_code}") + except Exception: + detail = f"HTTP {resp.status_code}" + return jsonify({"error": True, "detail": detail}), resp.status_code + + from flask import Response as FlaskResponse + return FlaskResponse( + resp.content, + mimetype="application/pdf", + headers={ + "Content-Disposition": resp.headers.get( + "Content-Disposition", f'attachment; filename="report.pdf"' + ) + }, + ) + + +@statistics_bp.route("/api/report-spc") +@login_required +@role_required("Metrologist") +def api_report_spc(): + """Proxy: download SPC PDF report.""" + return _proxy_report("spc") + + +@statistics_bp.route("/api/report-measurements") +@login_required +@role_required("Metrologist") +def api_report_measurements(): + """Proxy: download measurements PDF report.""" + return _proxy_report("measurements") diff --git a/client/templates/statistics/dashboard.html b/client/templates/statistics/dashboard.html index 3a9d7d2..685b2fe 100644 --- a/client/templates/statistics/dashboard.html +++ b/client/templates/statistics/dashboard.html @@ -61,8 +61,41 @@ - -
+ +
+ +
+ + +
+
+