From 485c503212bf76f749e54b2e10f0b969e117a6a1 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Fri, 20 Feb 2026 19:09:26 -0600 Subject: [PATCH] fix: raise better error if field widget serialization fails and log a warning with traceback while we're at it --- src/wuttaweb/forms/base.py | 13 ++++++++++++- tests/forms/test_base.py | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/wuttaweb/forms/base.py b/src/wuttaweb/forms/base.py index b1e142a..796fd6f 100644 --- a/src/wuttaweb/forms/base.py +++ b/src/wuttaweb/forms/base.py @@ -1138,7 +1138,18 @@ class Form: # pylint: disable=too-many-instance-attributes,too-many-public-meth field = dform[fieldname] if readonly: kwargs["readonly"] = True - html = field.serialize(**kwargs) + + try: + html = field.serialize(**kwargs) + except Exception as exc: + log.warning( + "widget serialization failed for field: %s", + fieldname, + exc_info=True, + ) + raise RuntimeError( + f"widget serialization failed for field: {fieldname}" + ) from exc else: # render static text if field not in deform/schema diff --git a/tests/forms/test_base.py b/tests/forms/test_base.py index 804b360..63f807a 100644 --- a/tests/forms/test_base.py +++ b/tests/forms/test_base.py @@ -587,6 +587,14 @@ class TestForm(WebTestCase): html = form.render_vue_field("foo") self.assertIn("something is wrong", html) + class BadWidget(deform.widget.Widget): + def serialize(self, **kwargs): + raise NotImplementedError + + # widget serialization error + dform["foo"].widget = BadWidget() + self.assertRaises(RuntimeError, form.render_vue_field, "foo") + # add another field, but not to deform, so it should still # display but with no widget form.fields.append("zanzibar")