Files
old-saburly-wagtail-web/env/lib/python3.10/site-packages/wagtail/admin/views/generic/usage.py
2024-08-27 20:33:44 +02:00

149 lines
5.0 KiB
Python

from django.contrib.admin.utils import quote
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.text import capfirst
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy
from wagtail.admin.admin_url_finder import AdminURLFinder
from wagtail.admin.ui import tables
from wagtail.admin.utils import get_latest_str
from wagtail.admin.widgets.button import HeaderButton
from wagtail.models import DraftStateMixin, ReferenceIndex
from .base import BaseListingView, BaseObjectMixin
from .permissions import PermissionCheckedMixin
class TitleColumn(tables.TitleColumn):
def get_link_attrs(self, instance, parent_context):
return {"title": instance["edit_link_title"]}
class UsageView(PermissionCheckedMixin, BaseObjectMixin, BaseListingView):
paginate_by = 20
page_title = gettext_lazy("Usage")
index_url_name = None
edit_url_name = None
usage_url_name = None
permission_required = "change"
@cached_property
def describe_on_delete(self):
return bool(self.request.GET.get("describe_on_delete"))
def get_object(self):
object = super().get_object()
if isinstance(object, DraftStateMixin):
return object.get_latest_revision_as_object()
return object
def get_edit_url(self, instance):
if self.edit_url_name:
return reverse(self.edit_url_name, args=(quote(instance.pk),))
def get_usage_url(self, instance):
if self.usage_url_name:
return reverse(self.usage_url_name, args=(quote(instance.pk),))
def get_index_url(self): # used for pagination links
return self.get_usage_url(self.object)
def get_page_subtitle(self):
return get_latest_str(self.object)
def get_breadcrumbs_items(self):
items = []
if self.index_url_name:
items.append(
{
"url": reverse(self.index_url_name),
"label": capfirst(self.object._meta.verbose_name_plural),
}
)
edit_url = self.get_edit_url(self.object)
if edit_url:
items.append(
{
"url": edit_url,
"label": get_latest_str(self.object),
}
)
items.append(
{
"url": "",
"label": _("Usage"),
"sublabel": self.get_page_subtitle(),
}
)
return self.breadcrumbs_items + items
@cached_property
def header_buttons(self):
edit_url = self.get_edit_url(self.object)
buttons = []
if edit_url:
buttons.append(
HeaderButton(
label=_("Edit"),
url=edit_url,
icon_name="edit",
)
)
return buttons
def get_queryset(self):
return ReferenceIndex.get_references_to(self.object).group_by_source_object()
@cached_property
def columns(self):
return [
TitleColumn(
"name",
label=_("Name"),
accessor="label",
get_url=lambda r: r["edit_url"],
),
tables.Column(
"content_type",
label=_("Type"),
# Use the content type from the ReferenceIndex object instead of the
# object itself, so we can get the specific content type without
# having to fetch the specific object from the database.
accessor=lambda r: capfirst(r["references"][0].model_name),
),
tables.ReferencesColumn(
"field",
label=_("If you confirm deletion")
if self.describe_on_delete
else _("Field"),
accessor="references",
get_url=lambda r: r["edit_url"],
describe_on_delete=self.describe_on_delete,
),
]
def get_table(self, object_list, **kwargs):
url_finder = AdminURLFinder(self.request.user)
results = []
for object, references in object_list:
row = {"object": object, "references": references}
row["edit_url"] = url_finder.get_edit_url(object)
if row["edit_url"] is None:
row["label"] = _("(Private %(object)s)") % {
"object": object._meta.verbose_name
}
row["edit_link_title"] = None
else:
row["label"] = str(object)
row["edit_link_title"] = _("Edit this %(object)s") % {
"object": object._meta.verbose_name
}
results.append(row)
return super().get_table(results, **kwargs)
def get_context_data(self, *args, object_list=None, **kwargs):
return super().get_context_data(
*args, object_list=object_list, object=self.object, **kwargs
)