3
0
Fork 0

fix: add render_boolean, render_quantity app handler methods

This commit is contained in:
Lance Edgar 2025-01-02 19:48:02 -06:00
parent c6a0ecd475
commit 6d16aa0c02
2 changed files with 65 additions and 2 deletions

View file

@ -676,7 +676,20 @@ class AppHandler:
# common value renderers
##############################
def render_currency(self, value, scale=2, **kwargs):
def render_boolean(self, value):
"""
Render a boolean value for display.
:param value: A boolean, or ``None``.
:returns: Display string for the value.
"""
if value is None:
return ''
return "Yes" if value else "No"
def render_currency(self, value, scale=2):
"""
Return a human-friendly display string for the given currency
value, e.g. ``Decimal('4.20')`` becomes ``"$4.20"``.
@ -749,6 +762,28 @@ class AppHandler:
"""
return simple_error(error)
def render_quantity(self, value, empty_zero=False):
"""
Return a human-friendly display string for the given quantity
value, e.g. ``1.000`` becomes ``"1"``.
:param value: The quantity to be rendered.
:param empty_zero: Affects the display when value equals zero.
If false (the default), will return ``'0'``; if true then
it returns empty string.
:returns: Display string for the quantity.
"""
if value is None:
return ''
if int(value) == value:
value = int(value)
if empty_zero and value == 0:
return ''
return str(value)
return str(value).rstrip('0')
def render_time_ago(self, value):
"""
Return a human-friendly string, indicating how long ago

View file

@ -423,6 +423,17 @@ app_title = WuttaTest
session = self.app.get_session(user)
self.assertIs(session, mysession)
def test_render_boolean(self):
# null
self.assertEqual(self.app.render_boolean(None), "")
# true
self.assertEqual(self.app.render_boolean(True), "Yes")
# false
self.assertEqual(self.app.render_boolean(False), "No")
def test_render_currency(self):
# null
@ -460,7 +471,7 @@ app_title = WuttaTest
dt = datetime.datetime(2024, 12, 11, 8, 30, tzinfo=datetime.timezone.utc)
self.assertEqual(self.app.render_datetime(dt), '2024-12-11 08:30+0000')
def test_simple_error(self):
def test_render_error(self):
# with description
try:
@ -476,6 +487,23 @@ app_title = WuttaTest
result = self.app.render_error(error)
self.assertEqual(result, "RuntimeError")
def test_render_quantity(self):
# null
self.assertEqual(self.app.render_quantity(None), "")
# integer decimals become integers
value = decimal.Decimal('1.000')
self.assertEqual(self.app.render_quantity(value), "1")
# but decimal places are preserved
value = decimal.Decimal('1.234')
self.assertEqual(self.app.render_quantity(value), "1.234")
# zero can be empty string
self.assertEqual(self.app.render_quantity(0), "0")
self.assertEqual(self.app.render_quantity(0, empty_zero=True), "")
def test_render_time_ago(self):
with patch.object(mod, 'humanize') as humanize:
humanize.naturaltime.return_value = 'now'