Example #1
0
    def convert(self, model, field, field_args):
        kwargs = {
            'label': field.verbose_name,
            'validators': [],
            'filters': [],
            'default': field.default,
            'description': field.help_text
        }
        if field_args:
            kwargs.update(field_args)

        if kwargs['validators']:
            # Create a copy of the list since we will be modifying it.
            kwargs['validators'] = list(kwargs['validators'])

        if field.null:
            # Treat empty string as None when converting.
            kwargs['filters'].append(handle_null_filter)

        if (field.null or (field.default is not None)) and not field.choices:
            # If the field can be empty, or has a default value, do not require
            # it when submitting a form.
            kwargs['validators'].append(validators.Optional())
        else:
            if isinstance(field, self.required):
                kwargs['validators'].append(validators.Required())

        if field.name in self.overrides:
            return FieldInfo(field.name, self.overrides[field.name](**kwargs))

        for converter in self.converters:
            if isinstance(field, converter):
                return self.converters[converter](model, field, **kwargs)
        else:
            for converter in self.defaults:
                if isinstance(field, converter):
                    if issubclass(self.defaults[converter], f.FormField):
                        # FormField fields (i.e. for nested forms) do not support
                        # filters.
                        kwargs.pop('filters')
                    if field.choices or 'choices' in kwargs:
                        choices = kwargs.pop('choices', field.choices)
                        if converter in self.coerce_settings or 'coerce' in kwargs:
                            coerce_fn = kwargs.pop(
                                'coerce', self.coerce_settings[converter])
                            allow_blank = kwargs.pop('allow_blank', field.null)
                            kwargs.update({
                                'choices': choices,
                                'coerce': coerce_fn,
                                'allow_blank': allow_blank
                            })

                            return FieldInfo(field.name,
                                             SelectChoicesField(**kwargs))

                    return FieldInfo(field.name,
                                     self.defaults[converter](**kwargs))

        raise AttributeError("There is not possible conversion "
                             "for '%s'" % type(field))
Example #2
0
    def convert(self, model, field, field_args):
        kwargs = dict(
            label=field.verbose_name,
            validators=[],
            filters=[],
            default=field.default,
            description=field.help_text,
        )
        if field_args:
            kwargs.update(field_args)

        if field.null:
            kwargs['filters'].append(handle_null_filter)
        elif field.default is not None:
            kwargs['validators'].append(validators.Optional())
        else:
            if isinstance(field, self.required):
                kwargs['validators'].append(validators.Required())

        field_class = type(field)

        if field_class in self.converters:
            return self.converters[field_class](model, field, **kwargs)
        elif field_class in self.defaults:
            if field.choices or 'choices' in kwargs:
                choices = kwargs.pop('choices', field.choices)
                if field_class in self.coerce_settings or 'coerce' in kwargs:
                    coerce_fn = kwargs.pop('coerce',
                                           self.coerce_settings[field_class])
                    allow_blank = kwargs.pop('allow_blank', field.null)
                    kwargs.update(
                        dict(choices=choices,
                             coerce=coerce_fn,
                             allow_blank=allow_blank))
                    return field.name, SelectChoicesField(**kwargs)

            return field.name, self.defaults[field_class](**kwargs)
Example #3
0
    def convert(self, model, field, field_args):
        kwargs = {
            'label': field.verbose_name,
            'validators': [],
            'filters': [],
            'default': field.default,
            'description': field.help_text
        }
        if field_args:
            kwargs.update(field_args)

        if kwargs['validators']:
            # Create a copy of the list since we will be modifying it.
            kwargs['validators'] = list(kwargs['validators'])

        if field.null:
            # Treat empty string as None when converting.
            kwargs['filters'].append(handle_null_filter)

        if (field.null or (field.default is not None)) or (
                field.choices and any(not (v) for v, _ in field.choices)):
            # We allow the field to be optional if:
            # 1. the field is null=True and can be blank.
            # 2. the field has a default value.
            kwargs['validators'].append(validators.Optional())
        else:
            kwargs['validators'].append(ValueRequired())

        if field.name in self.overrides:
            return FieldInfo(field.name, self.overrides[field.name](**kwargs))

        # Allow custom-defined Peewee field classes to define their own conversion,
        # making it so that code which calls model_form() doesn't have to have special
        # cases, especially when called for the same peewee.Model from multiple places, or
        # when called in a generic context which the end-developer has less control over,
        # such as via flask-admin.
        if hasattr(field, 'wtf_field'):
            return FieldInfo(field.name, field.wtf_field(model, **kwargs))

        for converter in self.converters:
            if isinstance(field, converter):
                return self.converters[converter](model, field, **kwargs)
        else:
            for converter in self.defaults:
                if not isinstance(field, converter):
                    # Early-continue because it simplifies reading the following code.
                    continue
                if issubclass(self.defaults[converter], f.FormField):
                    # FormField fields (i.e. for nested forms) do not support
                    # filters.
                    kwargs.pop('filters')
                if field.choices or 'choices' in kwargs:
                    choices = kwargs.pop('choices', field.choices)
                    if converter in self.coerce_settings or 'coerce' in kwargs:
                        coerce_fn = kwargs.pop('coerce',
                                               self.coerce_settings[converter])
                        allow_blank = kwargs.pop('allow_blank', field.null)
                        kwargs.update({
                            'choices': choices,
                            'coerce': coerce_fn,
                            'allow_blank': allow_blank
                        })

                        return FieldInfo(field.name,
                                         SelectChoicesField(**kwargs))

                return FieldInfo(field.name,
                                 self.defaults[converter](**kwargs))

        raise AttributeError("There is not possible conversion "
                             "for '%s'" % type(field))