mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Fix relative_time datetime object without timezone (#34273)
This commit is contained in:
parent
c9fba5db5e
commit
ccc818266b
@ -918,6 +918,27 @@ def random_every_time(context, values):
|
|||||||
return random.choice(values)
|
return random.choice(values)
|
||||||
|
|
||||||
|
|
||||||
|
def relative_time(value):
|
||||||
|
"""
|
||||||
|
Take a datetime and return its "age" as a string.
|
||||||
|
|
||||||
|
The age can be in second, minute, hour, day, month or year. Only the
|
||||||
|
biggest unit is considered, e.g. if it's 2 days and 3 hours, "2 days" will
|
||||||
|
be returned.
|
||||||
|
Make sure date is not in the future, or else it will return None.
|
||||||
|
|
||||||
|
If the input are not a datetime object the input will be returned unmodified.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not isinstance(value, datetime):
|
||||||
|
return value
|
||||||
|
if not value.tzinfo:
|
||||||
|
value = dt_util.as_local(value)
|
||||||
|
if dt_util.now() < value:
|
||||||
|
return value
|
||||||
|
return dt_util.get_age(value)
|
||||||
|
|
||||||
|
|
||||||
class TemplateEnvironment(ImmutableSandboxedEnvironment):
|
class TemplateEnvironment(ImmutableSandboxedEnvironment):
|
||||||
"""The Home Assistant template environment."""
|
"""The Home Assistant template environment."""
|
||||||
|
|
||||||
@ -972,7 +993,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment):
|
|||||||
self.globals["now"] = dt_util.now
|
self.globals["now"] = dt_util.now
|
||||||
self.globals["utcnow"] = dt_util.utcnow
|
self.globals["utcnow"] = dt_util.utcnow
|
||||||
self.globals["as_timestamp"] = forgiving_as_timestamp
|
self.globals["as_timestamp"] = forgiving_as_timestamp
|
||||||
self.globals["relative_time"] = dt_util.get_age
|
self.globals["relative_time"] = relative_time
|
||||||
self.globals["strptime"] = strptime
|
self.globals["strptime"] = strptime
|
||||||
if hass is None:
|
if hass is None:
|
||||||
return
|
return
|
||||||
|
@ -829,6 +829,48 @@ def test_now(mock_is_safe, hass):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@patch(
|
||||||
|
"homeassistant.helpers.template.TemplateEnvironment.is_safe_callable",
|
||||||
|
return_value=True,
|
||||||
|
)
|
||||||
|
def test_relative_time(mock_is_safe, hass):
|
||||||
|
"""Test relative_time method."""
|
||||||
|
now = datetime.strptime("2000-01-01 10:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z")
|
||||||
|
with patch("homeassistant.util.dt.now", return_value=now):
|
||||||
|
assert (
|
||||||
|
"1 hour"
|
||||||
|
== template.Template(
|
||||||
|
'{{relative_time(strptime("2000-01-01 09:00:00", "%Y-%m-%d %H:%M:%S"))}}',
|
||||||
|
hass,
|
||||||
|
).async_render()
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"2 hours"
|
||||||
|
== template.Template(
|
||||||
|
'{{relative_time(strptime("2000-01-01 09:00:00 +01:00", "%Y-%m-%d %H:%M:%S %z"))}}',
|
||||||
|
hass,
|
||||||
|
).async_render()
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"1 hour"
|
||||||
|
== template.Template(
|
||||||
|
'{{relative_time(strptime("2000-01-01 03:00:00 -06:00", "%Y-%m-%d %H:%M:%S %z"))}}',
|
||||||
|
hass,
|
||||||
|
).async_render()
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
str(template.strptime("2000-01-01 11:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z"))
|
||||||
|
== template.Template(
|
||||||
|
'{{relative_time(strptime("2000-01-01 11:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z"))}}',
|
||||||
|
hass,
|
||||||
|
).async_render()
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"string"
|
||||||
|
== template.Template('{{relative_time("string")}}', hass,).async_render()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@patch(
|
@patch(
|
||||||
"homeassistant.helpers.template.TemplateEnvironment.is_safe_callable",
|
"homeassistant.helpers.template.TemplateEnvironment.is_safe_callable",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user