def __init__(self, *args, **fields): Field.__init__(self) if len(args) == 1: if fields: raise TypeError('keyword arguments and dict given') self.fields = OrderedDict(args[0]) else: if args: raise TypeError('no positional arguments allowed if keyword ' 'arguments provided.') self.fields = OrderedDict(fields) self.fields.sort(key=lambda i: i[1]._position_hint)
class Mapping(Field): """Apply a set of fields to a dictionary of values. >>> field = Mapping(name=TextField(), age=IntegerField()) >>> field({'name': u'John Doe', 'age': u'42'}) {'age': 42, 'name': u'John Doe'} Although it's possible to reassign the widget after field construction it's not recommended because the `MappingWidget` is the only builtin widget that is able to handle mapping structures. """ widget = widgets.MappingWidget def __init__(self, *args, **fields): Field.__init__(self) if len(args) == 1: if fields: raise TypeError('keyword arguments and dict given') self.fields = OrderedDict(args[0]) else: if args: raise TypeError('no positional arguments allowed if keyword ' 'arguments provided.') self.fields = OrderedDict(fields) self.fields.sort(key=lambda i: i[1]._position_hint) def empty_as_item(self, values): for name, field in self.fields.iteritems(): if field.empty_as_item(values.get(name)): return True return False def convert(self, value): value = _force_dict(value) errors = {} result = {} for name, field in self.fields.iteritems(): try: result[name] = field(value.get(name)) except ValidationError, e: errors[name] = e if errors: raise MultipleValidationErrors(errors) return result