Add urlencode template filter (#37753)

* add urlencode template filter

* fix flake8

* add test to string ang integer

* better test vectors
This commit is contained in:
Jakob Schlyter 2020-07-13 16:48:29 +02:00 committed by GitHub
parent 34c2579507
commit dbcd5f4c2c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 0 deletions

View File

@ -9,6 +9,7 @@ import math
import random
import re
from typing import Any, Dict, Iterable, List, Optional, Union
from urllib.parse import urlencode as urllib_urlencode
import jinja2
from jinja2 import contextfilter, contextfunction
@ -945,6 +946,11 @@ def relative_time(value):
return dt_util.get_age(value)
def urlencode(value):
"""Urlencode dictionary and return as UTF-8 string."""
return urllib_urlencode(value).encode("utf-8")
class TemplateEnvironment(ImmutableSandboxedEnvironment):
"""The Home Assistant template environment."""
@ -1001,6 +1007,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment):
self.globals["as_timestamp"] = forgiving_as_timestamp
self.globals["relative_time"] = relative_time
self.globals["strptime"] = strptime
self.globals["urlencode"] = urlencode
if hass is None:
return

View File

@ -1872,3 +1872,16 @@ def test_render_complex_handling_non_template_values(hass):
assert template.render_complex(
{True: 1, False: template.Template("{{ hello }}", hass)}, {"hello": 2}
) == {True: 1, False: "2"}
def test_urlencode(hass):
"""Test the urlencode method."""
tpl = template.Template(
("{% set dict = {'foo': 'x&y', 'bar': 42} %}" "{{ dict | urlencode }}"), hass,
)
assert tpl.async_render() == "foo=x%26y&bar=42"
tpl = template.Template(
("{% set string = 'the quick brown fox = true' %}" "{{ string | urlencode }}"),
hass,
)
assert tpl.async_render() == "the%20quick%20brown%20fox%20%3D%20true"