Esempio n. 1
0
 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)
Esempio n. 2
0
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