diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index e93627f..e69d876 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -612,6 +612,7 @@ class Grid: * ``'date'`` -> :meth:`render_date()` * ``'datetime'`` -> :meth:`render_datetime()` * ``'quantity'`` -> :meth:`render_quantity()` + * ``'percent'`` -> :meth:`render_percent()` Renderer overrides are tracked via :attr:`renderers`. """ @@ -622,6 +623,7 @@ class Grid: 'date': self.render_date, 'datetime': self.render_datetime, 'quantity': self.render_quantity, + 'percent': self.render_percent, } if renderer in builtins: @@ -1884,6 +1886,20 @@ class Grid: dt = getattr(obj, key) return self.app.render_datetime(dt) + def render_percent(self, obj, key, value, **kwargs): + """ + Column renderer for percentage values. + + This calls + :meth:`~wuttjamaican:wuttjamaican.app.AppHandler.render_percent()` + for the return value. + + This is not used automatically but you can use it explicitly:: + + grid.set_renderer('foo', 'percent') + """ + return self.app.render_percent(value, **kwargs) + def render_quantity(self, obj, key, value): """ Column renderer for quantity values. diff --git a/tests/grids/test_base.py b/tests/grids/test_base.py index 1002ac9..8a8b14e 100644 --- a/tests/grids/test_base.py +++ b/tests/grids/test_base.py @@ -1409,6 +1409,24 @@ class TestGrid(WebTestCase): value = decimal.Decimal('-42.42') self.assertEqual(grid.render_currency(obj, 'foo', value), '($42.42)') + def test_render_percent(self): + grid = self.make_grid(columns=['foo', 'bar']) + obj = MagicMock() + + # null + self.assertEqual(grid.render_percent(obj, 'foo', None), "") + + # typical + self.assertEqual(grid.render_percent(obj, 'foo', 12.3419), '12.34 %') + + # more decimal places + self.assertEqual(grid.render_percent(obj, 'foo', 12.3419, decimals=3), '12.342 %') + self.assertEqual(grid.render_percent(obj, 'foo', 12.3419, decimals=4), '12.3419 %') + + # negative + self.assertEqual(grid.render_percent(obj, 'foo', -12.3419), '(12.34 %)') + self.assertEqual(grid.render_percent(obj, 'foo', -12.3419, decimals=3), '(12.342 %)') + def test_render_quantity(self): grid = self.make_grid(columns=['foo', 'bar']) obj = MagicMock()