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)
|
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"))
|
response = self.client.get(reverse("feature_complete_toy:index"))
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
soup = self.get_soup(response.content)
|
soup = self.get_soup(response.content)
|
||||||
title_wrapper = soup.select_one("#listing-results td.title .title-wrapper")
|
title_wrapper = soup.select_one("#listing-results td.title .title-wrapper")
|
||||||
self.assertIsNotNone(title_wrapper)
|
self.assertIsNotNone(title_wrapper)
|
||||||
self.assertIsNone(title_wrapper.select_one("a"))
|
link = title_wrapper.select_one("a")
|
||||||
self.assertEqual(title_wrapper.text.strip(), self.object.name)
|
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
|
# There should be no edit link at all on the page
|
||||||
self.assertNotContains(
|
self.assertNotContains(
|
||||||
|
|
|
@ -73,7 +73,7 @@ class IndexView(
|
||||||
copy_url_name = None
|
copy_url_name = None
|
||||||
inspect_url_name = None
|
inspect_url_name = None
|
||||||
delete_url_name = None
|
delete_url_name = None
|
||||||
any_permission_required = ["add", "change", "delete"]
|
any_permission_required = ["add", "change", "delete", "view"]
|
||||||
search_fields = None
|
search_fields = None
|
||||||
search_backend_name = "default"
|
search_backend_name = "default"
|
||||||
is_searchable = None
|
is_searchable = None
|
||||||
|
@ -249,15 +249,21 @@ class IndexView(
|
||||||
|
|
||||||
def _get_title_column(self, field_name, column_class=TitleColumn, **kwargs):
|
def _get_title_column(self, field_name, column_class=TitleColumn, **kwargs):
|
||||||
column_class = self._get_title_column_class(column_class)
|
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:
|
if not self.model:
|
||||||
return column_class(
|
return column_class(
|
||||||
"name",
|
"name",
|
||||||
label=gettext_lazy("Name"),
|
label=gettext_lazy("Name"),
|
||||||
accessor=str,
|
accessor=str,
|
||||||
get_url=self.get_edit_url,
|
get_url=get_url,
|
||||||
)
|
)
|
||||||
return self._get_custom_column(
|
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):
|
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),))
|
return reverse(self.copy_url_name, args=(quote(instance.pk),))
|
||||||
|
|
||||||
def get_inspect_url(self, instance):
|
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),))
|
return reverse(self.inspect_url_name, args=(quote(instance.pk),))
|
||||||
|
|
||||||
def get_delete_url(self, instance):
|
def get_delete_url(self, instance):
|
||||||
|
|
Ładowanie…
Reference in New Issue