diff --git a/docs/changes.rst b/docs/changes.rst
index 61f3d9987..d6878c25e 100644
--- a/docs/changes.rst
+++ b/docs/changes.rst
@@ -4,6 +4,9 @@ Changelog
16.0.0 (unreleased)
-------------------
+- Custom widgets for choice fields in the session @@start view
+ [ale-rt, maurits]
+
- Fix problem with the identification report not being generated for certain survey sessions.
Ref: scrum-1846
Fixes: #688
diff --git a/src/euphorie/client/widgets/choice.py b/src/euphorie/client/widgets/choice.py
new file mode 100644
index 000000000..593c26de5
--- /dev/null
+++ b/src/euphorie/client/widgets/choice.py
@@ -0,0 +1,33 @@
+from functools import cached_property
+from z3c.form.browser.select import SelectWidget
+from z3c.form.interfaces import IFieldWidget
+from z3c.form.widget import FieldWidget
+from zope.interface import implementer
+
+
+class EuphorieChoiceWidget(SelectWidget):
+ """Select widget for z3c.form in the Euphorie context: better display
+ mode."""
+
+ @cached_property
+ def title_value(self):
+ if self.name in self.request.form:
+ token = self.request.form[self.name]
+ vocabulary = self.field.source(self.context)
+ try:
+ return vocabulary.getTermByToken(token).value
+ except LookupError:
+ return
+
+ return getattr(self.context.session, self.field.__name__, None)
+
+ def isSelected(self, term):
+ return term.title == self.title_value
+
+
+@implementer(IFieldWidget)
+def EuphorieChoiceFieldWidget(field, request):
+ """This is identicall to the equivalent in plone.app.z3cform but needs a
+ customization to use the EuphorieSelectWidget class."""
+ widget = FieldWidget(field, EuphorieChoiceWidget(request))
+ return widget
diff --git a/src/euphorie/client/widgets/configure.zcml b/src/euphorie/client/widgets/configure.zcml
index 46b045137..e4328a2b1 100644
--- a/src/euphorie/client/widgets/configure.zcml
+++ b/src/euphorie/client/widgets/configure.zcml
@@ -18,6 +18,12 @@
euphorie.client.interfaces.IClientSkinLayer"
/>
+