From 68907faee9522ec46cc8f61788051eed599f631f Mon Sep 17 00:00:00 2001 From: Simon Strandgaard Date: Fri, 10 Apr 2026 17:32:12 +0200 Subject: [PATCH] feat: add Import Plan button and upload page Adds "Import Plan" button to /plan list page (top-right corner). Links to /plan/import with a zip file upload form. The uploaded file is accepted but not yet processed (placeholder for next step). Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend_multi_user/src/plan_routes.py | 21 +++++ .../templates/plan_import.html | 92 +++++++++++++++++++ frontend_multi_user/templates/plan_list.html | 5 +- 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 frontend_multi_user/templates/plan_import.html diff --git a/frontend_multi_user/src/plan_routes.py b/frontend_multi_user/src/plan_routes.py index 6744bb95..1514e8c4 100644 --- a/frontend_multi_user/src/plan_routes.py +++ b/frontend_multi_user/src/plan_routes.py @@ -949,6 +949,27 @@ def plan(): ) +@plan_routes_bp.route("/plan/import", methods=["GET", "POST"]) +@login_required +def plan_import(): + message = None + message_type = None + if request.method == "POST": + zip_file = request.files.get("zip_file") + if zip_file is None or zip_file.filename == "": + message = "No file selected." + message_type = "error" + elif not zip_file.filename.endswith(".zip"): + message = "Please upload a .zip file." + message_type = "error" + else: + # TODO: process the zip file + logger.info("Plan import: received zip file %r (%s bytes)", zip_file.filename, zip_file.content_length) + message = f"Uploaded {zip_file.filename} (not yet processed)." + message_type = "success" + return render_template("plan_import.html", message=message, message_type=message_type) + + @plan_routes_bp.route("/plan/stop", methods=["POST"]) @login_required def plan_stop(): diff --git a/frontend_multi_user/templates/plan_import.html b/frontend_multi_user/templates/plan_import.html new file mode 100644 index 00000000..3c921440 --- /dev/null +++ b/frontend_multi_user/templates/plan_import.html @@ -0,0 +1,92 @@ +{% extends "base.html" %} +{% block title %}Import Plan - PlanExe{% endblock %} +{% block head %} + +{% endblock %} + +{% block content %} +← Back to Plans +

Import Plan

+

Upload a plan zip file to import it.

+ +
+
+ + + + +
+ + {% if message %} +
+ {{ message }} +
+ {% endif %} +
+{% endblock %} diff --git a/frontend_multi_user/templates/plan_list.html b/frontend_multi_user/templates/plan_list.html index 43a0f043..949f7d6c 100644 --- a/frontend_multi_user/templates/plan_list.html +++ b/frontend_multi_user/templates/plan_list.html @@ -131,7 +131,10 @@ {% endblock %} {% block content %} -

Plans

+
+

Plans

+ Import Plan +

Technical queue view · newest first · click row to inspect

{% if plan_rows %}