Пример #1
0
    def fill_form_with_dummy_data(self, form, post_data=None):
        import django.forms.fields
        import django.forms.widgets

        try:
            from captcha.widgets import ReCaptcha
        except ImportError:
            ReCaptcha = None

        if post_data is None:
            post_data = {}
        else:
            post_data = dict(post_data)

        fields_to_delete = []

        for field in form:
            if field.field.required and not post_data.get(field.name):
                widget = field.field.widget

                if isinstance(widget, django.forms.widgets.Select):
                    choices = list(widget.choices)
                    if not choices:
                        choices = list(field.field.choices)
                    possible_values = [v for v, label in choices]
                    if isinstance(widget, django.forms.widgets.SelectMultiple):
                        value = [possible_values[0]]
                    else:
                        value = possible_values[0]

                elif isinstance(field.field, django.forms.fields.EmailField):
                    value = "*****@*****.**"

                elif isinstance(widget, ReCaptcha):
                    fields_to_delete.append(field.name)
                    continue

                else:
                    value = "Whee"

                post_data[field.name] = value

        query_dict = QueryDict('', mutable=True).copy()
        for key, value in post_data.iteritems():
            if hasattr(value, '__iter__'):
                query_dict.setlist(key, value)
            else:
                query_dict.setlist(key, [value])
        query_dict._mutable = False

        new_form = form.__class__(query_dict)

        for field_name in fields_to_delete:
            del new_form.fields[field_name]

        # post_data is not very useful if fields_to_delete is not empty,
        # because any form constructed with it won't validate, but it is
        # useful under some circumstances, so return it anyway.
        """
        if fields_to_delete:
            post_data = None
        """

        return new_form, post_data