summaryrefslogtreecommitdiff
path: root/tests/admin_inlines
diff options
context:
space:
mode:
authorClément Mangin <clement.mangin@gmail.com>2018-08-09 11:43:55 -0400
committerTim Graham <timograham@gmail.com>2018-08-10 11:20:43 -0400
commit64e1a271f50d921a54388539b6ff7102a31c3d29 (patch)
treede40a5f21d9988ec170b7b7d1ce190852a6004b1 /tests/admin_inlines
parentd0928d6454d0b649663820e45d915016a2d9b001 (diff)
downloaddjango-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.py6
-rw-r--r--tests/admin_inlines/tests.py33
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')