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)
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
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