diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index 63829a4..313dd67 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -2,7 +2,7 @@ ################################################################################ # # wuttaweb -- Web App for Wutta Framework -# Copyright © 2024-2025 Lance Edgar +# Copyright © 2024-2026 Lance Edgar # # This file is part of Wutta Framework. # @@ -30,6 +30,12 @@ import logging import warnings from collections import namedtuple, OrderedDict +try: + from enum import EnumType +except ImportError: # pragma: no cover + # nb. python < 3.11 + from enum import EnumMeta as EnumType + import sqlalchemy as sa from sqlalchemy import orm @@ -763,7 +769,7 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth :param key: Name of column. - :param enum: Instance of :class:`python:enum.Enum`. + :param enum: Instance of :class:`python:enum.Enum`, or a dict. """ self.enums[key] = enum self.set_renderer(key, self.render_enum, enum=enum) @@ -2050,7 +2056,7 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth See also :meth:`set_enum()`. :param enum: Enum class for the field. This should be an - instance of :class:`~python:enum.Enum`. + instance of :class:`~python:enum.Enum` or else a dict. To use this feature for your grid:: @@ -2061,12 +2067,26 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth TWO = 2 THREE = 3 - grid.set_enum('my_enum_field', MyEnum) + grid.set_enum("my_enum_field", MyEnum) + + Or, perhaps more common:: + + myenum = { + 1: "ONE", + 2: "TWO", + 3: "THREE", + } + + grid.set_enum("my_enum_field", myenum) """ if enum: - raw_value = obj[key] - if raw_value: - return raw_value.value + + if isinstance(enum, EnumType): + if raw_value := obj[key]: + return raw_value.value + + if isinstance(enum, dict): + return enum.get(value, value) return value diff --git a/tests/grids/test_base.py b/tests/grids/test_base.py index 5174335..4d9872d 100644 --- a/tests/grids/test_base.py +++ b/tests/grids/test_base.py @@ -1602,15 +1602,30 @@ class TestGrid(WebTestCase): grid = self.make_grid(columns=["foo", "bar"]) obj = {"status": None} - # null + # true enum, null value = grid.render_enum(obj, "status", None, enum=enum.UpgradeStatus) self.assertIsNone(value) - # normal + # true enum, normal value obj["status"] = enum.UpgradeStatus.SUCCESS value = grid.render_enum(obj, "status", "SUCCESS", enum=enum.UpgradeStatus) self.assertEqual(value, "success") + # dict enum + statuses = { + enum.UpgradeStatus.SUCCESS.name: "success", + enum.UpgradeStatus.FAILURE.name: "failure", + } + + # dict enum, null + value = grid.render_enum(obj, "status", None, enum=statuses) + self.assertIsNone(value) + + # true enum, normal value + obj["status"] = enum.UpgradeStatus.SUCCESS.value + value = grid.render_enum(obj, "status", "SUCCESS", enum=statuses) + self.assertEqual(value, "success") + def test_render_percent(self): grid = self.make_grid(columns=["foo", "bar"]) obj = MagicMock()