diff --git a/wagtail/admin/templates/wagtailadmin/shared/workflow_history/index.html b/wagtail/admin/templates/wagtailadmin/shared/workflow_history/index.html deleted file mode 100644 index faf9524af8..0000000000 --- a/wagtail/admin/templates/wagtailadmin/shared/workflow_history/index.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "wagtailadmin/base.html" %} -{% load i18n wagtailadmin_tags %} - -{% block titletag %}{% latest_str object as object_str %}{% blocktrans trimmed with title=object_str %}Workflow history for {{ title }}{% endblocktrans %}{% endblock %} - -{% block content %} - {% latest_str object as object_str %} - {% include "wagtailadmin/shared/header.html" with title=_("Workflow history for") subtitle=object_str icon=header_icon %} - -
- {% trans 'Status' %} - | -- {% trans 'Tasks' %} - | -- {% trans 'Requested by' %} - | -- {% trans 'Started at' %} - | -
---|
+ {% trans 'Status' %} + | ++ {% trans 'Tasks' %} + | ++ {% trans 'Requested by' %} + | ++ {% trans 'Started at' %} + | +
---|---|---|---|
@@ -46,20 +46,18 @@ | {% human_readable_date workflow_state.created_at %} |
+ {% if page %} + {% trans "This page hasn't been submitted for moderation yet" %} {% else %} - {% block no_results %} -
- {% if page %} - {% blocktrans trimmed %}This page hasn't been submitted for moderation yet{% endblocktrans %} - {% else %} - {% blocktrans trimmed with model_name=model_opts.verbose_name %} - This {{ model_name }} hasn't been submitted for moderation yet - {% endblocktrans %} - {% endif %} -
-{% endif %} diff --git a/wagtail/admin/tests/pages/test_workflow_history.py b/wagtail/admin/tests/pages/test_workflow_history.py index 632e207375..7e6e7771bc 100644 --- a/wagtail/admin/tests/pages/test_workflow_history.py +++ b/wagtail/admin/tests/pages/test_workflow_history.py @@ -4,10 +4,12 @@ from django.urls import reverse from wagtail.models import Page from wagtail.test.utils import WagtailTestUtils +from wagtail.test.utils.template_tests import AdminTemplateTestUtils -class TestWorkflowHistoryDetail(WagtailTestUtils, TestCase): +class TestWorkflowHistoryDetail(AdminTemplateTestUtils, WagtailTestUtils, TestCase): fixtures = ["test.json"] + base_breadcrumb_items = [] def setUp(self): self.user = self.create_test_user() @@ -40,6 +42,34 @@ class TestWorkflowHistoryDetail(WagtailTestUtils, TestCase): ), ) + site_root = Page.objects.get(id=2) + events_page = self.christmas_event.get_parent() + + items = [ + { + "url": reverse("wagtailadmin_explore_root"), + "label": "Root", + }, + { + "url": reverse("wagtailadmin_explore", args=(site_root.id,)), + "label": site_root.get_admin_display_title(), + }, + { + "url": reverse("wagtailadmin_explore", args=(events_page.id,)), + "label": events_page.get_admin_display_title(), + }, + { + "url": reverse("wagtailadmin_explore", args=(self.christmas_event.id,)), + "label": self.christmas_event.get_admin_display_title(), + }, + { + "url": "", + "label": "Workflow history", + "sublabel": self.christmas_event.get_admin_display_title(), + }, + ] + self.assertBreadcrumbsItemsRendered(items, response.content) + def test_get_index_with_bad_permissions(self): # Remove privileges from user self.user.is_superuser = False diff --git a/wagtail/admin/views/generic/history.py b/wagtail/admin/views/generic/history.py index 808ebb7807..56074514a6 100644 --- a/wagtail/admin/views/generic/history.py +++ b/wagtail/admin/views/generic/history.py @@ -2,7 +2,6 @@ from datetime import timedelta import django_filters from django.contrib.admin.utils import quote -from django.core.paginator import Paginator from django.forms import CheckboxSelectMultiple from django.shortcuts import get_object_or_404 from django.urls import reverse @@ -325,27 +324,77 @@ class HistoryView(PermissionCheckedMixin, BaseObjectMixin, BaseListingView): return kwargs -class WorkflowHistoryView(BaseObjectMixin, WagtailAdminTemplateMixin, TemplateView): - template_name = "wagtailadmin/shared/workflow_history/index.html" - page_kwarg = "p" - workflow_history_url_name = None +class WorkflowHistoryView(BaseObjectMixin, BaseListingView): + template_name = "wagtailadmin/shared/workflow_history/listing.html" + results_template_name = "wagtailadmin/shared/workflow_history/listing_results.html" + paginate_by = 20 + index_url_name = None + edit_url_name = None workflow_history_detail_url_name = None + page_title = gettext_lazy("Workflow history") + context_object_name = "workflow_states" @cached_property - def workflow_states(self): - return WorkflowState.objects.for_instance(self.object).order_by("-created_at") + def index_url(self): + if self.index_url_name: + return reverse(self.index_url_name) + + @cached_property + def edit_url(self): + if self.edit_url_name: + return reverse(self.edit_url_name, args=(quote(self.object.pk),)) + + @cached_property + def header_buttons(self): + buttons = [] + if self.edit_url: + buttons.append( + HeaderButton(gettext("Edit"), url=self.edit_url, icon_name="edit") + ) + return buttons + + def get_page_subtitle(self): + return get_latest_str(self.object) + + def get_breadcrumbs_items(self): + items = [] + if self.index_url: + items.append( + { + "url": self.index_url, + "label": capfirst(self.model._meta.verbose_name_plural), + } + ) + + if self.edit_url: + items.append( + { + "url": self.edit_url, + "label": self.get_page_subtitle(), + } + ) + items.append( + { + "url": "", + "label": self.get_page_title(), + "sublabel": self.get_page_subtitle(), + } + ) + + return self.breadcrumbs_items + items + + def get_base_queryset(self): + return ( + WorkflowState.objects.for_instance(self.object) + .select_related("workflow", "requested_by") + .order_by("-created_at") + ) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - - paginator = Paginator(self.workflow_states, per_page=20) - workflow_states = paginator.get_page(self.request.GET.get(self.page_kwarg)) - context.update( { "object": self.object, - "workflow_states": workflow_states, - "workflow_history_url_name": self.workflow_history_url_name, "workflow_history_detail_url_name": self.workflow_history_detail_url_name, "model_opts": self.object._meta, } diff --git a/wagtail/admin/views/pages/history.py b/wagtail/admin/views/pages/history.py index b9381db412..31ad0c8229 100644 --- a/wagtail/admin/views/pages/history.py +++ b/wagtail/admin/views/pages/history.py @@ -34,6 +34,7 @@ class PageHistoryFilterSet(history.HistoryFilterSet): class PageWorkflowHistoryViewMixin: model = Page pk_url_kwarg = "page_id" + edit_url_name = "wagtailadmin_pages:edit" def dispatch(self, request, *args, **kwargs): if not self.object.permissions_for_user(request.user).can_edit(): @@ -44,9 +45,12 @@ class PageWorkflowHistoryViewMixin: return super().get_context_data(**kwargs, page=self.object) -class WorkflowHistoryView(PageWorkflowHistoryViewMixin, history.WorkflowHistoryView): +class WorkflowHistoryView( + PageWorkflowHistoryViewMixin, + GenericPageBreadcrumbsMixin, + history.WorkflowHistoryView, +): header_icon = "doc-empty-inverse" - workflow_history_url_name = "wagtailadmin_pages:workflow_history" workflow_history_detail_url_name = "wagtailadmin_pages:workflow_history_detail" diff --git a/wagtail/snippets/tests/test_viewset.py b/wagtail/snippets/tests/test_viewset.py index 76800e04d9..c8c3355153 100644 --- a/wagtail/snippets/tests/test_viewset.py +++ b/wagtail/snippets/tests/test_viewset.py @@ -90,7 +90,7 @@ class TestCustomIcon(BaseSnippetViewSetTests): ("delete", [pk], "header.html"), ("usage", [pk], "headers/slim_header.html"), ("unpublish", [pk], "header.html"), - ("workflow_history", [pk], "header.html"), + ("workflow_history", [pk], "headers/slim_header.html"), ("revisions_revert", [pk, self.revision_1.id], "headers/slim_header.html"), ( "revisions_compare", @@ -1557,6 +1557,23 @@ class TestBreadcrumbs(AdminTemplateTestUtils, BaseSnippetViewSetTests): ] self.assertBreadcrumbsItemsRendered(items, response.content) + def test_workflow_history_view(self): + response = self.client.get( + self.get_url("workflow_history", args=(self.object.pk,)) + ) + items = [ + { + "url": self.get_url("list"), + "label": "Full-featured snippets", + }, + { + "url": self.get_url("edit", args=(self.object.pk,)), + "label": str(self.object), + }, + {"url": "", "label": "Workflow history", "sublabel": str(self.object)}, + ] + self.assertBreadcrumbsItemsRendered(items, response.content) + class TestCustomMethods(BaseSnippetViewSetTests): model = FullFeaturedSnippet diff --git a/wagtail/snippets/tests/test_workflows.py b/wagtail/snippets/tests/test_workflows.py index 2e633b8747..e8f941d590 100644 --- a/wagtail/snippets/tests/test_workflows.py +++ b/wagtail/snippets/tests/test_workflows.py @@ -164,7 +164,7 @@ class TestWorkflowHistory(BaseWorkflowsTestCase): response = self.client.get(self.get_url("workflow_history")) self.assertEqual(response.status_code, 200) self.assertTemplateUsed( - response, "wagtailadmin/shared/workflow_history/index.html" + response, "wagtailadmin/shared/workflow_history/listing.html" ) self.assertContains(response, self.get_url("edit")) diff --git a/wagtail/snippets/views/snippets.py b/wagtail/snippets/views/snippets.py index 9e21eaab53..c17c27f907 100644 --- a/wagtail/snippets/views/snippets.py +++ b/wagtail/snippets/views/snippets.py @@ -761,11 +761,9 @@ class SnippetViewSet(ModelViewSet): "workflow_history/index", fallback=self.workflow_history_view_class.template_name, ), - workflow_history_url_name=self.get_url_name("workflow_history"), workflow_history_detail_url_name=self.get_url_name( "workflow_history_detail" ), - _show_breadcrumbs=False, ) @property