kopia lustrzana https://github.com/wagtail/wagtail
Link to inspect view from index view if user only has view permission
This also allows the user to access the index view with only 'view' permissionpull/12015/head
rodzic
d8a9cd399e
commit
c3f770ef0e
|
@ -1483,13 +1483,56 @@ class TestListingButtons(WagtailTestUtils, TestCase):
|
|||
)
|
||||
self.user.user_permissions.add(admin_permission, add_permission)
|
||||
|
||||
response = self.client.get(reverse("fctoy-alt2:index"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
soup = self.get_soup(response.content)
|
||||
title_wrapper = soup.select_one("#listing-results td.title .title-wrapper")
|
||||
self.assertIsNotNone(title_wrapper)
|
||||
|
||||
# fctoy-alt2 doesn't have inspect view enabled, so the title cell should
|
||||
# not link anywhere
|
||||
self.assertIsNone(title_wrapper.select_one("a"))
|
||||
self.assertEqual(title_wrapper.text.strip(), str(self.object))
|
||||
|
||||
# There should be no edit link at all on the page
|
||||
self.assertNotContains(
|
||||
response,
|
||||
reverse("fctoy-alt2:edit", args=[quote(self.object.pk)]),
|
||||
)
|
||||
|
||||
def test_title_cell_links_to_inspect_view_when_no_edit_permission(self):
|
||||
self.user.is_superuser = False
|
||||
self.user.save()
|
||||
admin_permission = Permission.objects.get(
|
||||
content_type__app_label="wagtailadmin",
|
||||
codename="access_admin",
|
||||
)
|
||||
view_permission = Permission.objects.get(
|
||||
content_type__app_label=self.object._meta.app_label,
|
||||
codename=get_permission_codename("view", self.object._meta),
|
||||
)
|
||||
self.user.user_permissions.add(admin_permission, view_permission)
|
||||
|
||||
response = self.client.get(reverse("feature_complete_toy:index"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
soup = self.get_soup(response.content)
|
||||
title_wrapper = soup.select_one("#listing-results td.title .title-wrapper")
|
||||
self.assertIsNotNone(title_wrapper)
|
||||
self.assertIsNone(title_wrapper.select_one("a"))
|
||||
self.assertEqual(title_wrapper.text.strip(), self.object.name)
|
||||
link = title_wrapper.select_one("a")
|
||||
self.assertIsNotNone(link)
|
||||
self.assertEqual(link.text.strip(), self.object.name)
|
||||
self.assertEqual(
|
||||
link.get("href"),
|
||||
reverse("feature_complete_toy:inspect", args=[quote(self.object.pk)]),
|
||||
)
|
||||
|
||||
# Should contain the inspect link twice:
|
||||
# once in the title cell and once in the dropdown
|
||||
self.assertContains(
|
||||
response,
|
||||
reverse("feature_complete_toy:inspect", args=[quote(self.object.pk)]),
|
||||
count=2,
|
||||
)
|
||||
|
||||
# There should be no edit link at all on the page
|
||||
self.assertNotContains(
|
||||
|
|
|
@ -73,7 +73,7 @@ class IndexView(
|
|||
copy_url_name = None
|
||||
inspect_url_name = None
|
||||
delete_url_name = None
|
||||
any_permission_required = ["add", "change", "delete"]
|
||||
any_permission_required = ["add", "change", "delete", "view"]
|
||||
search_fields = None
|
||||
search_backend_name = "default"
|
||||
is_searchable = None
|
||||
|
@ -249,15 +249,21 @@ class IndexView(
|
|||
|
||||
def _get_title_column(self, field_name, column_class=TitleColumn, **kwargs):
|
||||
column_class = self._get_title_column_class(column_class)
|
||||
|
||||
def get_url(instance):
|
||||
if edit_url := self.get_edit_url(instance):
|
||||
return edit_url
|
||||
return self.get_inspect_url(instance)
|
||||
|
||||
if not self.model:
|
||||
return column_class(
|
||||
"name",
|
||||
label=gettext_lazy("Name"),
|
||||
accessor=str,
|
||||
get_url=self.get_edit_url,
|
||||
get_url=get_url,
|
||||
)
|
||||
return self._get_custom_column(
|
||||
field_name, column_class, get_url=self.get_edit_url, **kwargs
|
||||
field_name, column_class, get_url=get_url, **kwargs
|
||||
)
|
||||
|
||||
def _get_custom_column(self, field_name, column_class=Column, **kwargs):
|
||||
|
@ -328,7 +334,9 @@ class IndexView(
|
|||
return reverse(self.copy_url_name, args=(quote(instance.pk),))
|
||||
|
||||
def get_inspect_url(self, instance):
|
||||
if self.inspect_url_name:
|
||||
if self.inspect_url_name and self.user_has_any_permission(
|
||||
{"add", "change", "delete", "view"}
|
||||
):
|
||||
return reverse(self.inspect_url_name, args=(quote(instance.pk),))
|
||||
|
||||
def get_delete_url(self, instance):
|
||||
|
|
Ładowanie…
Reference in New Issue