52 lines
2.2 KiB
Python
52 lines
2.2 KiB
Python
"""Workflow model.
|
|
|
|
A workflow fires an action (set relay ON/OFF/TOGGLE) on a *target* board
|
|
whenever a specific input on a *trigger* board changes state.
|
|
"""
|
|
from datetime import datetime
|
|
from app import db
|
|
|
|
|
|
class Workflow(db.Model):
|
|
__tablename__ = "workflows"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
name = db.Column(db.String(128), nullable=False)
|
|
is_enabled = db.Column(db.Boolean, default=True, nullable=False)
|
|
|
|
# ── trigger ──────────────────────────────────────────────────────
|
|
trigger_board_id = db.Column(
|
|
db.Integer, db.ForeignKey("boards.id", ondelete="CASCADE"), nullable=False
|
|
)
|
|
trigger_input = db.Column(db.Integer, nullable=False) # 1-based
|
|
# "press" (rising edge), "release" (falling), "both"
|
|
trigger_event = db.Column(db.String(16), nullable=False, default="press")
|
|
|
|
# ── action ───────────────────────────────────────────────────────
|
|
action_board_id = db.Column(
|
|
db.Integer, db.ForeignKey("boards.id"), nullable=False
|
|
)
|
|
action_relay = db.Column(db.Integer, nullable=False) # 1-based
|
|
# "on", "off", "toggle"
|
|
action_type = db.Column(db.String(16), nullable=False, default="toggle")
|
|
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
last_triggered = db.Column(db.DateTime, nullable=True)
|
|
|
|
# ── relationships ────────────────────────────────────────────────
|
|
trigger_board = db.relationship(
|
|
"Board", foreign_keys=[trigger_board_id],
|
|
back_populates="workflows_trigger"
|
|
)
|
|
action_board = db.relationship(
|
|
"Board", foreign_keys=[action_board_id],
|
|
back_populates="workflows_target"
|
|
)
|
|
|
|
def __repr__(self) -> str:
|
|
return (
|
|
f"<Workflow '{self.name}' "
|
|
f"Board#{self.trigger_board_id}.in{self.trigger_input} "
|
|
f"→ Board#{self.action_board_id}.relay{self.action_relay} [{self.action_type}]>"
|
|
)
|