Add a trigger log every time the a callback is triggered
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import app.models.settings
|
||||
import app.models.callback
|
||||
import app.models.schedule
|
||||
import app.models.schedule
|
||||
import app.models.trigger
|
||||
@@ -17,7 +17,6 @@ class Callback(db.Model):
|
||||
data = db.Column(db.Text )
|
||||
note = db.Column(db.Text )
|
||||
active = db.Column(db.Boolean )
|
||||
schedules = db.relationship("Schedule")
|
||||
|
||||
def __init__(self, name:str, domain:str, service:str, entity:str) -> None:
|
||||
self.name = name
|
||||
|
||||
@@ -12,13 +12,15 @@ class Schedule(db.Model):
|
||||
__tablename__ = "schedules"
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
||||
callback_id = db.Column(db.Integer, db.ForeignKey('callbacks.uuid') )
|
||||
callback_id = db.Column(db.String(32), db.ForeignKey('callbacks.uuid') )
|
||||
name = db.Column(db.String(64) )
|
||||
start_day = db.Column(db.Integer )
|
||||
start_time = db.Column(db.Time )
|
||||
end_day = db.Column(db.Integer )
|
||||
end_time = db.Column(db.Time )
|
||||
|
||||
callback = db.relationship("Callback")
|
||||
|
||||
def __init__(self, name:str, callback_id:str, startday, starttime, endday, endtime) -> None:
|
||||
self.name = name
|
||||
self.callback_id = callback_id
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
from app import db
|
||||
|
||||
class Trigger(db.Model):
|
||||
|
||||
# Table structure
|
||||
__tablename__ = "triggers"
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
||||
callback_id = db.Column(db.String(32), db.ForeignKey('callbacks.uuid') )
|
||||
schedule_id = db.Column(db.Integer, db.ForeignKey('schedules.id') )
|
||||
trigger_time= db.Column(db.DateTime )
|
||||
success = db.Column(db.Boolean )
|
||||
|
||||
callback = db.relationship("Callback")
|
||||
schedule = db.relationship("Schedule")
|
||||
|
||||
def __init__(self, callback_id:str, schedule_id:int, trigger_time, success:bool) -> None:
|
||||
self.callback_id = callback_id
|
||||
self.schedule_id = schedule_id
|
||||
self.trigger_time = trigger_time
|
||||
self.success = success
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return str(self.callback_id) + " triggered at " + str(self.trigger_time)
|
||||
|
||||
@classmethod
|
||||
def get_trigger(cls, id:int) -> any:
|
||||
result = cls.query.filter_by(id=id).first()
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
raise KeyError("ID {} does not exist".format(id))
|
||||
|
||||
@classmethod
|
||||
def get_triggers(cls, uuid:str) -> any:
|
||||
result = cls.query.filter_by(callback_id=uuid)
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
raise KeyError("UUID {} does not exist".format(uuid))
|
||||
|
||||
def delete(self):
|
||||
db.session.delete(self)
|
||||
db.session.commit( );
|
||||
|
||||
def save(self):
|
||||
db.session.add (self)
|
||||
db.session.commit( )
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
<button onclick="navigator.clipboard.writeText(window.location.origin + '{{ url_for('hook', uuid=callback.uuid) }}');">Copy URL</button>
|
||||
<button onclick="window.location.href='{{ url_for('schedule', uuid=callback.uuid) }}';">Manage schedule</button>
|
||||
<button onclick="window.location.href='{{ url_for('triggers', uuid=callback.uuid) }}';">See triggers</button>
|
||||
|
||||
<form action="{{url_for('save_callback', uuid=callback.uuid) }}" method="POST" id="callback-form">
|
||||
<h3>Details</h3>
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
{% extends "base/layout.html" %}
|
||||
{% block main %}
|
||||
{{ super() }}
|
||||
|
||||
<div>
|
||||
<h1>Triggers for <u>{{callback.name}}</u></h1>
|
||||
|
||||
<button onclick="window.location.href='{{ url_for('callback', uuid=callback.uuid) }}';">Back</button>
|
||||
|
||||
<p>
|
||||
{% if triggers.count() > 0 %}
|
||||
<table>
|
||||
<tr>
|
||||
<th>Trigger time</th>
|
||||
<th>Schedule</th>
|
||||
<th>Success</th>
|
||||
</tr>
|
||||
{% for trigger in triggers %}
|
||||
<tr>
|
||||
<td>{{trigger.trigger_time.strftime('%A %d %B at %H:%M:%S')}}</td>
|
||||
<td>{% if trigger.schedule_id != -1 %}{{trigger.schedule.name}}{% endif %}</td>
|
||||
<td>{{trigger.success}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% else %}
|
||||
This callback has not been triggered yet.
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,5 +1,7 @@
|
||||
import app.views.index
|
||||
import app.views.callbacks
|
||||
import app.views.schedules
|
||||
import app.views.triggers
|
||||
import app.views.hook
|
||||
import app.views.settings
|
||||
import app.views.dynamic
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
from html import entities
|
||||
from flask import redirect, render_template, request, url_for, flash
|
||||
|
||||
from datetime import time
|
||||
|
||||
from app import webapp
|
||||
from app.homeassistant import HomeAssistant
|
||||
from app.models.callback import Callback
|
||||
from app.models.schedule import Schedule
|
||||
from app.models.settings import Setting
|
||||
from app.views.auth import login_required
|
||||
|
||||
@@ -47,14 +43,6 @@ def callback(uuid:str):
|
||||
|
||||
return render_template("callback.html",callback=callback, domains=domains, services=services, entities=entities)
|
||||
|
||||
@webapp.route('/callback/schedule/<uuid>')
|
||||
@login_required
|
||||
def schedule(uuid:str):
|
||||
callback = Callback.get_callback(uuid)
|
||||
schedules = Schedule.get_schedules(uuid)
|
||||
|
||||
return render_template("schedule.html",callback=callback, schedules=schedules)
|
||||
|
||||
|
||||
@webapp.route('/save-callback/<uuid>', methods=['POST'])
|
||||
@login_required
|
||||
@@ -113,66 +101,3 @@ def save_callback(uuid:str):
|
||||
|
||||
flash("Changes saved successfully", "success")
|
||||
return redirect(url_for('callback', uuid=callback.uuid))
|
||||
|
||||
@webapp.route('/create_schedule/<uuid>', methods=['POST'])
|
||||
@login_required
|
||||
def create_schedule(uuid:str):
|
||||
|
||||
callback = None
|
||||
|
||||
try:
|
||||
callback = Callback.get_callback(uuid=uuid)
|
||||
except Exception as e:
|
||||
flash("Something went wrong.", "error")
|
||||
return redirect(url_for('callbacks'))
|
||||
|
||||
if not request.form['name']:
|
||||
flash("Name required", "error")
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
|
||||
name = request.form['name']
|
||||
startday = request.form['startday']
|
||||
starttime_str = request.form['starttime']
|
||||
endday = request.form['endday']
|
||||
endtime_str = request.form['endtime']
|
||||
|
||||
starttime_split = starttime_str.split(":")
|
||||
starttime = time(int(starttime_split[0]), int(starttime_split[1]), 0, 0)
|
||||
|
||||
endtime_split = endtime_str.split(":")
|
||||
endtime = time(int(endtime_split[0]), int(endtime_split[1]), 0, 0)
|
||||
|
||||
if(startday > endday):
|
||||
flash("Start day has to be the same or earlier than end day", "error")
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
if(startday == endday):
|
||||
if(starttime >= endtime):
|
||||
flash("Start time needs to be earlier than end time", "error")
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
|
||||
schedule = Schedule(name, uuid, startday, starttime, endday, endtime)
|
||||
schedule.save()
|
||||
|
||||
flash("Schedule created", "success")
|
||||
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
|
||||
@webapp.route('/delete_schedule/<id>')
|
||||
@login_required
|
||||
def delete_schedule(id:int):
|
||||
|
||||
schedule = None
|
||||
|
||||
try:
|
||||
schedule = Schedule.get_schedule(id=id)
|
||||
except Exception as e:
|
||||
flash("Something went wrong.", "error")
|
||||
return redirect(url_for('callbacks'))
|
||||
|
||||
uuid = schedule.callback_id
|
||||
|
||||
schedule.delete()
|
||||
|
||||
flash("Schedule deleted", "success")
|
||||
|
||||
return redirect(url_for('schedule', uuid=uuid))
|
||||
+12
-5
@@ -7,6 +7,7 @@ from app import webapp
|
||||
from app.models.callback import Callback
|
||||
from app.models.settings import Setting
|
||||
from app.models.schedule import Schedule
|
||||
from app.models.trigger import Trigger
|
||||
from app.homeassistant import HomeAssistant
|
||||
|
||||
@webapp.route('/hook/<uuid>')
|
||||
@@ -24,15 +25,16 @@ def hook(uuid:str):
|
||||
feedback = Setting.get_value(Setting.Keys.FEEDBACK);
|
||||
schedules = Schedule.get_schedules(uuid=callback.uuid);
|
||||
|
||||
now = datetime.now()
|
||||
cweekday = datetime.now().weekday()
|
||||
ctime = datetime.now().time()
|
||||
|
||||
anymatch = False;
|
||||
trigger_schedule = -1
|
||||
|
||||
if(schedules.count() != 0):
|
||||
for schedule in schedules:
|
||||
anymatch = False;
|
||||
|
||||
print(schedule)
|
||||
for schedule in schedules:
|
||||
|
||||
possiblematch = True
|
||||
|
||||
@@ -48,11 +50,13 @@ def hook(uuid:str):
|
||||
possiblematch = False
|
||||
|
||||
if(possiblematch):
|
||||
trigger_schedule = schedule.id
|
||||
anymatch = True
|
||||
|
||||
print(anymatch)
|
||||
|
||||
if not anymatch:
|
||||
trigger = Trigger(uuid, trigger_schedule, now, False)
|
||||
trigger.save()
|
||||
|
||||
if(feedback == "none"):
|
||||
return render_template("error/404.html"), 404
|
||||
if(feedback == "some"):
|
||||
@@ -60,6 +64,9 @@ def hook(uuid:str):
|
||||
if(feedback == "all"):
|
||||
return render_template("hook.html", name=callback.name, note="This action is not scheduled to be active at this time.")
|
||||
|
||||
trigger = Trigger(uuid, trigger_schedule, now, True)
|
||||
trigger.save()
|
||||
|
||||
try:
|
||||
HomeAssistant.getInstance().trigger_service(callback.domain, callback.service, callback.entity, callback.data)
|
||||
except HomeassistantAPIError as e:
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
from flask import redirect, render_template, request, url_for, flash
|
||||
|
||||
from datetime import time
|
||||
|
||||
from app import webapp
|
||||
from app.models.callback import Callback
|
||||
from app.models.schedule import Schedule
|
||||
from app.views.auth import login_required
|
||||
|
||||
@webapp.route('/callback/schedule/<uuid>')
|
||||
@login_required
|
||||
def schedule(uuid:str):
|
||||
callback = Callback.get_callback(uuid)
|
||||
schedules = Schedule.get_schedules(uuid)
|
||||
|
||||
return render_template("schedule.html",callback=callback, schedules=schedules)
|
||||
|
||||
@webapp.route('/create_schedule/<uuid>', methods=['POST'])
|
||||
@login_required
|
||||
def create_schedule(uuid:str):
|
||||
|
||||
callback = None
|
||||
|
||||
try:
|
||||
callback = Callback.get_callback(uuid=uuid)
|
||||
except Exception as e:
|
||||
flash("Something went wrong.", "error")
|
||||
return redirect(url_for('callbacks'))
|
||||
|
||||
if not request.form['name']:
|
||||
flash("Name required", "error")
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
|
||||
name = request.form['name']
|
||||
startday = request.form['startday']
|
||||
starttime_str = request.form['starttime']
|
||||
endday = request.form['endday']
|
||||
endtime_str = request.form['endtime']
|
||||
|
||||
starttime_split = starttime_str.split(":")
|
||||
starttime = time(int(starttime_split[0]), int(starttime_split[1]), 0, 0)
|
||||
|
||||
endtime_split = endtime_str.split(":")
|
||||
endtime = time(int(endtime_split[0]), int(endtime_split[1]), 0, 0)
|
||||
|
||||
if(startday > endday):
|
||||
flash("Start day has to be the same or earlier than end day", "error")
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
if(startday == endday):
|
||||
if(starttime >= endtime):
|
||||
flash("Start time needs to be earlier than end time", "error")
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
|
||||
schedule = Schedule(name, uuid, startday, starttime, endday, endtime)
|
||||
schedule.save()
|
||||
|
||||
flash("Schedule created", "success")
|
||||
|
||||
return redirect(url_for('schedule', uuid=callback.uuid))
|
||||
|
||||
@webapp.route('/delete_schedule/<id>')
|
||||
@login_required
|
||||
def delete_schedule(id:int):
|
||||
|
||||
schedule = None
|
||||
|
||||
try:
|
||||
schedule = Schedule.get_schedule(id=id)
|
||||
except Exception as e:
|
||||
flash("Something went wrong.", "error")
|
||||
return redirect(url_for('callbacks'))
|
||||
|
||||
uuid = schedule.callback_id
|
||||
|
||||
schedule.delete()
|
||||
|
||||
flash("Schedule deleted", "success")
|
||||
|
||||
return redirect(url_for('schedule', uuid=uuid))
|
||||
@@ -0,0 +1,16 @@
|
||||
from flask import redirect, render_template, request, url_for, flash
|
||||
|
||||
from datetime import time
|
||||
|
||||
from app import webapp
|
||||
from app.models.callback import Callback
|
||||
from app.models.trigger import Trigger
|
||||
from app.views.auth import login_required
|
||||
|
||||
@webapp.route('/callback/triggers/<uuid>')
|
||||
@login_required
|
||||
def triggers(uuid:str):
|
||||
callback = Callback.get_callback(uuid)
|
||||
triggers = Trigger.get_triggers(uuid)
|
||||
|
||||
return render_template("trigger.html",callback=callback, triggers=triggers)
|
||||
Reference in New Issue
Block a user