def test_select(self, select_dummy_field): setattr(select_dummy_field, "name", "f") assert ( Select()(select_dummy_field) == '<select id="" name="f"><option selected value="foo">lfoo</option>' '<option value="bar">lbar</option></select>') assert (Select(multiple=True)(select_dummy_field) == '<select id="" multiple name="f"><option selected value="foo">' 'lfoo</option><option value="bar">lbar</option></select>')
class IndicoEnumSelectField(SelectFieldBase): """Select field backed by a :class:`TitledEnum`""" widget = Select() def __init__(self, label=None, validators=None, enum=None, sorted=False, only=None, skip=None, none=None, titles=None, **kwargs): super(IndicoEnumSelectField, self).__init__(label, validators, **kwargs) self.enum = enum self.sorted = sorted self.only = only self.skip = skip or set() self.none = none self.titles = titles def iter_choices(self): items = (x for x in self.enum if x not in self.skip and (self.only is None or x in self.only)) if self.sorted: items = sorted(items, key=attrgetter('title')) if self.none is not None: yield ('', self.none, self.data is None) for item in items: title = item.title if self.titles is None else self.titles[item] yield (item.name, title, item == self.data) def process_formdata(self, valuelist): if valuelist: if not valuelist[0] and self.none is not None: self.data = None else: try: self.data = self.enum[valuelist[0]] except KeyError: raise ValueError(self.gettext('Not a valid choice'))