from flask import redirect, render_template, request, url_for, flash from app import webapp from app.homeassistant import HomeAssistant from app.models.callback import Callback from app.models.settings import Setting from app.views.auth import login_required @webapp.route('/callbacks') @login_required def callbacks(): hass_url = Setting.get_value(Setting.Keys.HASS_URL) hass_token = Setting.get_value(Setting.Keys.HASS_TOKEN) validConnection = HomeAssistant.testConnection(hass_url, hass_token) if not validConnection: flash("Valid connection to Home Assistant is required!", "error") return redirect(url_for('settings')) callbacks = Callback.get_callbacks() return render_template("callbacks.html", callbacks=callbacks) @webapp.route('/create-callback') @login_required def create_callback(): domain, service, entity = HomeAssistant.getInstance().get_defaults() callback = Callback("New callback", domain, service, entity) callback.save() flash("Callback created", "success") return redirect(url_for("callback", uuid=callback.uuid)) @webapp.route('/callback/') @login_required def callback(uuid:str): callback = Callback.get_callback(uuid) domains = HomeAssistant.getInstance().get_domains() services = HomeAssistant.getInstance().get_services(callback.domain) entities = HomeAssistant.getInstance().get_entities(callback.domain) return render_template("callback.html",callback=callback, domains=domains, services=services, entities=entities) @webapp.route('/save-callback/', methods=['POST']) @login_required def save_callback(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('callback', uuid=callback.uuid)) callback.name = request.form['name'] callback.domain = request.form['domain'] callback.service = request.form['service'] callback.note = request.form['note'] if 'active' in request.form and request.form['active'] == 'true': callback.active = True else: callback.active = False service = HomeAssistant.getInstance().get_service(callback.domain, callback.service) entity = None if 'entity_id' or 'target' in service.fields: entity = request.form['entity'] callback.entity = entity data = request.form['data'] data_formatted = "" if data: for line in data.split("\n"): if line.strip(): keypair = line.split(":", 1) key = "" value = "" if len(keypair) == 2: key = keypair[0].strip() value = keypair[1].strip() if not key or not value: flash("Data ({}) incorrectly formatted!".format(key or value), "warning") elif key in ['entity_id', 'target'] or key not in service.fields: flash("{} ({}) not supported for this service".format(key, value), "error") else: data_formatted += "{key}: {value}\n".format(key=key, value=value) callback.data = data_formatted.rstrip() callback.save() flash("Changes saved successfully", "success") return redirect(url_for('callback', uuid=callback.uuid))