Add option to enable inspect view for snippets

pull/10477/head
Sage Abdullah 2023-06-29 17:18:18 +01:00 zatwierdzone przez Matt Westcott
rodzic 46c855fb97
commit 4b9f7df4fd
3 zmienionych plików z 68 dodań i 5 usunięć

Wyświetl plik

@ -505,6 +505,11 @@ class HistoryView(ReportView):
)
class InspectView(generic.InspectView):
view_name = "inspect"
any_permission_required = ["add", "change", "delete"]
class PreviewOnCreateView(PreviewOnCreate):
pass
@ -693,6 +698,15 @@ class SnippetViewSet(ModelViewSet):
#: If set to a falsy value, the search will fall back to use Django's QuerySet API.
search_backend_name = "default"
#: Whether to enable the inspect view. Defaults to ``False``.
inspect_view_enabled = False
#: The fields to display in the inspect view.
inspect_view_fields = []
#: The fields to exclude from the inspect view.
inspect_view_fields_exclude = []
#: The URL namespace to use for the admin views.
#: If left unset, ``wagtailsnippets_{app_label}_{model_name}`` is used instead.
admin_url_namespace = None
@ -727,6 +741,9 @@ class SnippetViewSet(ModelViewSet):
#: The view class to use for the history view; must be a subclass of ``wagtail.snippet.views.snippets.HistoryView``.
history_view_class = HistoryView
#: The view class to use for the inspect view; must be a subclass of ``wagtail.snippet.views.snippets.InspectView``.
inspect_view_class = InspectView
#: The view class to use for previewing revisions; must be a subclass of ``wagtail.snippet.views.snippets.PreviewRevisionView``.
revisions_view_class = PreviewRevisionView
@ -796,6 +813,9 @@ class SnippetViewSet(ModelViewSet):
#: The template to use for the history view.
history_template_name = ""
#: The template to use for the inspect view.
inspect_template_name = ""
def __init__(self, model=None, **kwargs):
# Allow model to be defined on the class, or passed in via the constructor
self.model = model or self.model
@ -982,6 +1002,18 @@ class SnippetViewSet(ModelViewSet):
revisions_unschedule_url_name=self.get_url_name("revisions_unschedule"),
)
@property
def inspect_view(self):
return self.inspect_view_class.as_view(
model=self.model,
template_name=self.get_inspect_template(),
permission_policy=self.permission_policy,
edit_url_name=self.get_url_name("edit"),
delete_url_name=self.get_url_name("delete"),
fields=self.inspect_view_fields,
fields_exclude=self.inspect_view_fields_exclude,
)
@property
def revisions_view(self):
return self.revisions_view_class.as_view(
@ -1309,6 +1341,16 @@ class SnippetViewSet(ModelViewSet):
"""
return self.history_template_name or self.get_templates("history")
def get_inspect_template(self):
"""
Returns a template to be used when rendering ``inspect_view``. If a
template is specified by the ``inspect_template_name`` attribute, that will
be used. Otherwise, a list of preferred template names are returned.
"""
return self.inspect_template_name or self.get_templates(
"inspect", fallback=self.inspect_view_class.template_name
)
def get_admin_url_namespace(self):
"""Returns the URL namespace for the admin URLs for this model."""
if self.admin_url_namespace:
@ -1356,6 +1398,11 @@ class SnippetViewSet(ModelViewSet):
path("history/<str:pk>/", self.history_view, name="history"),
]
if self.inspect_view_enabled:
urlpatterns += [
path("inspect/<str:pk>/", self.inspect_view, name="inspect")
]
if self.preview_enabled:
urlpatterns += [
path("preview/", self.preview_on_add_view, name="preview_on_add"),

Wyświetl plik

@ -10,7 +10,6 @@ from wagtail.admin.menu import MenuItem
from wagtail.snippets.bulk_actions.delete import DeleteBulkAction
from wagtail.snippets.models import get_snippet_models
from wagtail.snippets.permissions import (
get_permission_name,
user_can_edit_snippet_type,
user_can_edit_snippets,
)
@ -64,27 +63,43 @@ def register_permissions():
@hooks.register("register_snippet_listing_buttons")
def register_snippet_listing_buttons(snippet, user, next_url=None):
model = type(snippet)
viewset = model.snippet_viewset
permission_policy = viewset.permission_policy
if user_can_edit_snippet_type(user, model):
yield SnippetListingButton(
_("Edit"),
reverse(
model.snippet_viewset.get_url_name("edit"),
viewset.get_url_name("edit"),
args=[quote(snippet.pk)],
),
attrs={"aria-label": _("Edit '%(title)s'") % {"title": str(snippet)}},
priority=10,
)
if user.has_perm(get_permission_name("delete", model)):
if viewset.inspect_view_enabled and permission_policy.user_has_any_permission(
user, viewset.inspect_view_class.any_permission_required
):
yield SnippetListingButton(
_("Inspect"),
reverse(
viewset.get_url_name("inspect"),
args=[quote(snippet.pk)],
),
attrs={"aria-label": _("Inspect '%(title)s'") % {"title": str(snippet)}},
priority=20,
)
if permission_policy.user_has_permission(user, "delete"):
yield SnippetListingButton(
_("Delete"),
reverse(
model.snippet_viewset.get_url_name("delete"),
viewset.get_url_name("delete"),
args=[quote(snippet.pk)],
),
attrs={"aria-label": _("Delete '%(title)s'") % {"title": str(snippet)}},
priority=20,
priority=30,
classes=["no"],
)

Wyświetl plik

@ -272,6 +272,7 @@ class FullFeaturedSnippetViewSet(SnippetViewSet):
menu_name = "fullfeatured"
# Ensure that the menu item is placed last
menu_order = 999999
inspect_view_enabled = True
# TODO: When specific search fields are supported in SQLite FTS (see #10217),
# specify search_fields or get_search_fields here