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