コード例 #1
0
ファイル: fields.py プロジェクト: prawn-cake/simple-models
    def __init__(self, of, **kwargs):
        """

        :param of: callable: single validator,
                   e.g: 'str', 'lambda x: str(x).upper()'
        :param kwargs:
        """
        if not callable(of):
            raise ValueError("%r item type must be callable" % of)

        # NOTE: forbid to have external validators for the ListField
        if "validators" in kwargs:
            warnings.warn("%s shouldn't have 'validators' parameter, use 'of' instead" % self.__class__.__name__)
            kwargs.pop("validators")

        def list_validator(val):
            """Default ListField validator

            :param val: list item value
            """
            if not isinstance(val, list):
                raise ValidationError("Value %r is not a list" % val)
            return val

        self._set_default_validator(list_validator, kwargs)

        if is_document(of):
            document = of
            kwargs["validators"].append(lambda items: [document.create(val) for val in items])
        else:
            kwargs["validators"].append(lambda items: [of(val) for val in items])

        kwargs["default"] = kwargs.get("default", [])
        super(ListField, self).__init__(**kwargs)
コード例 #2
0
ファイル: fields.py プロジェクト: prawn-cake/simple-models
    def _run_validators(self, value, err=ValidationError):
        """Run validators chain and return validated (cleaned) value

        :param value: field value
        :param err: error to raise in case of validation errors
        :return: value :raise err:
        """
        for validator in self.validators:
            try:
                if is_document(validator):
                    # use document as a validator for nested documents
                    doc_cls = validator
                    value = doc_cls(**value)
                else:
                    value = validator(value)

                if value is None:
                    raise ValidationError("validator {!r} returned None value".format(validator))

            # InvalidOperation for decimal, TypeError
            except InvalidOperation:
                raise err("Invalid decimal operation for '{!r}' for the field " "`{!r}`".format(value, self))
            except (ValueError, TypeError) as exc:
                # Accept None value for non-required fields
                if not self.required and value is None:
                    return value

                raise err("Wrong value {!r} for the field `{!r}`: " "{}".format(value, self, exc))
        return value
コード例 #3
0
ファイル: fields.py プロジェクト: prawn-cake/simple-models
    def list(self):
        if hasattr(self, '_raw_value'):
            if isinstance(self._of, str):
                from simplemodels.models import registry
                self._of = registry.get(self._of)
                if not self._of:
                    raise ModelNotFoundError(
                        "Model '%s' does not exist" % self._of)

            if is_document(self._of):
                self._list = [self._of(data, **self._kwargs)
                              for data in self._raw_value]
            else:
                self._list = [self._of(data) for data in self._raw_value]
            delattr(self, '_raw_value')

        return self._list