diff --git a/src/wuttaweb/forms/schema.py b/src/wuttaweb/forms/schema.py index 20f957b..bca71ae 100644 --- a/src/wuttaweb/forms/schema.py +++ b/src/wuttaweb/forms/schema.py @@ -205,17 +205,23 @@ class WuttaDictEnum(colander.String): """ def __init__(self, request, enum_dct, *args, **kwargs): + self.null_value = kwargs.pop("null_value", "") super().__init__(*args, **kwargs) self.request = request self.config = self.request.wutta_config self.app = self.config.get_app() self.enum_dct = enum_dct + def serialize(self, node, appstruct): + if appstruct is colander.null: + return self.null_value + return super().serialize(node, appstruct) + def widget_maker(self, **kwargs): # pylint: disable=empty-docstring """ """ if "values" not in kwargs: kwargs["values"] = list(self.enum_dct.items()) - + kwargs.setdefault("null_value", self.null_value) return widgets.SelectWidget(**kwargs) diff --git a/tests/forms/test_schema.py b/tests/forms/test_schema.py index 6c587fb..f2290ef 100644 --- a/tests/forms/test_schema.py +++ b/tests/forms/test_schema.py @@ -153,6 +153,20 @@ MOCK_STATUS = { class TestWuttaDictEnum(WebTestCase): + def test_serialize(self): + + # null_value is empty string by default + typ = mod.WuttaDictEnum(self.request, MOCK_STATUS) + node = colander.SchemaNode(typ) + self.assertEqual(typ.serialize(node, 1), "1") + self.assertEqual(typ.serialize(node, colander.null), "") + + # but can override if needed (?) + typ = mod.WuttaDictEnum(self.request, MOCK_STATUS, null_value="nope") + node = colander.SchemaNode(typ) + self.assertEqual(typ.serialize(node, 1), "1") + self.assertEqual(typ.serialize(node, colander.null), "nope") + def test_widget_maker(self): typ = mod.WuttaDictEnum(self.request, MOCK_STATUS) widget = typ.widget_maker()