fix: accept dict instead of true enum, for Grid.set_enum()
This commit is contained in:
parent
3f502fdc73
commit
a17d7da74c
2 changed files with 44 additions and 9 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# wuttaweb -- Web App for Wutta Framework
|
# wuttaweb -- Web App for Wutta Framework
|
||||||
# Copyright © 2024-2025 Lance Edgar
|
# Copyright © 2024-2026 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Wutta Framework.
|
# This file is part of Wutta Framework.
|
||||||
#
|
#
|
||||||
|
|
@ -30,6 +30,12 @@ import logging
|
||||||
import warnings
|
import warnings
|
||||||
from collections import namedtuple, OrderedDict
|
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
|
import sqlalchemy as sa
|
||||||
from sqlalchemy import orm
|
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 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.enums[key] = enum
|
||||||
self.set_renderer(key, self.render_enum, enum=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()`.
|
See also :meth:`set_enum()`.
|
||||||
|
|
||||||
:param enum: Enum class for the field. This should be an
|
: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::
|
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
|
TWO = 2
|
||||||
THREE = 3
|
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:
|
if enum:
|
||||||
raw_value = obj[key]
|
|
||||||
if raw_value:
|
if isinstance(enum, EnumType):
|
||||||
return raw_value.value
|
if raw_value := obj[key]:
|
||||||
|
return raw_value.value
|
||||||
|
|
||||||
|
if isinstance(enum, dict):
|
||||||
|
return enum.get(value, value)
|
||||||
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1602,15 +1602,30 @@ class TestGrid(WebTestCase):
|
||||||
grid = self.make_grid(columns=["foo", "bar"])
|
grid = self.make_grid(columns=["foo", "bar"])
|
||||||
obj = {"status": None}
|
obj = {"status": None}
|
||||||
|
|
||||||
# null
|
# true enum, null
|
||||||
value = grid.render_enum(obj, "status", None, enum=enum.UpgradeStatus)
|
value = grid.render_enum(obj, "status", None, enum=enum.UpgradeStatus)
|
||||||
self.assertIsNone(value)
|
self.assertIsNone(value)
|
||||||
|
|
||||||
# normal
|
# true enum, normal value
|
||||||
obj["status"] = enum.UpgradeStatus.SUCCESS
|
obj["status"] = enum.UpgradeStatus.SUCCESS
|
||||||
value = grid.render_enum(obj, "status", "SUCCESS", enum=enum.UpgradeStatus)
|
value = grid.render_enum(obj, "status", "SUCCESS", enum=enum.UpgradeStatus)
|
||||||
self.assertEqual(value, "success")
|
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):
|
def test_render_percent(self):
|
||||||
grid = self.make_grid(columns=["foo", "bar"])
|
grid = self.make_grid(columns=["foo", "bar"])
|
||||||
obj = MagicMock()
|
obj = MagicMock()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue