kopia lustrzana https://github.com/wagtail/wagtail
Add option to enable inspect view for snippets
rodzic
46c855fb97
commit
4b9f7df4fd
|
@ -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"),
|
||||
|
|
|
@ -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"],
|
||||
)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue