示例#1
0
文件: clone.py 项目: tai271828/maas
 def clean(self):
     """Validate that the form is valid and that the destinations can accept
     the storage and/or interfaces configuration from the source."""
     cleaned_data = super().clean()
     source = self.cleaned_data.get("source")
     if not source:
         # Django should be placing this automatically, but it does not
         # occur. So we force the setting of this error here.
         set_form_error(self, "source", "This field is required.")
     destinations = self.cleaned_data.get("destinations")
     destination_field = self.fields["destinations"]
     item_invalid = destination_field.error_messages["item_invalid"]
     storage = self.cleaned_data.get("storage", False)
     interfaces = self.cleaned_data.get("interfaces", False)
     if source and destinations:
         for index, dest in enumerate(destinations):
             if source == dest:
                 error = prefix_validation_error(
                     ValidationError(
                         "Source machine cannot be a destination machine."
                     ),
                     prefix=item_invalid,
                     code="item_invalid",
                     params={"nth": index},
                 )
                 set_form_error(self, "destinations", error)
             else:
                 if storage:
                     try:
                         dest._get_storage_mapping_between_nodes(source)
                     except ValidationError as exc:
                         error = prefix_validation_error(
                             exc,
                             prefix=item_invalid,
                             code="item_invalid",
                             params={"nth": index},
                         )
                         set_form_error(self, "destinations", error)
                 if interfaces:
                     try:
                         dest._get_interface_mapping_between_nodes(source)
                     except ValidationError as exc:
                         error = prefix_validation_error(
                             exc,
                             prefix=item_invalid,
                             code="item_invalid",
                             params={"nth": index},
                         )
                         set_form_error(self, "destinations", error)
     if not storage and not interfaces:
         set_form_error(
             self, "__all__", "Either storage or interfaces must be true."
         )
     return cleaned_data
示例#2
0
    def clean(self, value):
        LOGGER.debug("clean: > %s", value)

        if all(
                value.get(name) in field.empty_values
                for name, field in self.fields.items()):
            if self.required:
                raise forms.ValidationError("This section is required",
                                            code='incomplete')
            else:
                value = None

        else:
            cleaned_data = {}
            errors = []

            for name, field in self.fields.items():
                try:
                    cleaned_data[name] = field.clean(value.get(name))
                except forms.ValidationError as error:
                    errors.append(
                        prefix_validation_error(error,
                                                code='field_invalid',
                                                prefix='%(label)s: ',
                                                params={'label': field.label}))
            if errors:
                raise forms.ValidationError(errors)
            value = self.model(**cleaned_data)

        LOGGER.debug("clean: < %s", value)

        return value
    def clean(self, value):
        cleaned_data = []
        errors = []
        if value is not None:
            value = [x for x in value if x]

            for index, item in enumerate(value):
                try:
                    cleaned_data.append(self.base_field.clean(item))
                except forms.ValidationError as error:
                    errors.append(
                        prefix_validation_error(
                            error,
                            self.error_messages["item_invalid"],
                            code="item_invalid",
                            params={"nth": index}))

        if not value:
            cleaned_data = self.default() if callable(
                self.default) else self.default
        if cleaned_data is None and self.initial is not None:
            cleaned_data = self.initial() if callable(
                self.initial) else self.initial
        if errors:
            raise forms.ValidationError(list(chain.from_iterable(errors)))
        if not cleaned_data and self.required:
            raise forms.ValidationError(self.error_messages["required"])

        return cleaned_data
    def clean(self, value):
        LOGGER.debug("clean: > %s", value)

        if all(value.get(name) in field.empty_values
               for name, field in self.fields.items()):
            if self.required:
                raise forms.ValidationError("This section is required",
                                            code='incomplete')
            else:
                value = None

        else:
            cleaned_data = {}
            errors = []

            for name, field in self.fields.items():
                try:
                    cleaned_data[name] = field.clean(value.get(name))
                except forms.ValidationError as error:
                    if DJANGO21:
                        prefix = '%(label)s:'
                    else:
                        prefix = '%(label)s: '
                    errors.append(prefix_validation_error(
                        error, code='field_invalid',
                        prefix=prefix, params={'label': field.label}))
            if errors:
                raise forms.ValidationError(errors)
            value = self.model(**cleaned_data)

        LOGGER.debug("clean: < %s", value)

        return value
示例#5
0
 def run_validators(self, value: Any) -> None:
     super().run_validators(value)
     errors = []
     for index, item in enumerate(value):
         try:
             self.base_field.run_validators(item)
         except ValidationError as error:
             errors.append(
                 prefix_validation_error(
                     error,
                     prefix=self.error_messages["item_invalid"],
                     code="item_invalid",
                     params={"nth": index + 1},
                 ))
     if errors:
         raise ValidationError(errors)
示例#6
0
文件: fields.py 项目: g10f/sso
 def validate(self, value):
     # don't call SimpleArrayField validate method!
     super(SimpleArrayField, self).validate(value)
     errors = []
     for index, item in enumerate(value):
         try:
             self.base_field.validate(item)
         except ValidationError as error:
             errors.append(
                 prefix_validation_error(
                     error,
                     prefix=self.error_messages['item_invalid'],
                     code='item_invalid',
                     params={'nth': index + 1},
                 ))
     if errors:
         raise ValidationError(errors)
示例#7
0
 def clean(self, value):
     cleaned_data = []
     errors = []
     value = filter(None, value)
     for index, item in enumerate(value):
         try:
             cleaned_data.append(self.base_field.clean(item))
         except forms.ValidationError as error:
             errors.append(
                 prefix_validation_error(
                     error, self.error_messages["item_invalid"], code="item_invalid", params={"nth": index}
                 )
             )
     if errors:
         raise forms.ValidationError(list(chain.from_iterable(errors)))
     if not cleaned_data and self.required:
         raise forms.ValidationError(self.error_messages["required"])
     return cleaned_data
示例#8
0
文件: fields.py 项目: g10f/sso
    def run_validators(self, value):
        # don't call SimpleArrayField run_validators method!
        super(SimpleArrayField, self).run_validators(value)
        errors = []
        for index, item in enumerate(value):
            try:
                self.base_field.run_validators(item)
            except ValidationError as error:
                errors.append(
                    prefix_validation_error(
                        error,
                        prefix=self.error_messages['item_invalid'],
                        code='item_invalid',
                        params={'nth': index + 1},
                    ))
        if len(set(value)) < len(value):
            errors.append(self.error_messages['items_occur_multiple'])

        if errors:
            raise ValidationError(errors)
示例#9
0
    def to_python(self, value):
        if value is None:
            return None

        if isinstance(value, list):
            errors = []
            values = []
            for index, item in enumerate(value):
                try:
                    values.append(self.base_field.to_python(item))
                except ValidationError as error:
                    errors.append(prefix_validation_error(
                        error,
                        prefix=self.error_messages['item_invalid'],
                        code='item_invalid',
                        params={'nth': index},
                    ))
            if errors:
                raise ValidationError(errors)
        else:
            raise ValidationError(ugettext('Enter a list.'))
        return values
示例#10
0
    def to_python(self, value):
        if isinstance(value, list):
            items = value
        elif value:
            items = value.split(self.delimiter)
        else:
            items = []
        errors = []
        values = []

        range_pattern = re.compile('^(\d+)-(\d+)$')
        range_items = []
        for index, item in enumerate(items):
            is_range = range_pattern.match(item.strip())
            if is_range:
                range_items += self.expand_range(item.strip())
                # removing item decreases index used in errors,
                # so we pop an item off range_items in its place
                items.remove(item)
                items.insert(index, range_items.pop())

        # extend items so the index into the original input is not disturbed.
        items.extend(range_items)

        for index, item in enumerate(items):
            try:
                values.append(self.base_field.to_python(item))
            except ValidationError as error:
                errors.append(
                    prefix_validation_error(
                        error,
                        prefix=self.error_messages['item_invalid'],
                        code='item_invalid',
                        params={'nth': index + 1},
                    ))
        if errors:
            raise ValidationError(errors)
        return values
示例#11
0
    def to_python(self, value):
        if value is None:
            return None

        if isinstance(value, list):
            errors = []
            values = []
            for index, item in enumerate(value):
                try:
                    values.append(self.base_field.to_python(item))
                except ValidationError as error:
                    errors.append(
                        prefix_validation_error(
                            error,
                            prefix=self.error_messages['item_invalid'],
                            code='item_invalid',
                            params={'nth': index},
                        ))
            if errors:
                raise ValidationError(errors)
        else:
            raise ValidationError(ugettext('Enter a list.'))
        return values
示例#12
0
 def to_python(self, value: Any) -> List[Any]:
     if isinstance(value, list):
         items = value
     elif value:
         items = value.split(self.delimiter)
     else:
         items = []
     errors = []
     values = []
     for index, item in enumerate(items):
         try:
             values.append(self.base_field.to_python(item))
         except ValidationError as error:
             errors.append(
                 prefix_validation_error(
                     error,
                     prefix=self.error_messages["item_invalid"],
                     code="item_invalid",
                     params={"nth": index + 1},
                 ))
     if errors:
         raise ValidationError(errors)
     return values
 def prefix_validation_error(error, prefix, code, params):
     """
     Prefix a validation error message while maintaining the existing
     validation data structure.
     """
     if error.error_list == [error]:
         error_params = error.params or {}
         return ValidationError(
             # We can't simply concatenate messages since they might require
             # their associated parameters to be expressed correctly which
             # is not something `string_concat` does. For example, proxied
             # ungettext calls require a count parameter and are converted
             # to an empty string if they are missing it.
             message=string_concat(
                 SimpleLazyObject(lambda: prefix % params),
                 SimpleLazyObject(lambda: error.message % error_params),
             ),
             code=code,
             params=dict(error_params, **params),
         )
     return ValidationError([
         prefix_validation_error(e, prefix, code, params)
         for e in error.error_list
     ])
示例#14
0
 def clean(self):
     """Validate that the form is valid and that the destinations can accept
     the storage and/or interfaces configuration from the source."""
     cleaned_data = super().clean()
     source = self.cleaned_data.get("source")
     if not source:
         # Django should be placing this automatically, but it does not
         # occur. So we force the setting of this error here.
         self.add_error("source", "This field is required.")
     destinations = self.cleaned_data.get("destinations")
     destination_field = self.fields["destinations"]
     storage = self.cleaned_data.get("storage", False)
     interfaces = self.cleaned_data.get("interfaces", False)
     if source and destinations:
         for dest in destinations:
             if source == dest:
                 error = ValidationError(
                     destination_field.error_messages["is-source"],
                     code="is-source",
                     params={
                         "machine": str(dest),
                         "system_id": dest.system_id,
                     },
                 )
                 self.add_error("destinations", error)
             else:
                 if storage:
                     try:
                         dest._get_storage_mapping_between_nodes(source)
                     except ValidationError as exc:
                         error = prefix_validation_error(
                             exc,
                             prefix=destination_field.
                             error_messages["storage"],
                             code="storage",
                             params={
                                 "machine": str(dest),
                                 "system_id": dest.system_id,
                             },
                         )
                         self.add_error("destinations", error)
                 if interfaces:
                     try:
                         dest._get_interface_mapping_between_nodes(source)
                     except ValidationError as exc:
                         error = prefix_validation_error(
                             exc,
                             prefix=destination_field.
                             error_messages["networking"],
                             code="networking",
                             params={
                                 "machine": str(dest),
                                 "system_id": dest.system_id,
                             },
                         )
                         self.add_error("destinations", error)
     if not storage and not interfaces:
         self.add_error(
             "__all__",
             ValidationError(
                 "Either storage or interfaces must be true.",
                 code="required",
             ),
         )
     return cleaned_data