diff --git a/composer/schema/field.py b/composer/schema/field.py index b49e716..1f2ecab 100644 --- a/composer/schema/field.py +++ b/composer/schema/field.py @@ -30,7 +30,7 @@ from zope.component import adapts from zope import component from zope.i18n.format import DateTimeParseError from zope.i18n.locales import locales -from zope.schema.interfaces import IVocabularyFactory +from zope.schema.interfaces import IVocabularyFactory, IContextSourceBinder from zope.tales.engine import Engine from zope.tales.tales import Context @@ -137,8 +137,15 @@ class Field(Component): return terms voc = voc.splitlines() return [dict(token=t, title=t) for t in voc if t.strip()] - else: - return [dict(token=t.token, title=t.title or t.value) for t in voc] + elif IContextSourceBinder.providedBy(voc): + source = voc(context) + terms = component.queryMultiAdapter((source, request), ITerms) + if terms is not None: + termsList = [terms.getTerm(value) for value in source] + return [dict(token=t.token, title=t.title) for t in termsList] + else: + return None + return [dict(token=t.token, title=t.title or t.value) for t in voc] def getVocabularyTerms(self, name, context, request): if context is None or request is None: diff --git a/composer/schema/grid/field.py b/composer/schema/grid/field.py index e5c8152..b2eefc9 100644 --- a/composer/schema/grid/field.py +++ b/composer/schema/grid/field.py @@ -162,6 +162,8 @@ class KeyTableFieldInstance(RecordsFieldInstance): def display(self, value): headers = [fi.context.title for fi in self.columnFieldInstances] rows = [] + if value is None: + value = {} for k, v in value.items(): row = [k] for idx, fi in enumerate(self.columnFieldInstances[1:]):