diff --git a/src/wuttjamaican/app.py b/src/wuttjamaican/app.py index 69ba3a9..fd287fb 100644 --- a/src/wuttjamaican/app.py +++ b/src/wuttjamaican/app.py @@ -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 diff --git a/tests/test_app.py b/tests/test_app.py index 7168164..bc909bf 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -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'