Esempio n. 1
0
    def test_fields_bad_value(self):

        with self.assertRaises(TypeError) as ctx:
            forms.modelform_factory(Owner, forms.ModelForm, fields="abc1234")

        self.assertEqual(ctx.exception.args, (
            "OwnerForm.Meta.fields cannot be a string. Did you mean to type: ('abc1234',)?",
        ))
Esempio n. 2
0
    def test_modelform_factory_with_no_fields_exclude(self):

        with self.assertRaises(ImproperlyConfigured) as ctx:
            forms.modelform_factory(Owner, session=db)

        self.assertEqual(
            ctx.exception.args,
            ("Calling modelform_factory without defining 'fields' or 'exclude' explicitly is prohibited.",
             ),
        )
Esempio n. 3
0
    def test_modelform_factory_with_formfield_callback(self):

        self.callback_called = False

        def callback(*args, **kwargs):
            self.callback_called = True

        forms.modelform_factory(Owner,
                                fields=forms.ALL_FIELDS,
                                formfield_callback=callback,
                                session=db)

        self.assertTrue(self.callback_called)
Esempio n. 4
0
 def test_modelform_factory_fields(self):
     form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db)
     form = form_class()
     self.assertListEqual(sorted(form.fields.keys()), [
         "created_at", "is_used", "name", "options", "owner", "paint",
         "parts", "type"
     ])
Esempio n. 5
0
    def test_create_invalid(self):

        form_cls = forms.modelform_factory(Owner,
                                           fields=("first_name", "last_name"),
                                           session=db)
        form_cls.base_fields["first_name"].required = True
        form_cls.base_fields["last_name"].required = True

        class OwnerViewSet(viewsets.CreateModelMixin, viewsets.GenericViewSet):
            model = Owner
            form_class = form_cls
            success_url = "/viewsets/owners/{id}/"

        viewset = OwnerViewSet()
        viewset.kwargs = {}
        viewset.request = self.factory.post("/", data={})
        viewset.action = "create"

        response = viewset.create(viewset.request)

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            response.context_data["form"].errors,
            {
                "first_name": ["This field is required."],
                "last_name": ["This field is required."]
            },
        )
Esempio n. 6
0
    def test_modelform_factory_modelchoicefield_choices(self):
        form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db)
        data = {"name": "testing", "type": "car", "owner": 1}
        form = form_class(data=data)

        owner_choices = form.fields["owner"].choices
        option_choices = form.fields["options"].choices
        self.assertEqual(len(owner_choices), 2)
        self.assertEqual(len(option_choices), 4)
Esempio n. 7
0
 def test_get_bound_field(self):
     db.rollback()
     form = modelform_factory(Vehicle, fields=("owner", ), session=db)()
     field = form.fields["owner"]
     bf = field.get_bound_field(form, "owner")
     self.assertHTMLEqual(
         str(bf),
         '<select name="owner" required id="id_owner"><option value="" selected>---------</option></select>'
     )
Esempio n. 8
0
 def test_modelform_factory_instance_validate(self):
     vehicle = Vehicle(owner=self.owner)
     form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db)
     form = form_class(instance=vehicle, data={"name": "testing"})
     self.assertFalse(form.is_valid())
     self.assertEqual(
         {
             "type": ["This field is required."],
             "owner": ["This field is required."]
         }, form.errors)
Esempio n. 9
0
 def test_modelform_factory_instance_save(self):
     form_class = forms.modelform_factory(Vehicle,
                                          fields=forms.ALL_FIELDS,
                                          session=db)
     data = {
         "name": "testing",
         "type": "car",
         "owner": self.owner.id,
         "is_used": True
     }
     form = form_class(data=data)
     self.assertTrue(form.is_valid(), form.errors)
     form.save()
Esempio n. 10
0
    def test_new_with_form_class(self):

        form_cls = forms.modelform_factory(Owner, fields="__all__", session=db)

        class OwnerViewSet(viewsets.CreateModelMixin, viewsets.GenericViewSet):
            model = Owner
            form_class = form_cls

        viewset = OwnerViewSet()
        viewset.kwargs = {}
        viewset.request = self.factory.get("/")
        viewset.action = "new"

        response = viewset.new(viewset.request)

        self.assertEqual(response.status_code, 200)
        self.assertDictEqual(response.context_data, {
            "form": response.context_data["form"],
            "view": viewset
        })
        self.assertIsInstance(response.context_data["form"], form_cls)
Esempio n. 11
0
    def test_modelform_factory_instance_render(self):
        form_class = forms.modelform_factory(Vehicle,
                                             fields=forms.ALL_FIELDS,
                                             session=db)
        vehicle = Vehicle(owner=self.owner, type=VehicleType.car)
        form = form_class(instance=vehicle, data={})

        self.assertTrue(form.is_bound)
        self.assertEqual(
            form.errors, {
                "type": ["This field is required."],
                "is_used": ["This field is required."]
            })
        self.assertEqual(
            form.initial,
            {
                "created_at": None,
                "is_used": False,
                "msrp": None,
                "name": None,
                "owner": self.owner.id,
                "paint": None,
                "type": VehicleType.car,
            },
        )
        self.assertEqual(
            form.cleaned_data,
            {
                "paint": "",
                "msrp": None,
                "created_at": None,
                "options": [],
                "parts": [],
                "name": "",
                "owner": None
            },
        )

        form.order_fields(sorted(form.fields.keys()))

        soup = self.get_soup(form.as_p())
        expected_soup = self.get_soup("".join([
            "<p>",
            '  <label for="id_created_at">Created at:</label>',
            '  <input type="text" name="created_at" id="id_created_at" />',
            "</p>",
            '<ul class="errorlist"><li>This field is required.</li></ul>',
            "<p>",
            '  <label for="id_is_used">Is used:</label>',
            '  <input id="id_is_used" name="is_used" required type="checkbox" />',
            "</p>",
            "<p>",
            '  <label for="id_msrp">Msrp:</label>',
            '  <input id="id_msrp" name="msrp" step="0.01" type="number" />',
            "</p>",
            "<p>",
            '  <label for="id_name">Name:</label>',
            '  <input id="id_name" maxlength="50" name="name" type="text" />',
            '  <span class="helptext">'
            "    The name of the vehicle",
            "  </span>",
            "</p>",
            "<p>",
            '  <label for="id_options">Options:</label>',
            '  <select id="id_options" multiple="multiple" name="options">',
            "    <option value=\"1\">Option(id=1, name='Option 1')</option>",
            "    <option value=\"2\">Option(id=2, name='Option 2')</option>",
            "    <option value=\"3\">Option(id=3, name='Option 3')</option>",
            "    <option value=\"4\">Option(id=4, name='Option 4')</option>",
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_owner">Owner:</label>',
            '  <select id="id_owner" name="owner">',
            "    <option selected value>---------</option>",
            '    <option value="{}">{}</option>'.format(
                self.owner.id, self.owner),
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_paint">Paint:</label>',
            '  <select id="id_paint" name="paint">',
            "    <option selected value></option>",
            '    <option value="red">red</option>',
            '    <option value="green">green</option>',
            '    <option value="blue">blue</option>',
            '    <option value="silver">silver</option>',
            '    <option value="pink">pink</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_parts">Parts:</label>',
            '  <select id="id_parts" multiple="multiple" name="parts">',
            "  </select>",
            "</p>",
            '<ul class="errorlist">',
            "  <li>",
            "    This field is required.",
            "  </li>",
            "</ul>",
            "<p>",
            '  <label for="id_type">Type:</label>',
            '  <select id="id_type" name="type">',
            '    <option value="bus">Bus</option>',
            '    <option value="car">Car</option>',
            "  </select>",
            "</p>",
        ]))

        self.assertHTMLEqual(soup.prettify(), expected_soup.prettify())
Esempio n. 12
0
 class OwnerViewSet(viewsets.CreateModelMixin, viewsets.GenericViewSet):
     model = Owner
     fields = "__all__"
     form_class = forms.modelform_factory(Owner,
                                          fields="__all__",
                                          session=db)
Esempio n. 13
0
    def test_modelform_factory_new_render(self):
        form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db)
        form = form_class(data={})

        self.assertTrue(form.is_bound)
        self.assertEqual(
            form.errors, {
                "owner": ["This field is required."],
                "type": ["This field is required."]
            })
        self.assertEqual(
            form.initial, {
                "paint": None,
                "created_at": None,
                "type": None,
                "name": None,
                "is_used": None
            })
        self.assertEqual(
            form.cleaned_data,
            {
                "paint": "",
                "created_at": None,
                "options": [],
                "parts": [],
                "name": "",
                "is_used": None
            },
        )

        form.order_fields(sorted(form.fields.keys()))

        soup = self.get_soup(form.as_p())
        expected_soup = self.get_soup("".join([
            "<p>",
            '  <label for="id_created_at">Created at:</label>',
            '  <input type="text" name="created_at" id="id_created_at" />'
            "</p>",
            "<p>",
            '  <label for="id_is_used">Is used:</label>',
            '  <select name="is_used" id="id_is_used">',
            '    <option value="1" selected>Unknown</option>',
            '    <option value="2">Yes</option>',
            '    <option value="3">No</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_name">Name:</label>',
            '  <input id="id_name" name="name" type="text" />',
            '  <span class="helptext">'
            "    The name of the vehicle",
            "  </span>",
            "</p>",
            "<p>",
            '  <label for="id_options">Options:</label>',
            '  <select id="id_options" multiple="multiple" name="options">',
            "    <option value=\"1\">Option(id=1, name='Option 1')</option>",
            "    <option value=\"2\">Option(id=2, name='Option 2')</option>",
            "    <option value=\"3\">Option(id=3, name='Option 3')</option>",
            "    <option value=\"4\">Option(id=4, name='Option 4')</option>",
            "  </select>",
            "</p>",
            '<ul class="errorlist">',
            "  <li>",
            "    This field is required.",
            "  </li>",
            "</ul>",
            "<p>",
            '  <label for="id_owner">Owner:</label>',
            '  <select id="id_owner" name="owner" required>',
            "    <option selected value>---------</option>",
            '    <option value="{}">{}</option>'.format(
                self.owner.id, self.owner),
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_paint">Paint:</label>',
            '  <select id="id_paint" name="paint">',
            "    <option selected value></option>",
            '    <option value="red">red</option>',
            '    <option value="green">green</option>',
            '    <option value="blue">blue</option>',
            '    <option value="silver">silver</option>',
            '    <option value="pink">pink</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_parts">Parts:</label>',
            '  <select id="id_parts" multiple="multiple" name="parts">',
            "  </select>",
            "</p>",
            '<ul class="errorlist">',
            "  <li>",
            "    This field is required.",
            "  </li>",
            "</ul>",
            "<p>",
            '  <label for="id_type">Type:</label>',
            '  <select id="id_type" name="type">',
            '    <option value="bus">Bus</option>',
            '    <option value="car">Car</option>',
            "  </select>",
            "</p>",
        ]))
        self.assertEqual(soup.prettify(), expected_soup.prettify())
Esempio n. 14
0
class OwnerCreateViewWithForm(views.CreateView):
    model = Owner
    session = db
    form_class = forms.modelform_factory(Owner, fields="__all__", session=db)