diff options
author | Anders Steinlein <anders@e5r.no> | 2014-03-05 21:19:40 +0100 |
---|---|---|
committer | Tim Graham <timograham@gmail.com> | 2014-05-15 07:25:35 -0400 |
commit | 4ef10f245ada0c7d5ae8dc31eebffa63790d40fb (patch) | |
tree | dffd7ca06862fa20b5fa0b4528ac8beeecaee9fa /tests/admin_inlines | |
parent | 860d31ac7a3bdd4b27db8b34b110b3d801ddaf8a (diff) | |
download | django-4ef10f245ada0c7d5ae8dc31eebffa63790d40fb.tar.gz |
Fixed #17642 -- Added min_num support to modelformsets, inlines, and the admin.
Thanks Stephen Burrows for work on the patch as well.
Forwardport of 2914f66983a92fcae55673c517dd8d01e8c238c4 from stable/1.7.x
Diffstat (limited to 'tests/admin_inlines')
-rw-r--r-- | tests/admin_inlines/tests.py | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py index ff34180a5b..7025158aab 100644 --- a/tests/admin_inlines/tests.py +++ b/tests/admin_inlines/tests.py @@ -1,13 +1,14 @@ from __future__ import unicode_literals +from django.contrib.admin import TabularInline, ModelAdmin from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase from django.contrib.admin.helpers import InlineAdminForm from django.contrib.auth.models import User, Permission from django.contrib.contenttypes.models import ContentType -from django.test import TestCase, override_settings +from django.test import TestCase, override_settings, RequestFactory # local test models -from .admin import InnerInline +from .admin import InnerInline, site as admin_site from .models import (Holder, Inner, Holder2, Inner2, Holder3, Inner3, Person, OutfitItem, Fashionista, Teacher, Parent, Child, Author, Book, Profile, ProfileCollection, ParentModelWithCustomPk, ChildModel1, ChildModel2, @@ -28,6 +29,7 @@ class TestInline(TestCase): result = self.client.login(username='super', password='secret') self.assertEqual(result, True) + self.factory = RequestFactory() def tearDown(self): self.client.logout() @@ -221,6 +223,62 @@ class TestInline(TestCase): self.assertContains(response, max_forms_input % 2) self.assertContains(response, total_forms_hidden) + def test_min_num(self): + """ + Ensure that min_num and extra determine number of forms. + """ + class MinNumInline(TabularInline): + model = BinaryTree + min_num = 2 + extra = 3 + + modeladmin = ModelAdmin(BinaryTree, admin_site) + modeladmin.inlines = [MinNumInline] + + min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="2" />' + total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="5" />' + + request = self.factory.get('/admin/admin_inlines/binarytree/add/') + request.user = User(username='super', is_superuser=True) + response = modeladmin.changeform_view(request) + self.assertContains(response, min_forms) + self.assertContains(response, total_forms) + + def test_custom_min_num(self): + """ + Ensure that get_min_num is called and used correctly. + See #22628 - this will change when that's fixed. + """ + bt_head = BinaryTree.objects.create(name="Tree Head") + BinaryTree.objects.create(name="First Child", parent=bt_head) + + class MinNumInline(TabularInline): + model = BinaryTree + extra = 3 + + def get_min_num(self, request, obj=None, **kwargs): + if obj: + return 5 + return 2 + + modeladmin = ModelAdmin(BinaryTree, admin_site) + modeladmin.inlines = [MinNumInline] + + min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="%d" />' + total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="%d" />' + + request = self.factory.get('/admin/admin_inlines/binarytree/add/') + request.user = User(username='super', is_superuser=True) + response = modeladmin.changeform_view(request) + self.assertContains(response, min_forms % 2) + self.assertContains(response, total_forms % 5) + + request = self.factory.get("/admin/admin_inlines/binarytree/%d/" % bt_head.id) + request.user = User(username='super', is_superuser=True) + response = modeladmin.changeform_view(request, object_id=str(bt_head.id)) + self.assertContains(response, min_forms % 5) + self.assertContains(response, total_forms % 9) + def test_inline_nonauto_noneditable_pk(self): response = self.client.get('/admin/admin_inlines/author/add/') self.assertContains(response, |