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.settings
|
||||||
import app.models.callback
|
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 )
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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="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>
|
||||||
|
|||||||
@@ -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.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
|
||||||
|
|||||||
@@ -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
@@ -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:
|
||||||
|
|||||||
@@ -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