88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
from typing import Any, Dict
|
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.http import Http404
|
|
from django.urls import reverse
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from wagtail.admin.ui.tables import Column, DateColumn
|
|
from wagtail.admin.ui.tables.pages import (
|
|
PageStatusColumn,
|
|
PageTable,
|
|
PageTitleColumn,
|
|
ParentPageColumn,
|
|
)
|
|
from wagtail.admin.views import generic
|
|
from wagtail.admin.views.generic.base import BaseListingView
|
|
from wagtail.admin.views.pages.utils import (
|
|
GenericPageBreadcrumbsMixin,
|
|
)
|
|
from wagtail.models import Page
|
|
|
|
|
|
class ContentTypeUseView(BaseListingView):
|
|
results_template_name = "wagtailadmin/pages/usage_results.html"
|
|
page_title = _("Pages using")
|
|
header_icon = "doc-empty-inverse"
|
|
page_kwarg = "p"
|
|
paginate_by = 50
|
|
columns = [
|
|
PageTitleColumn("title", classname="title", label=_("Title")),
|
|
ParentPageColumn("parent", label=_("Parent")),
|
|
DateColumn("latest_revision_created_at", label=_("Updated"), width="12%"),
|
|
Column("type", label=_("Type"), accessor="page_type_display_name", width="12%"),
|
|
PageStatusColumn("status", label=_("Status"), width="12%"),
|
|
]
|
|
table_class = PageTable
|
|
table_classname = "listing"
|
|
|
|
def get(self, request, *, content_type_app_name, content_type_model_name):
|
|
try:
|
|
content_type = ContentType.objects.get_by_natural_key(
|
|
content_type_app_name, content_type_model_name
|
|
)
|
|
except ContentType.DoesNotExist:
|
|
raise Http404
|
|
|
|
self.page_class = content_type.model_class()
|
|
|
|
# page_class must be a Page type and not some other random model
|
|
if not issubclass(self.page_class, Page):
|
|
raise Http404
|
|
|
|
return super().get(request)
|
|
|
|
def get_page_subtitle(self):
|
|
return self.page_class.get_verbose_name()
|
|
|
|
def get_queryset(self):
|
|
return self.page_class.objects.all().specific(defer=True)
|
|
|
|
def get_index_url(self):
|
|
return reverse(
|
|
"wagtailadmin_pages:type_use",
|
|
args=[
|
|
self.kwargs["content_type_app_name"],
|
|
self.kwargs["content_type_model_name"],
|
|
],
|
|
)
|
|
|
|
def get_context_data(self, **kwargs: Any) -> Dict[str, Any]:
|
|
context = super().get_context_data(**kwargs)
|
|
context["page_class"] = self.page_class
|
|
return context
|
|
|
|
|
|
class UsageView(GenericPageBreadcrumbsMixin, generic.UsageView):
|
|
model = Page
|
|
pk_url_kwarg = "page_id"
|
|
header_icon = "doc-empty-inverse"
|
|
usage_url_name = "wagtailadmin_pages:usage"
|
|
edit_url_name = "wagtailadmin_pages:edit"
|
|
|
|
def dispatch(self, request, *args, **kwargs):
|
|
if not self.object.permissions_for_user(request.user).can_edit():
|
|
raise PermissionDenied
|
|
return super().dispatch(request, *args, **kwargs)
|