Initial commit: Location Management Flask app
This commit is contained in:
98
app/routes/workflows.py
Normal file
98
app/routes/workflows.py
Normal 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"))
|
||||
Reference in New Issue
Block a user