mirror of
https://github.com/django/django.git
synced 2025-11-17 10:43:25 +00:00
Merge 95ab880d27 into 5c60763561
This commit is contained in:
commit
b2ef68f708
4 changed files with 73 additions and 7 deletions
|
|
@ -457,6 +457,14 @@ class InlineAdminFormSet:
|
|||
def total_form_count(self):
|
||||
return self.formset.total_form_count
|
||||
|
||||
@property
|
||||
def can_delete(self):
|
||||
return (
|
||||
self.formset.can_delete
|
||||
and self.has_delete_permission
|
||||
and any(inlineadminform.original is not None for inlineadminform in self)
|
||||
)
|
||||
|
||||
@property
|
||||
def media(self):
|
||||
media = self.opts.media + self.formset.media
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
{% if field.help_text %}<img src="{% static "admin/img/icon-unknown.svg" %}" class="help help-tooltip" width="10" height="10" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}">{% endif %}
|
||||
</th>
|
||||
{% endfor %}
|
||||
<th>{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}{% translate "Delete?" %}{% endif %}</th>
|
||||
<th>{% if inline_admin_formset.can_delete %}{% translate "Delete?" %}{% endif %}</th>
|
||||
</tr></thead>
|
||||
|
||||
<tbody>
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
<td class="delete">{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
|
||||
<td class="delete">{% if inline_admin_formset.can_delete %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 25 KiB |
|
|
@ -829,6 +829,66 @@ class TestInline(TestDataMixin, TestCase):
|
|||
self.assertIs(parent.show_inlines, True)
|
||||
|
||||
|
||||
@override_settings(ROOT_URLCONF="admin_inlines.urls")
|
||||
class TestInlineCanDelete(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.user = User.objects.create_user(
|
||||
username="tester",
|
||||
password="password",
|
||||
is_staff=True,
|
||||
)
|
||||
# can_delete True case
|
||||
pc_permission = Permission.objects.filter(
|
||||
content_type=ContentType.objects.get_for_model(ProfileCollection)
|
||||
)
|
||||
p_permission = Permission.objects.filter(
|
||||
codename__in=["view_profile", "delete_profile"],
|
||||
content_type=ContentType.objects.get_for_model(Profile),
|
||||
)
|
||||
pc = ProfileCollection.objects.create()
|
||||
Profile.objects.create(collection=pc, first_name="SiHyun", last_name="Lee")
|
||||
# can_delete False case
|
||||
sp_permission = Permission.objects.filter(
|
||||
content_type=ContentType.objects.get_for_model(SomeParentModel)
|
||||
)
|
||||
sc_permission = Permission.objects.filter(
|
||||
codename__in=["view_somechildmodel"],
|
||||
content_type=ContentType.objects.get_for_model(SomeChildModel),
|
||||
)
|
||||
sp = SomeParentModel.objects.create(name="p")
|
||||
SomeChildModel.objects.create(name="c", position="0", parent=sp)
|
||||
cls.user.user_permissions.add(
|
||||
*pc_permission, *p_permission, *sp_permission, *sc_permission
|
||||
)
|
||||
|
||||
cls.pc_url = reverse(
|
||||
"admin:admin_inlines_profilecollection_change", args=(pc.pk,)
|
||||
)
|
||||
cls.sp_url = reverse(
|
||||
"admin:admin_inlines_someparentmodel_change", args=(sp.pk,)
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
self.client.force_login(self.user)
|
||||
|
||||
def test_tabular_inline_delete_field(self):
|
||||
response = self.client.get(self.pc_url)
|
||||
self.assertContains(response, "<th>Delete?</th>")
|
||||
response = self.client.get(self.sp_url)
|
||||
self.assertNotContains(response, "<th>Delete?</th>")
|
||||
|
||||
def test_tabular_inline_delete_checkbox_layout(self):
|
||||
response = self.client.get(self.pc_url)
|
||||
self.assertContains(
|
||||
response,
|
||||
'<td class="delete"><input type="checkbox" name="profile_set-0-DELETE" '
|
||||
'id="id_profile_set-0-DELETE"></td>',
|
||||
)
|
||||
response = self.client.get(self.sp_url)
|
||||
self.assertContains(response, '<td class="delete"></td>')
|
||||
|
||||
|
||||
@override_settings(ROOT_URLCONF="admin_inlines.urls")
|
||||
class TestInlineMedia(TestDataMixin, TestCase):
|
||||
def setUp(self):
|
||||
|
|
@ -2220,13 +2280,11 @@ class SeleniumTests(AdminSeleniumTestCase):
|
|||
# Click on a few delete buttons
|
||||
self.selenium.find_element(
|
||||
By.CSS_SELECTOR,
|
||||
"form#profilecollection_form tr.dynamic-profile_set#profile_set-1 "
|
||||
"td.delete a",
|
||||
"form#profilecollection_form tr.dynamic-profile_set#profile_set-1 " "a",
|
||||
).click()
|
||||
self.selenium.find_element(
|
||||
By.CSS_SELECTOR,
|
||||
"form#profilecollection_form tr.dynamic-profile_set#profile_set-2 "
|
||||
"td.delete a",
|
||||
"form#profilecollection_form tr.dynamic-profile_set#profile_set-2 " "a",
|
||||
).click()
|
||||
# The rows are gone and the IDs have been re-sequenced
|
||||
self.assertCountSeleniumElements(
|
||||
|
|
@ -2487,7 +2545,7 @@ class SeleniumTests(AdminSeleniumTestCase):
|
|||
"CREATION DATE",
|
||||
"UPDATE DATE",
|
||||
"UPDATED BY",
|
||||
"DELETE?",
|
||||
"",
|
||||
],
|
||||
)
|
||||
# There are no fieldset section names rendered.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue