3
0
Fork 0

fix: accept dict instead of true enum, for Grid.set_enum()

This commit is contained in:
Lance Edgar 2026-01-02 19:17:45 -06:00
parent 3f502fdc73
commit a17d7da74c
2 changed files with 44 additions and 9 deletions

View file

@ -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,13 +2067,27 @@ 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:
if isinstance(enum, EnumType):
if raw_value := obj[key]:
return raw_value.value
if isinstance(enum, dict):
return enum.get(value, value)
return value
def render_percent( # pylint: disable=unused-argument

View file

@ -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()