kopia lustrzana https://github.com/wagtail/wagtail
convert page listing view to a ListView
rodzic
18038c3ebe
commit
ce0e745c7d
|
@ -16,7 +16,7 @@
|
|||
|
||||
{% if do_paginate %}
|
||||
{% url 'wagtailadmin_explore' parent_page.id as pagination_base_url %}
|
||||
{% paginate pages base_url=pagination_base_url %}
|
||||
{% paginate page_obj base_url=pagination_base_url %}
|
||||
{% endif %}
|
||||
{% trans "Select all pages in listing" as select_all_text %}
|
||||
{% include 'wagtailadmin/bulk_actions/footer.html' with select_all_obj_text=select_all_text app_label='wagtailcore' model_name='page' objects=pages %}
|
||||
|
|
|
@ -63,11 +63,7 @@ class TestPageExplorer(WagtailTestUtils, TestCase):
|
|||
self.assertEqual(response.status_code, 200)
|
||||
self.assertTemplateUsed(response, "wagtailadmin/pages/index.html")
|
||||
self.assertEqual(Page.objects.get(id=1), response.context["parent_page"])
|
||||
self.assertTrue(
|
||||
response.context["pages"]
|
||||
.paginator.object_list.filter(id=self.root_page.id)
|
||||
.exists()
|
||||
)
|
||||
self.assertIn(self.root_page, response.context["pages"])
|
||||
|
||||
def test_explore_root_shows_icon(self):
|
||||
response = self.client.get(reverse("wagtailadmin_explore_root"))
|
||||
|
@ -217,7 +213,7 @@ class TestPageExplorer(WagtailTestUtils, TestCase):
|
|||
self.assertTemplateUsed(response, "wagtailadmin/pages/index.html")
|
||||
|
||||
# Check that we got the correct page
|
||||
self.assertEqual(response.context["pages"].number, 2)
|
||||
self.assertEqual(response.context["page_obj"].number, 2)
|
||||
|
||||
def test_pagination_invalid(self):
|
||||
self.make_pages()
|
||||
|
|
|
@ -525,11 +525,7 @@ class TestAdminURLAppendSlash(WagtailTestUtils, TestCase):
|
|||
self.assertEqual(response.status_code, 200)
|
||||
self.assertTemplateUsed(response, "wagtailadmin/pages/index.html")
|
||||
self.assertEqual(Page.objects.get(id=1), response.context["parent_page"])
|
||||
self.assertTrue(
|
||||
response.context["pages"]
|
||||
.paginator.object_list.filter(id=self.root_page.id)
|
||||
.exists()
|
||||
)
|
||||
self.assertIn(self.root_page, response.context["pages"])
|
||||
|
||||
|
||||
class TestRemoveStaleContentTypes(TestCase):
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
from django.conf import settings
|
||||
from django.core.paginator import InvalidPage, Paginator
|
||||
from django.db.models import Count
|
||||
from django.http import Http404
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.urls import reverse
|
||||
from django.views.generic import TemplateView
|
||||
from django.views.generic import ListView
|
||||
|
||||
from wagtail import hooks
|
||||
from wagtail.admin.ui.side_panels import PageSidePanels
|
||||
|
@ -12,7 +10,7 @@ from wagtail.admin.views.generic.permissions import PermissionCheckedMixin
|
|||
from wagtail.permission_policies.pages import Page, PagePermissionPolicy
|
||||
|
||||
|
||||
class IndexView(PermissionCheckedMixin, TemplateView):
|
||||
class IndexView(PermissionCheckedMixin, ListView):
|
||||
template_name = "wagtailadmin/pages/index.html"
|
||||
permission_policy = PagePermissionPolicy()
|
||||
any_permission_required = {
|
||||
|
@ -23,6 +21,9 @@ class IndexView(PermissionCheckedMixin, TemplateView):
|
|||
"lock",
|
||||
"unlock",
|
||||
}
|
||||
context_object_name = "pages"
|
||||
page_kwarg = "p"
|
||||
paginate_by = 50
|
||||
|
||||
def get(self, request, parent_page_id=None):
|
||||
if parent_page_id:
|
||||
|
@ -45,12 +46,7 @@ class IndexView(PermissionCheckedMixin, TemplateView):
|
|||
|
||||
return super().get(request)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
pages = self.parent_page.get_children().prefetch_related(
|
||||
"content_type", "sites_rooted_here"
|
||||
) & self.permission_policy.explorable_instances(self.request.user)
|
||||
|
||||
# Get page ordering
|
||||
def get_ordering(self):
|
||||
ordering = self.request.GET.get("ordering", "-latest_revision_created_at")
|
||||
if ordering not in [
|
||||
"title",
|
||||
|
@ -65,10 +61,19 @@ class IndexView(PermissionCheckedMixin, TemplateView):
|
|||
]:
|
||||
ordering = "-latest_revision_created_at"
|
||||
|
||||
if ordering == "ord":
|
||||
return ordering
|
||||
|
||||
def get_queryset(self):
|
||||
pages = self.parent_page.get_children().prefetch_related(
|
||||
"content_type", "sites_rooted_here"
|
||||
) & self.permission_policy.explorable_instances(self.request.user)
|
||||
|
||||
self.ordering = self.get_ordering()
|
||||
|
||||
if self.ordering == "ord":
|
||||
# preserve the native ordering from get_children()
|
||||
pass
|
||||
elif ordering == "latest_revision_created_at":
|
||||
elif self.ordering == "latest_revision_created_at":
|
||||
# order by oldest revision first.
|
||||
# Special case NULL entries - these should go at the top of the list.
|
||||
# Do this by annotating with Count('latest_revision_created_at'),
|
||||
|
@ -76,18 +81,14 @@ class IndexView(PermissionCheckedMixin, TemplateView):
|
|||
pages = pages.annotate(
|
||||
null_position=Count("latest_revision_created_at")
|
||||
).order_by("null_position", "latest_revision_created_at")
|
||||
elif ordering == "-latest_revision_created_at":
|
||||
elif self.ordering == "-latest_revision_created_at":
|
||||
# order by oldest revision first.
|
||||
# Special case NULL entries - these should go at the end of the list.
|
||||
pages = pages.annotate(
|
||||
null_position=Count("latest_revision_created_at")
|
||||
).order_by("-null_position", "-latest_revision_created_at")
|
||||
else:
|
||||
pages = pages.order_by(ordering)
|
||||
|
||||
# Don't paginate if sorting by page order - all pages must be shown to
|
||||
# allow drag-and-drop reordering
|
||||
do_paginate = ordering != "ord"
|
||||
pages = pages.order_by(self.ordering)
|
||||
|
||||
# We want specific page instances, but do not need streamfield values here
|
||||
pages = pages.defer_streamfields().specific()
|
||||
|
@ -102,15 +103,23 @@ class IndexView(PermissionCheckedMixin, TemplateView):
|
|||
|
||||
pages = pages.annotate_site_root_state().annotate_approved_schedule()
|
||||
|
||||
# Pagination
|
||||
if do_paginate:
|
||||
paginator = Paginator(pages, per_page=50)
|
||||
try:
|
||||
pages = paginator.page(self.request.GET.get("p", 1))
|
||||
except InvalidPage:
|
||||
raise Http404
|
||||
return pages
|
||||
|
||||
show_ordering_column = self.request.GET.get("ordering") == "ord"
|
||||
def get_paginate_by(self, queryset):
|
||||
if self.ordering == "ord":
|
||||
# Don't paginate if sorting by page order - all pages must be shown to
|
||||
# allow drag-and-drop reordering
|
||||
return None
|
||||
else:
|
||||
return self.paginate_by
|
||||
|
||||
def paginate_queryset(self, queryset, page_size):
|
||||
return super().paginate_queryset(queryset, page_size)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
show_ordering_column = self.ordering == "ord"
|
||||
|
||||
side_panels = PageSidePanels(
|
||||
self.request,
|
||||
|
@ -123,18 +132,19 @@ class IndexView(PermissionCheckedMixin, TemplateView):
|
|||
comments_enabled=False,
|
||||
)
|
||||
|
||||
context = {
|
||||
"parent_page": self.parent_page,
|
||||
"ordering": ordering,
|
||||
"side_panels": side_panels,
|
||||
"pages": pages,
|
||||
"do_paginate": do_paginate,
|
||||
"locale": None,
|
||||
"translations": [],
|
||||
"show_ordering_column": show_ordering_column,
|
||||
"show_bulk_actions": not show_ordering_column,
|
||||
"show_locale_labels": False,
|
||||
}
|
||||
context.update(
|
||||
{
|
||||
"parent_page": self.parent_page,
|
||||
"ordering": self.ordering,
|
||||
"side_panels": side_panels,
|
||||
"do_paginate": context["is_paginated"],
|
||||
"locale": None,
|
||||
"translations": [],
|
||||
"show_ordering_column": show_ordering_column,
|
||||
"show_bulk_actions": not show_ordering_column,
|
||||
"show_locale_labels": False,
|
||||
}
|
||||
)
|
||||
|
||||
if getattr(settings, "WAGTAIL_I18N_ENABLED", False):
|
||||
if not self.parent_page.is_root():
|
||||
|
|
Ładowanie…
Reference in New Issue