fix: convert datetime values to local zone for app.render_date()
This commit is contained in:
parent
55102f7b43
commit
71758a46c6
2 changed files with 29 additions and 3 deletions
|
|
@ -930,19 +930,28 @@ class AppHandler: # pylint: disable=too-many-public-methods
|
||||||
:meth:`render_datetime()`.
|
:meth:`render_datetime()`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def render_date(self, value):
|
def render_date(self, value, local=True):
|
||||||
"""
|
"""
|
||||||
Return a human-friendly display string for the given date.
|
Return a human-friendly display string for the given date.
|
||||||
|
|
||||||
Uses :attr:`display_format_date` to render the value.
|
Uses :attr:`display_format_date` to render the value.
|
||||||
|
|
||||||
:param value: A :class:`python:datetime.date` instance (or
|
:param value: Can be a :class:`python:datetime.date` *or*
|
||||||
``None``).
|
:class:`python:datetime.datetime` instance, or ``None``.
|
||||||
|
|
||||||
|
:param local: By default the ``value`` will first be passed to
|
||||||
|
:meth:`localtime()` to normalize it for display (but only
|
||||||
|
if value is a ``datetime`` instance). Specify
|
||||||
|
``local=False`` to skip that and render the value as-is.
|
||||||
|
|
||||||
:returns: Display string.
|
:returns: Display string.
|
||||||
"""
|
"""
|
||||||
if value is None:
|
if value is None:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
if local and isinstance(value, datetime.datetime):
|
||||||
|
value = self.localtime(value)
|
||||||
|
|
||||||
return value.strftime(self.display_format_date)
|
return value.strftime(self.display_format_date)
|
||||||
|
|
||||||
def render_datetime(self, value, local=True, html=False):
|
def render_datetime(self, value, local=True, html=False):
|
||||||
|
|
|
||||||
|
|
@ -619,11 +619,28 @@ app_title = WuttaTest
|
||||||
self.assertEqual(self.app.render_currency(value), "($42.42)")
|
self.assertEqual(self.app.render_currency(value), "($42.42)")
|
||||||
|
|
||||||
def test_render_date(self):
|
def test_render_date(self):
|
||||||
|
self.config.setdefault("wuttatest.timezone.default", "America/Los_Angeles")
|
||||||
|
tzlocal = get_timezone_by_name("America/Los_Angeles")
|
||||||
|
|
||||||
|
# null
|
||||||
self.assertEqual(self.app.render_date(None), "")
|
self.assertEqual(self.app.render_date(None), "")
|
||||||
|
|
||||||
|
# basic date
|
||||||
dt = datetime.date(2024, 12, 11)
|
dt = datetime.date(2024, 12, 11)
|
||||||
self.assertEqual(self.app.render_date(dt), "2024-12-11")
|
self.assertEqual(self.app.render_date(dt), "2024-12-11")
|
||||||
|
|
||||||
|
# local/aware datetime
|
||||||
|
dt = datetime.datetime(2024, 12, 11, 20, 30, tzinfo=tzlocal)
|
||||||
|
self.assertEqual(self.app.render_date(dt), "2024-12-11")
|
||||||
|
|
||||||
|
# naive UTC, but convert to local
|
||||||
|
dt = datetime.datetime(2024, 12, 12, 2, 30)
|
||||||
|
self.assertEqual(self.app.render_date(dt), "2024-12-11")
|
||||||
|
|
||||||
|
# naive UTC, no local conversion
|
||||||
|
dt = datetime.datetime(2024, 12, 12, 2, 30)
|
||||||
|
self.assertEqual(self.app.render_date(dt, local=False), "2024-12-12")
|
||||||
|
|
||||||
def test_render_datetime(self):
|
def test_render_datetime(self):
|
||||||
self.config.setdefault("wuttatest.timezone.default", "America/Los_Angeles")
|
self.config.setdefault("wuttatest.timezone.default", "America/Los_Angeles")
|
||||||
tzlocal = get_timezone_by_name("America/Los_Angeles")
|
tzlocal = get_timezone_by_name("America/Los_Angeles")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue