Source code for nti.schema.vocabulary

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Vocabularies and factories for use in schema fields.

When this package is configured (via ``configure.zcml``) there will be a schema
vocabulary named ``Countries`` available::

  >>> from nti.schema.field import Choice
  >>> from zope import interface

  >>> class IA(interface.Interface):
  ...      choice = Choice(title=u"Choice",
  ...                      vocabulary="Countries")
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from zope import component
from zope.schema.vocabulary import SimpleTerm as _SimpleTerm
from zope.schema.vocabulary import SimpleVocabulary as _SimpleVocabulary

from nti.i18n.locales.interfaces import ICountryAvailability

__docformat__ = "restructuredtext en"


[docs]class CountryTerm(_SimpleTerm): """ A titled, tokenized term representing a country. The token is the ISO3166 country code. The ``flag`` value is a browserresource path to an icon representing the country. """ def __init__(self, *args, **kwargs): self.flag = kwargs.pop('flag', None) super(CountryTerm, self).__init__(*args, **kwargs)
[docs] @classmethod def fromItem(cls, item): token, cdata = item value = cdata['name'] title = value flag = cdata['flag'] return cls(value, token, title, flag=flag)
[docs] def toExternalObject(self): return { 'token': self.token, 'title': self.title, 'value': self.value, 'flag': self.flag }
class _CountryVocabulary(_SimpleVocabulary): """ ``__contains__`` is based on the token, not the value. """ def __contains__(self, token): return token in self.by_token
[docs]def CountryVocabularyFactory(context): """ A vocabulary factory. """ countries = component.getUtility(ICountryAvailability) return _CountryVocabulary([CountryTerm.fromItem(item) for item in countries.getCountries().items()])