bfa-dryer-design/app.py

87 lines
2.7 KiB
Python
Raw Normal View History

"""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)