From d87cc769dd79fdf659990b232748b7d9f9222146 Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Sun, 12 Nov 2017 19:04:22 +0100 Subject: [PATCH 1/4] Switched away from deprecated bootstrap --- configurator.py | 118 ++++++++++++++++++++++++++++-------------------- dev.html | 97 +++++++++++++++++++++------------------ 2 files changed, 123 insertions(+), 92 deletions(-) diff --git a/configurator.py b/configurator.py index 0d09b75..269d366 100755 --- a/configurator.py +++ b/configurator.py @@ -1984,77 +1984,86 @@ INDEX = Template(r""" modemapping['txt'] = 'ace/mode/text'; modemapping['xml'] = 'ace/mode/xml'; modemapping['yaml'] = 'ace/mode/yaml'; + + function sort_select(id) { + var options = $('#' + id + ' option'); + var arr = options.map(function (_, o) { + return { + t: $(o).text(), v: o.value + }; + }).get(); + arr.sort(function (o1, o2) { + var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase(); + return t1 > t2 ? 1 : t1 < t2 ? -1 : 0; + }); + options.each(function (i, o) { + o.value = arr[i].v; + $(o).text(arr[i].t); + }); + } + var separator = '$separator'; - var bootstrap = $bootstrap; - if (bootstrap.hasOwnProperty("events")) { + var services_list = $services; + var events_list = $events; + var states_list = $states; + + if (events_list) { var events = document.getElementById("events"); - for (var i = 0; i < bootstrap.events.length; i++) { + for (var i = 0; i < events_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.events[i].event; - option.text = bootstrap.events[i].event; + option.value = events_list[i].event; + option.text = events_list[i].event; events.add(option); } var events = document.getElementById("events_side"); - for (var i = 0; i < bootstrap.events.length; i++) { + for (var i = 0; i < events_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.events[i].event; - option.text = bootstrap.events[i].event; + option.value = events_list[i].event; + option.text = events_list[i].event; events.add(option); } + sort_select('events'); + sort_select('events_side'); + } + + if (states_list) { var entities = document.getElementById("entities"); - for (var i = 0; i < bootstrap.states.length; i++) { + for (var i = 0; i < states_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.states[i].entity_id; - option.text = bootstrap.states[i].attributes.friendly_name + ' (' + bootstrap.states[i].entity_id + ')'; + option.value = states_list[i].entity_id; + option.text = states_list[i].attributes.friendly_name + ' (' + states_list[i].entity_id + ')'; entities.add(option); } var entities = document.getElementById("entities_side"); - for (var i = 0; i < bootstrap.states.length; i++) { + for (var i = 0; i < states_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.states[i].entity_id; - option.text = bootstrap.states[i].attributes.friendly_name + ' (' + bootstrap.states[i].entity_id + ')'; + option.value = states_list[i].entity_id; + option.text = states_list[i].attributes.friendly_name + ' (' + states_list[i].entity_id + ')'; entities.add(option); } + sort_select('entities'); + sort_select('entities_side'); + } + + if (services_list) { var services = document.getElementById("services"); - for (var i = 0; i < bootstrap.services.length; i++) { - for (var k in bootstrap.services[i].services) { + for (var i = 0; i < services_list.length; i++) { + for (var k in services_list[i].services) { var option = document.createElement("option"); - option.value = bootstrap.services[i].domain + '.' + k; - option.text = bootstrap.services[i].domain + '.' + k; + option.value = services_list[i].domain + '.' + k; + option.text = services_list[i].domain + '.' + k; services.add(option); } } var services = document.getElementById("services_side"); - for (var i = 0; i < bootstrap.services.length; i++) { - for (var k in bootstrap.services[i].services) { + for (var i = 0; i < services_list.length; i++) { + for (var k in services_list[i].services) { var option = document.createElement("option"); - option.value = bootstrap.services[i].domain + '.' + k; - option.text = bootstrap.services[i].domain + '.' + k; + option.value = services_list[i].domain + '.' + k; + option.text = services_list[i].domain + '.' + k; services.add(option); } } - - function sort_select(id) { - var options = $('#' + id + ' option'); - var arr = options.map(function (_, o) { - return { - t: $(o).text(), v: o.value - }; - }).get(); - arr.sort(function (o1, o2) { - var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase(); - return t1 > t2 ? 1 : t1 < t2 ? -1 : 0; - }); - options.each(function (i, o) { - o.value = arr[i].v; - $(o).text(arr[i].t); - }); - } - - sort_select('events'); - sort_select('events_side'); - sort_select('entities'); - sort_select('entities_side'); sort_select('services'); sort_select('services_side'); } @@ -3090,16 +3099,27 @@ class RequestHandler(BaseHTTPRequestHandler): self.send_header('Content-type', 'text/html') self.end_headers() - boot = "{}" + services = "[]" + events = "[]" + states = "[]" try: headers = { "Content-Type": "application/json" } if HASS_API_PASSWORD: headers["x-ha-access"] = HASS_API_PASSWORD - req = urllib.request.Request("%sbootstrap" % HASS_API, headers=headers, method='GET') + + req = urllib.request.Request("%sservices" % HASS_API, headers=headers, method='GET') with urllib.request.urlopen(req) as response: - boot = response.read().decode('utf-8') + services = response.read().decode('utf-8') + + req = urllib.request.Request("%sevents" % HASS_API, headers=headers, method='GET') + with urllib.request.urlopen(req) as response: + events = response.read().decode('utf-8') + + req = urllib.request.Request("%sstates" % HASS_API, headers=headers, method='GET') + with urllib.request.urlopen(req) as response: + states = response.read().decode('utf-8') except Exception as err: LOG.warning("Exception getting bootstrap") @@ -3114,7 +3134,9 @@ class RequestHandler(BaseHTTPRequestHandler): except Exception as err: LOG.warning("Exception getting release") LOG.warning(err) - html = get_html().safe_substitute(bootstrap=boot, + html = get_html().safe_substitute(services=services, + events=events, + states=states, current=VERSION, versionclass=color, separator="\%s" % os.sep if os.sep == "\\" else os.sep) diff --git a/dev.html b/dev.html index f37ac41..56f471e 100644 --- a/dev.html +++ b/dev.html @@ -1906,77 +1906,86 @@ modemapping['txt'] = 'ace/mode/text'; modemapping['xml'] = 'ace/mode/xml'; modemapping['yaml'] = 'ace/mode/yaml'; + + function sort_select(id) { + var options = $('#' + id + ' option'); + var arr = options.map(function (_, o) { + return { + t: $(o).text(), v: o.value + }; + }).get(); + arr.sort(function (o1, o2) { + var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase(); + return t1 > t2 ? 1 : t1 < t2 ? -1 : 0; + }); + options.each(function (i, o) { + o.value = arr[i].v; + $(o).text(arr[i].t); + }); + } + var separator = '$separator'; - var bootstrap = $bootstrap; - if (bootstrap.hasOwnProperty("events")) { + var services_list = $services; + var events_list = $events; + var states_list = $states; + + if (events_list) { var events = document.getElementById("events"); - for (var i = 0; i < bootstrap.events.length; i++) { + for (var i = 0; i < events_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.events[i].event; - option.text = bootstrap.events[i].event; + option.value = events_list[i].event; + option.text = events_list[i].event; events.add(option); } var events = document.getElementById("events_side"); - for (var i = 0; i < bootstrap.events.length; i++) { + for (var i = 0; i < events_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.events[i].event; - option.text = bootstrap.events[i].event; + option.value = events_list[i].event; + option.text = events_list[i].event; events.add(option); } + sort_select('events'); + sort_select('events_side'); + } + + if (states_list) { var entities = document.getElementById("entities"); - for (var i = 0; i < bootstrap.states.length; i++) { + for (var i = 0; i < states_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.states[i].entity_id; - option.text = bootstrap.states[i].attributes.friendly_name + ' (' + bootstrap.states[i].entity_id + ')'; + option.value = states_list[i].entity_id; + option.text = states_list[i].attributes.friendly_name + ' (' + states_list[i].entity_id + ')'; entities.add(option); } var entities = document.getElementById("entities_side"); - for (var i = 0; i < bootstrap.states.length; i++) { + for (var i = 0; i < states_list.length; i++) { var option = document.createElement("option"); - option.value = bootstrap.states[i].entity_id; - option.text = bootstrap.states[i].attributes.friendly_name + ' (' + bootstrap.states[i].entity_id + ')'; + option.value = states_list[i].entity_id; + option.text = states_list[i].attributes.friendly_name + ' (' + states_list[i].entity_id + ')'; entities.add(option); } + sort_select('entities'); + sort_select('entities_side'); + } + + if (services_list) { var services = document.getElementById("services"); - for (var i = 0; i < bootstrap.services.length; i++) { - for (var k in bootstrap.services[i].services) { + for (var i = 0; i < services_list.length; i++) { + for (var k in services_list[i].services) { var option = document.createElement("option"); - option.value = bootstrap.services[i].domain + '.' + k; - option.text = bootstrap.services[i].domain + '.' + k; + option.value = services_list[i].domain + '.' + k; + option.text = services_list[i].domain + '.' + k; services.add(option); } } var services = document.getElementById("services_side"); - for (var i = 0; i < bootstrap.services.length; i++) { - for (var k in bootstrap.services[i].services) { + for (var i = 0; i < services_list.length; i++) { + for (var k in services_list[i].services) { var option = document.createElement("option"); - option.value = bootstrap.services[i].domain + '.' + k; - option.text = bootstrap.services[i].domain + '.' + k; + option.value = services_list[i].domain + '.' + k; + option.text = services_list[i].domain + '.' + k; services.add(option); } } - - function sort_select(id) { - var options = $('#' + id + ' option'); - var arr = options.map(function (_, o) { - return { - t: $(o).text(), v: o.value - }; - }).get(); - arr.sort(function (o1, o2) { - var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase(); - return t1 > t2 ? 1 : t1 < t2 ? -1 : 0; - }); - options.each(function (i, o) { - o.value = arr[i].v; - $(o).text(arr[i].t); - }); - } - - sort_select('events'); - sort_select('events_side'); - sort_select('entities'); - sort_select('entities_side'); sort_select('services'); sort_select('services_side'); } From 1dcda0272c22143e40df9636e141b7ab279d476e Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Sun, 12 Nov 2017 19:09:16 +0100 Subject: [PATCH 2/4] Added hass event --- configurator.py | 1 + dev.html | 1 + 2 files changed, 2 insertions(+) diff --git a/configurator.py b/configurator.py index 269d366..559fbf9 100755 --- a/configurator.py +++ b/configurator.py @@ -1475,6 +1475,7 @@ INDEX = Template(r""" + From dceaa4c807b55cfdabe15c01e903d6415a4a7176 Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Sun, 12 Nov 2017 19:11:04 +0100 Subject: [PATCH 3/4] Bumped version, updated changelog --- changelog.txt | 4 ++++ configurator.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 878d3b9..1dbcd6c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +Version 0.2.3 (2017-11-12) +- Switched away from removed bootstrap API +- Added homeassistant-event + Version 0.2.2 (2017-11-01) - Added option to list directories first @dimagoltsman - Updated dependencies @jmart518 diff --git a/configurator.py b/configurator.py index 559fbf9..e1475e8 100755 --- a/configurator.py +++ b/configurator.py @@ -65,7 +65,7 @@ SO.setLevel(LOGLEVEL) SO.setFormatter(logging.Formatter('%(levelname)s:%(asctime)s:%(name)s:%(message)s')) LOG.addHandler(SO) RELEASEURL = "https://api.github.com/repos/danielperna84/hass-configurator/releases/latest" -VERSION = "0.2.2" +VERSION = "0.2.3" BASEDIR = "." DEV = False HTTPD = None From b39499665d794f024f19de5110d3c425f56cc3b6 Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Sun, 12 Nov 2017 19:13:43 +0100 Subject: [PATCH 4/4] It's a trigger, not event --- changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 1dbcd6c..d0d83b2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,6 @@ Version 0.2.3 (2017-11-12) - Switched away from removed bootstrap API -- Added homeassistant-event +- Added homeassistant-trigger Version 0.2.2 (2017-11-01) - Added option to list directories first @dimagoltsman