Initial commit: Location Management Flask app

This commit is contained in:
ske087
2026-02-26 19:24:17 +02:00
commit 7a22575dab
52 changed files with 3481 additions and 0 deletions

98
app/routes/workflows.py Normal file
View File

@@ -0,0 +1,98 @@
"""Workflow management routes."""
from flask import Blueprint, render_template, redirect, url_for, flash, request, abort
from flask_login import login_required, current_user
from app import db
from app.models.board import Board
from app.models.workflow import Workflow
workflows_bp = Blueprint("workflows", __name__)
EVENTS = [("press", "Press (rising edge)"), ("release", "Release (falling)"), ("both", "Both")]
ACTIONS = [("on", "Turn ON"), ("off", "Turn OFF"), ("toggle", "Toggle")]
@workflows_bp.route("/")
@login_required
def list_workflows():
workflows = Workflow.query.order_by(Workflow.name).all()
return render_template("workflows/list.html", workflows=workflows)
@workflows_bp.route("/add", methods=["GET", "POST"])
@login_required
def add_workflow():
if not current_user.is_admin():
abort(403)
boards = Board.query.order_by(Board.name).all()
if request.method == "POST":
wf = Workflow(
name=request.form.get("name", "").strip(),
trigger_board_id=int(request.form["trigger_board_id"]),
trigger_input=int(request.form["trigger_input"]),
trigger_event=request.form.get("trigger_event", "press"),
action_board_id=int(request.form["action_board_id"]),
action_relay=int(request.form["action_relay"]),
action_type=request.form.get("action_type", "toggle"),
is_enabled=True,
)
if not wf.name:
flash("Name is required.", "danger")
return render_template("workflows/edit.html", wf=None, boards=boards,
events=EVENTS, actions=ACTIONS)
db.session.add(wf)
db.session.commit()
flash(f"Workflow '{wf.name}' created.", "success")
return redirect(url_for("workflows.list_workflows"))
return render_template("workflows/edit.html", wf=None, boards=boards,
events=EVENTS, actions=ACTIONS)
@workflows_bp.route("/<int:wf_id>/edit", methods=["GET", "POST"])
@login_required
def edit_workflow(wf_id: int):
if not current_user.is_admin():
abort(403)
wf = db.get_or_404(Workflow, wf_id)
boards = Board.query.order_by(Board.name).all()
if request.method == "POST":
wf.name = request.form.get("name", wf.name).strip()
wf.trigger_board_id = int(request.form.get("trigger_board_id", wf.trigger_board_id))
wf.trigger_input = int(request.form.get("trigger_input", wf.trigger_input))
wf.trigger_event = request.form.get("trigger_event", wf.trigger_event)
wf.action_board_id = int(request.form.get("action_board_id", wf.action_board_id))
wf.action_relay = int(request.form.get("action_relay", wf.action_relay))
wf.action_type = request.form.get("action_type", wf.action_type)
wf.is_enabled = "is_enabled" in request.form
db.session.commit()
flash("Workflow updated.", "success")
return redirect(url_for("workflows.list_workflows"))
return render_template("workflows/edit.html", wf=wf, boards=boards,
events=EVENTS, actions=ACTIONS)
@workflows_bp.route("/<int:wf_id>/delete", methods=["POST"])
@login_required
def delete_workflow(wf_id: int):
if not current_user.is_admin():
abort(403)
wf = db.get_or_404(Workflow, wf_id)
db.session.delete(wf)
db.session.commit()
flash(f"Workflow '{wf.name}' deleted.", "warning")
return redirect(url_for("workflows.list_workflows"))
@workflows_bp.route("/<int:wf_id>/toggle", methods=["POST"])
@login_required
def toggle_workflow(wf_id: int):
wf = db.get_or_404(Workflow, wf_id)
wf.is_enabled = not wf.is_enabled
db.session.commit()
state = "enabled" if wf.is_enabled else "disabled"
flash(f"Workflow '{wf.name}' {state}.", "info")
return redirect(url_for("workflows.list_workflows"))