mirror of
http://10.0.2.1:3031/sauer/bfa-dryer-design.git
synced 2026-06-30 12:56:42 +10:00
87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
|
|
"""BFA Banana Dryer — HMI Design Collaboration Tool"""
|
||
|
|
import os
|
||
|
|
import json
|
||
|
|
import time
|
||
|
|
import uuid
|
||
|
|
from flask import Flask, render_template, request, jsonify, send_from_directory
|
||
|
|
|
||
|
|
app = Flask(__name__)
|
||
|
|
LAYOUT_DIR = os.path.join(os.path.dirname(__file__), "layouts")
|
||
|
|
PHOTO_DIR = os.path.join(os.path.dirname(__file__), "static", "photos")
|
||
|
|
os.makedirs(LAYOUT_DIR, exist_ok=True)
|
||
|
|
os.makedirs(PHOTO_DIR, exist_ok=True)
|
||
|
|
|
||
|
|
CURRENT_LAYOUT = os.path.join(LAYOUT_DIR, "current.json")
|
||
|
|
|
||
|
|
def get_layout():
|
||
|
|
if os.path.exists(CURRENT_LAYOUT):
|
||
|
|
with open(CURRENT_LAYOUT) as f:
|
||
|
|
return json.load(f)
|
||
|
|
# First run — copy default
|
||
|
|
default = os.path.join(LAYOUT_DIR, "default.json")
|
||
|
|
with open(default) as f:
|
||
|
|
layout = json.load(f)
|
||
|
|
save_layout(layout)
|
||
|
|
return layout
|
||
|
|
|
||
|
|
def save_layout(layout):
|
||
|
|
with open(CURRENT_LAYOUT, "w") as f:
|
||
|
|
json.dump(layout, f, indent=2)
|
||
|
|
|
||
|
|
@app.route("/")
|
||
|
|
def index():
|
||
|
|
return render_template("editor.html")
|
||
|
|
|
||
|
|
@app.route("/api/layout", methods=["GET"])
|
||
|
|
def api_get_layout():
|
||
|
|
return jsonify(get_layout())
|
||
|
|
|
||
|
|
@app.route("/api/layout", methods=["POST"])
|
||
|
|
def api_save_layout():
|
||
|
|
layout = request.json
|
||
|
|
save_layout(layout)
|
||
|
|
return jsonify({"ok": True})
|
||
|
|
|
||
|
|
@app.route("/api/comment", methods=["POST"])
|
||
|
|
def api_add_comment():
|
||
|
|
data = request.json
|
||
|
|
layout = get_layout()
|
||
|
|
comment = {
|
||
|
|
"id": str(uuid.uuid4())[:8],
|
||
|
|
"target": data["target"],
|
||
|
|
"user": data["user"],
|
||
|
|
"time": time.strftime("%Y-%m-%dT%H:%M:%S"),
|
||
|
|
"text": data["text"]
|
||
|
|
}
|
||
|
|
layout.setdefault("comments", []).append(comment)
|
||
|
|
save_layout(layout)
|
||
|
|
return jsonify(comment)
|
||
|
|
|
||
|
|
@app.route("/api/users", methods=["POST"])
|
||
|
|
def api_add_user():
|
||
|
|
name = request.json.get("name", "").strip()
|
||
|
|
if not name:
|
||
|
|
return jsonify({"error": "empty name"}), 400
|
||
|
|
layout = get_layout()
|
||
|
|
if name not in layout.get("users", []):
|
||
|
|
layout.setdefault("users", []).append(name)
|
||
|
|
save_layout(layout)
|
||
|
|
return jsonify({"ok": True, "users": layout["users"]})
|
||
|
|
|
||
|
|
@app.route("/api/photo", methods=["POST"])
|
||
|
|
def api_upload_photo():
|
||
|
|
if "file" not in request.files:
|
||
|
|
return jsonify({"error": "no file"}), 400
|
||
|
|
f = request.files["file"]
|
||
|
|
fname = f"{int(time.time())}_{f.filename}"
|
||
|
|
f.save(os.path.join(PHOTO_DIR, fname))
|
||
|
|
return jsonify({"filename": fname, "url": f"/static/photos/{fname}"})
|
||
|
|
|
||
|
|
@app.route("/api/photos", methods=["GET"])
|
||
|
|
def api_list_photos():
|
||
|
|
photos = sorted(os.listdir(PHOTO_DIR)) if os.path.exists(PHOTO_DIR) else []
|
||
|
|
return jsonify([{"filename": p, "url": f"/static/photos/{p}"} for p in photos if not p.startswith(".")])
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
app.run(host="0.0.0.0", port=5001, debug=True)
|