99 lines
3.8 KiB
Python
99 lines
3.8 KiB
Python
"""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"))
|