diff options
author | Clément Mangin <clement.mangin@gmail.com> | 2018-08-09 11:43:55 -0400 |
---|---|---|
committer | Tim Graham <timograham@gmail.com> | 2018-08-10 11:20:43 -0400 |
commit | 64e1a271f50d921a54388539b6ff7102a31c3d29 (patch) | |
tree | de40a5f21d9988ec170b7b7d1ce190852a6004b1 /tests/admin_inlines | |
parent | d0928d6454d0b649663820e45d915016a2d9b001 (diff) | |
download | django-64e1a271f50d921a54388539b6ff7102a31c3d29.tar.gz |
Fixed #29637 -- Fixed admin change form crash if the user doesn’t have the add permission to a TabularInline.
Regression in 825f0beda804e48e9197fcf3b0d909f9f548aa47.
Diffstat (limited to 'tests/admin_inlines')
-rw-r--r-- | tests/admin_inlines/admin.py | 6 | ||||
-rw-r--r-- | tests/admin_inlines/tests.py | 33 |
2 files changed, 29 insertions, 10 deletions
diff --git a/tests/admin_inlines/admin.py b/tests/admin_inlines/admin.py index 7ac13ed3a4..b5f343a55b 100644 --- a/tests/admin_inlines/admin.py +++ b/tests/admin_inlines/admin.py @@ -74,6 +74,10 @@ class InnerInline2(admin.StackedInline): js = ('my_awesome_inline_scripts.js',) +class InnerInline2Tabular(admin.TabularInline): + model = Inner2 + + class CustomNumberWidget(forms.NumberInput): class Media: js = ('custom_number.js',) @@ -236,7 +240,7 @@ site.register(TitleCollection, inlines=[TitleInline]) # only ModelAdmin media site.register(Holder, HolderAdmin, inlines=[InnerInline]) # ModelAdmin and Inline media -site.register(Holder2, HolderAdmin, inlines=[InnerInline2]) +site.register(Holder2, HolderAdmin, inlines=[InnerInline2, InnerInline2Tabular]) # only Inline media site.register(Holder3, inlines=[InnerInline3]) diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py index 4ce744f4ef..749b3dd75f 100644 --- a/tests/admin_inlines/tests.py +++ b/tests/admin_inlines/tests.py @@ -588,9 +588,8 @@ class TestInlinePermissions(TestCase): self.author_book_auto_m2m_intermediate_id = author_book_auto_m2m_intermediate.pk holder = Holder2.objects.create(dummy=13) - inner2 = Inner2.objects.create(dummy=42, holder=holder) + self.inner2 = Inner2.objects.create(dummy=42, holder=holder) self.holder_change_url = reverse('admin:admin_inlines_holder2_change', args=(holder.id,)) - self.inner2_id = inner2.id self.client.force_login(self.user) @@ -684,7 +683,7 @@ class TestInlinePermissions(TestCase): ) self.assertNotContains( response, - '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2_id, + '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2.id, html=True ) @@ -693,7 +692,7 @@ class TestInlinePermissions(TestCase): self.user.user_permissions.add(permission) response = self.client.get(self.holder_change_url) # Change permission on inner2s, so we can change existing but not add new - self.assertContains(response, '<h2>Inner2s</h2>') + self.assertContains(response, '<h2>Inner2s</h2>', count=2) # Just the one form for existing instances self.assertContains( response, '<input type="hidden" id="id_inner2_set-TOTAL_FORMS" value="1" name="inner2_set-TOTAL_FORMS">', @@ -701,7 +700,7 @@ class TestInlinePermissions(TestCase): ) self.assertContains( response, - '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2_id, + '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2.id, html=True ) # max-num 0 means we can't add new ones @@ -710,6 +709,14 @@ class TestInlinePermissions(TestCase): '<input type="hidden" id="id_inner2_set-MAX_NUM_FORMS" value="0" name="inner2_set-MAX_NUM_FORMS">', html=True ) + # TabularInline + self.assertContains(response, '<th class="required">Dummy</th>', html=True) + self.assertContains( + response, + '<input type="number" name="inner2_set-2-0-dummy" value="%s" ' + 'class="vIntegerField" id="id_inner2_set-2-0-dummy">' % self.inner2.dummy, + html=True, + ) def test_inline_change_fk_add_change_perm(self): permission = Permission.objects.get(codename='add_inner2', content_type=self.inner_ct) @@ -726,7 +733,7 @@ class TestInlinePermissions(TestCase): ) self.assertContains( response, - '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2_id, + '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2.id, html=True ) @@ -746,7 +753,7 @@ class TestInlinePermissions(TestCase): ) self.assertContains( response, - '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2_id, + '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2.id, html=True ) self.assertContains(response, 'id="id_inner2_set-0-DELETE"') @@ -760,7 +767,7 @@ class TestInlinePermissions(TestCase): self.user.user_permissions.add(permission) response = self.client.get(self.holder_change_url) # All perms on inner2s, so we can add/change/delete - self.assertContains(response, '<h2>Inner2s</h2>') + self.assertContains(response, '<h2>Inner2s</h2>', count=2) # One form for existing instance only, three for new self.assertContains( response, @@ -769,10 +776,18 @@ class TestInlinePermissions(TestCase): ) self.assertContains( response, - '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2_id, + '<input type="hidden" id="id_inner2_set-0-id" value="%i" name="inner2_set-0-id">' % self.inner2.id, html=True ) self.assertContains(response, 'id="id_inner2_set-0-DELETE"') + # TabularInline + self.assertContains(response, '<th class="required">Dummy</th>', html=True) + self.assertContains( + response, + '<input type="number" name="inner2_set-2-0-dummy" value="%s" ' + 'class="vIntegerField" id="id_inner2_set-2-0-dummy">' % self.inner2.dummy, + html=True, + ) @override_settings(ROOT_URLCONF='admin_inlines.urls') |