Add a trigger log every time the a callback is triggered

This commit is contained in:
2022-12-15 17:05:19 +01:00
parent 451160face
commit e41850ddee
11 changed files with 196 additions and 83 deletions
+2 -1
View File
@@ -1,3 +1,4 @@
import app.models.settings import app.models.settings
import app.models.callback import app.models.callback
import app.models.schedule import app.models.schedule
import app.models.trigger
-1
View File
@@ -17,7 +17,6 @@ class Callback(db.Model):
data = db.Column(db.Text ) data = db.Column(db.Text )
note = db.Column(db.Text ) note = db.Column(db.Text )
active = db.Column(db.Boolean ) active = db.Column(db.Boolean )
schedules = db.relationship("Schedule")
def __init__(self, name:str, domain:str, service:str, entity:str) -> None: def __init__(self, name:str, domain:str, service:str, entity:str) -> None:
self.name = name self.name = name
+3 -1
View File
@@ -12,13 +12,15 @@ class Schedule(db.Model):
__tablename__ = "schedules" __tablename__ = "schedules"
id = db.Column(db.Integer, primary_key=True, autoincrement=True) 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) ) name = db.Column(db.String(64) )
start_day = db.Column(db.Integer ) start_day = db.Column(db.Integer )
start_time = db.Column(db.Time ) start_time = db.Column(db.Time )
end_day = db.Column(db.Integer ) end_day = db.Column(db.Integer )
end_time = db.Column(db.Time ) end_time = db.Column(db.Time )
callback = db.relationship("Callback")
def __init__(self, name:str, callback_id:str, startday, starttime, endday, endtime) -> None: def __init__(self, name:str, callback_id:str, startday, starttime, endday, endtime) -> None:
self.name = name self.name = name
self.callback_id = callback_id self.callback_id = callback_id
+48
View File
@@ -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( )
+1
View File
@@ -7,6 +7,7 @@
<button onclick="navigator.clipboard.writeText(window.location.origin + '{{ url_for('hook', uuid=callback.uuid) }}');">Copy URL</button> <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('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"> <form action="{{url_for('save_callback', uuid=callback.uuid) }}" method="POST" id="callback-form">
<h3>Details</h3> <h3>Details</h3>
+33
View File
@@ -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 %}
+2
View File
@@ -1,5 +1,7 @@
import app.views.index import app.views.index
import app.views.callbacks import app.views.callbacks
import app.views.schedules
import app.views.triggers
import app.views.hook import app.views.hook
import app.views.settings import app.views.settings
import app.views.dynamic import app.views.dynamic
-75
View File
@@ -1,12 +1,8 @@
from html import entities
from flask import redirect, render_template, request, url_for, flash from flask import redirect, render_template, request, url_for, flash
from datetime import time
from app import webapp from app import webapp
from app.homeassistant import HomeAssistant from app.homeassistant import HomeAssistant
from app.models.callback import Callback from app.models.callback import Callback
from app.models.schedule import Schedule
from app.models.settings import Setting from app.models.settings import Setting
from app.views.auth import login_required 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) 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']) @webapp.route('/save-callback/<uuid>', methods=['POST'])
@login_required @login_required
@@ -113,66 +101,3 @@ def save_callback(uuid:str):
flash("Changes saved successfully", "success") flash("Changes saved successfully", "success")
return redirect(url_for('callback', uuid=callback.uuid)) 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
View File
@@ -7,6 +7,7 @@ from app import webapp
from app.models.callback import Callback from app.models.callback import Callback
from app.models.settings import Setting from app.models.settings import Setting
from app.models.schedule import Schedule from app.models.schedule import Schedule
from app.models.trigger import Trigger
from app.homeassistant import HomeAssistant from app.homeassistant import HomeAssistant
@webapp.route('/hook/<uuid>') @webapp.route('/hook/<uuid>')
@@ -24,15 +25,16 @@ def hook(uuid:str):
feedback = Setting.get_value(Setting.Keys.FEEDBACK); feedback = Setting.get_value(Setting.Keys.FEEDBACK);
schedules = Schedule.get_schedules(uuid=callback.uuid); schedules = Schedule.get_schedules(uuid=callback.uuid);
now = datetime.now()
cweekday = datetime.now().weekday() cweekday = datetime.now().weekday()
ctime = datetime.now().time() ctime = datetime.now().time()
anymatch = False; trigger_schedule = -1
if(schedules.count() != 0): if(schedules.count() != 0):
for schedule in schedules: anymatch = False;
print(schedule) for schedule in schedules:
possiblematch = True possiblematch = True
@@ -48,11 +50,13 @@ def hook(uuid:str):
possiblematch = False possiblematch = False
if(possiblematch): if(possiblematch):
trigger_schedule = schedule.id
anymatch = True anymatch = True
print(anymatch)
if not anymatch: if not anymatch:
trigger = Trigger(uuid, trigger_schedule, now, False)
trigger.save()
if(feedback == "none"): if(feedback == "none"):
return render_template("error/404.html"), 404 return render_template("error/404.html"), 404
if(feedback == "some"): if(feedback == "some"):
@@ -60,6 +64,9 @@ def hook(uuid:str):
if(feedback == "all"): if(feedback == "all"):
return render_template("hook.html", name=callback.name, note="This action is not scheduled to be active at this time.") 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: try:
HomeAssistant.getInstance().trigger_service(callback.domain, callback.service, callback.entity, callback.data) HomeAssistant.getInstance().trigger_service(callback.domain, callback.service, callback.entity, callback.data)
except HomeassistantAPIError as e: except HomeassistantAPIError as e:
+79
View File
@@ -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))
+16
View File
@@ -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)