From b86bd06f99935589122f587c2688319e0892267b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 12 Oct 2020 09:21:47 +0000 Subject: [PATCH 1/4] Improve mobile app template handling --- homeassistant/components/mobile_app/webhook.py | 18 +++++++++++------- tests/components/mobile_app/test_webhook.py | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/mobile_app/webhook.py b/homeassistant/components/mobile_app/webhook.py index bbeea2e952123..fbeda2dcbb457 100644 --- a/homeassistant/components/mobile_app/webhook.py +++ b/homeassistant/components/mobile_app/webhook.py @@ -32,10 +32,13 @@ HTTP_CREATED, ) from homeassistant.core import EventOrigin -from homeassistant.exceptions import HomeAssistantError, ServiceNotFound, TemplateError -from homeassistant.helpers import config_validation as cv, device_registry as dr +from homeassistant.exceptions import HomeAssistantError, ServiceNotFound +from homeassistant.helpers import ( + config_validation as cv, + device_registry as dr, + template, +) from homeassistant.helpers.dispatcher import async_dispatcher_send -from homeassistant.helpers.template import attach from homeassistant.helpers.typing import HomeAssistantType from homeassistant.util.decorator import Registry @@ -285,7 +288,7 @@ async def webhook_stream_camera(hass, config_entry, data): @validate_schema( { str: { - vol.Required(ATTR_TEMPLATE): cv.template, + vol.Required(ATTR_TEMPLATE): cv.string, vol.Optional(ATTR_TEMPLATE_VARIABLES, default={}): dict, } } @@ -295,10 +298,11 @@ async def webhook_render_template(hass, config_entry, data): resp = {} for key, item in data.items(): try: - tpl = item[ATTR_TEMPLATE] - attach(hass, tpl) + tpl = template.Template(item[ATTR_TEMPLATE]) + tpl.ensure_valid() + tpl.hass = hass resp[key] = tpl.async_render(item.get(ATTR_TEMPLATE_VARIABLES)) - except TemplateError as ex: + except Exception as ex: # pylint: disable=broad-except resp[key] = {"error": str(ex)} return webhook_response(resp, registration=config_entry.data) diff --git a/tests/components/mobile_app/test_webhook.py b/tests/components/mobile_app/test_webhook.py index dec919317f52a..78b6fb3e753ea 100644 --- a/tests/components/mobile_app/test_webhook.py +++ b/tests/components/mobile_app/test_webhook.py @@ -70,13 +70,26 @@ async def test_webhook_handle_render_template(create_registrations, webhook_clie """Test that we render templates properly.""" resp = await webhook_client.post( "/api/webhook/{}".format(create_registrations[1]["webhook_id"]), - json=RENDER_TEMPLATE, + json={ + "type": "render_template", + "data": { + "one": {"template": "Hello world"}, + "two": {"template": "{{ now() | random }}"}, + "three": {"template": "{{ now() 3 }}"}, + }, + }, ) assert resp.status == 200 json = await resp.json() - assert json == {"one": "Hello world"} + assert json == { + "one": "Hello world", + "two": {"error": "object of type 'datetime.datetime' has no len()"}, + "three": { + "error": "TemplateSyntaxError: expected token 'end of print statement', got 'integer'" + }, + } async def test_webhook_handle_call_services(hass, create_registrations, webhook_client): From c72aba03f1123c5c78df913d99cb587bddbd426f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 12 Oct 2020 16:36:32 +0200 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: J. Nick Koston --- homeassistant/components/mobile_app/webhook.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/mobile_app/webhook.py b/homeassistant/components/mobile_app/webhook.py index fbeda2dcbb457..2d1849d6cb477 100644 --- a/homeassistant/components/mobile_app/webhook.py +++ b/homeassistant/components/mobile_app/webhook.py @@ -298,11 +298,9 @@ async def webhook_render_template(hass, config_entry, data): resp = {} for key, item in data.items(): try: - tpl = template.Template(item[ATTR_TEMPLATE]) - tpl.ensure_valid() - tpl.hass = hass + tpl = template.Template(item[ATTR_TEMPLATE], hass) resp[key] = tpl.async_render(item.get(ATTR_TEMPLATE_VARIABLES)) - except Exception as ex: # pylint: disable=broad-except + except TemplateError as ex: resp[key] = {"error": str(ex)} return webhook_response(resp, registration=config_entry.data) From ac30b23e4ae5cb40c384f9bb422a7639a4bc5554 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 12 Oct 2020 14:44:33 +0000 Subject: [PATCH 3/4] fix import --- homeassistant/components/mobile_app/webhook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/mobile_app/webhook.py b/homeassistant/components/mobile_app/webhook.py index 2d1849d6cb477..043a555b6b757 100644 --- a/homeassistant/components/mobile_app/webhook.py +++ b/homeassistant/components/mobile_app/webhook.py @@ -300,7 +300,7 @@ async def webhook_render_template(hass, config_entry, data): try: tpl = template.Template(item[ATTR_TEMPLATE], hass) resp[key] = tpl.async_render(item.get(ATTR_TEMPLATE_VARIABLES)) - except TemplateError as ex: + except template.TemplateError as ex: resp[key] = {"error": str(ex)} return webhook_response(resp, registration=config_entry.data) From b1492a0885e44aa07c2c9f80ff9d6e1b8ec0a13b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 12 Oct 2020 15:02:07 +0000 Subject: [PATCH 4/4] Fix test --- tests/components/mobile_app/test_webhook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/components/mobile_app/test_webhook.py b/tests/components/mobile_app/test_webhook.py index 78b6fb3e753ea..a75cc4fe92c33 100644 --- a/tests/components/mobile_app/test_webhook.py +++ b/tests/components/mobile_app/test_webhook.py @@ -85,7 +85,7 @@ async def test_webhook_handle_render_template(create_registrations, webhook_clie json = await resp.json() assert json == { "one": "Hello world", - "two": {"error": "object of type 'datetime.datetime' has no len()"}, + "two": {"error": "TypeError: object of type 'datetime.datetime' has no len()"}, "three": { "error": "TemplateSyntaxError: expected token 'end of print statement', got 'integer'" },