Use breadcrumbs and header buttons for workflow history detail

pull/12314/head
Sage Abdullah 2024-08-27 17:17:58 +01:00 zatwierdzone przez Matt Westcott
rodzic 05230388d8
commit d79a2e7012
7 zmienionych plików z 143 dodań i 26 usunięć

Wyświetl plik

@ -2,13 +2,7 @@
{% load i18n wagtailadmin_tags %}
{% block main_content %}
<h2>{% icon object_icon classname="initial" %} {% latest_str object %}</h2>
<p>
<a href="{% admin_edit_url object %}" class="button button-small button-secondary">{% trans "Edit / Review" %}</a>
<a href="{% url workflow_history_url_name object.pk|admin_urlquote %}" class="button button-small button-secondary">{% trans "Workflow history" %}</a>
</p>
<h2>{% icon "clipboard-list" classname="initial" %} {{ workflow_state.workflow.name }}</h2>
<h2 class="w-mt-8">{% icon "clipboard-list" classname="initial" %} {{ workflow_state.workflow.name }}</h2>
<p>
{% blocktrans trimmed with modified_by=workflow_state.requested_by|user_display_name %}Requested by <b>{{ modified_by }}</b>{% endblocktrans %}

Wyświetl plik

@ -20,6 +20,9 @@ class TestWorkflowHistoryDetail(AdminTemplateTestUtils, WagtailTestUtils, TestCa
).specific
self.christmas_event.save_revision()
self.site_root = Page.objects.specific().get(id=2)
self.events_page = self.christmas_event.get_parent().specific
workflow = self.christmas_event.get_workflow()
self.workflow_state = workflow.start(self.christmas_event, self.user)
@ -42,21 +45,18 @@ class TestWorkflowHistoryDetail(AdminTemplateTestUtils, WagtailTestUtils, TestCa
),
)
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=(self.site_root.id,)),
"label": self.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.events_page.id,)),
"label": self.events_page.get_admin_display_title(),
},
{
"url": reverse("wagtailadmin_explore", args=(self.christmas_event.id,)),
@ -111,6 +111,38 @@ class TestWorkflowHistoryDetail(AdminTemplateTestUtils, WagtailTestUtils, TestCa
self.assertContains(response, '<div class="tab-content">')
items = [
{
"url": reverse("wagtailadmin_explore_root"),
"label": "Root",
},
{
"url": reverse("wagtailadmin_explore", args=(self.site_root.id,)),
"label": self.site_root.get_admin_display_title(),
},
{
"url": reverse("wagtailadmin_explore", args=(self.events_page.id,)),
"label": self.events_page.get_admin_display_title(),
},
{
"url": reverse("wagtailadmin_explore", args=(self.christmas_event.id,)),
"label": self.christmas_event.get_admin_display_title(),
},
{
"url": reverse(
"wagtailadmin_pages:workflow_history",
args=(self.christmas_event.id,),
),
"label": "Workflow history",
},
{
"url": "",
"label": "Workflow progress",
"sublabel": self.christmas_event.get_admin_display_title(),
},
]
self.assertBreadcrumbsItemsRendered(items, response.content)
def test_get_detail_with_bad_permissions(self):
# Remove privileges from user
self.user.is_superuser = False

Wyświetl plik

@ -406,11 +406,79 @@ class WorkflowHistoryDetailView(
BaseObjectMixin, WagtailAdminTemplateMixin, TemplateView
):
template_name = "wagtailadmin/shared/workflow_history/detail.html"
index_url_name = None
edit_url_name = None
workflow_state_url_kwarg = "workflow_state_id"
workflow_history_url_name = None
page_title = gettext_lazy("Workflow progress")
header_icon = "list-ul"
object_icon = "doc-empty-inverse"
_show_breadcrumbs = True
@cached_property
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 workflow_history_url(self):
if self.workflow_history_url_name:
return reverse(
self.workflow_history_url_name, args=(quote(self.object.pk),)
)
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(),
}
)
if self.workflow_history_url:
items.append(
{
"url": self.workflow_history_url,
"label": gettext("Workflow history"),
}
)
items.append(
{
"url": "",
"label": self.get_page_title(),
"sublabel": self.get_page_subtitle(),
}
)
return self.breadcrumbs_items + items
def get_page_subtitle(self):
return get_latest_str(self.object)
@cached_property
def header_buttons(self):
buttons = []
if self.edit_url:
buttons.append(
HeaderButton(
gettext("Edit / Review"),
url=self.edit_url,
icon_name="edit",
)
)
return buttons
@cached_property
def workflow_state(self):
@ -526,7 +594,6 @@ class WorkflowHistoryDetailView(
context.update(
{
"object": self.object,
"object_icon": self.object_icon,
"workflow_state": self.workflow_state,
"tasks": self.tasks,
"task_states_by_revision": self.task_states_by_revision,

Wyświetl plik

@ -55,10 +55,13 @@ class WorkflowHistoryView(
class WorkflowHistoryDetailView(
PageWorkflowHistoryViewMixin, history.WorkflowHistoryDetailView
PageWorkflowHistoryViewMixin,
GenericPageBreadcrumbsMixin,
history.WorkflowHistoryDetailView,
):
object_icon = "doc-empty-inverse"
header_icon = "doc-empty-inverse"
workflow_history_url_name = "wagtailadmin_pages:workflow_history"
breadcrumbs_items_to_take = 2
class PageHistoryView(GenericPageBreadcrumbsMixin, history.HistoryView):

Wyświetl plik

@ -137,11 +137,9 @@ class TestCustomIcon(BaseSnippetViewSetTests):
)
)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "wagtailadmin/shared/header.html")
# The icon is not displayed in the header,
# but it is displayed in the main content
self.assertEqual(response.context["header_icon"], "list-ul")
self.assertContains(response, "icon icon-list-ul")
self.assertTemplateNotUsed(response, "wagtailadmin/shared/header.html")
self.assertEqual(response.context["header_icon"], "cog")
self.assertContains(response, "icon icon-clipboard-list")
self.assertContains(response, "icon icon-cog")

Wyświetl plik

@ -7,6 +7,7 @@ from django.urls import reverse
from wagtail.models import Workflow, WorkflowContentType, WorkflowState
from wagtail.test.testapp.models import FullFeaturedSnippet, ModeratedModel
from wagtail.test.utils import WagtailTestUtils
from wagtail.test.utils.template_tests import AdminTemplateTestUtils
# This module serves to gather snippets-equivalent of workflows-related tests
# that are found throughout page-specific test modules, e.g. test_create_page.py,
@ -153,7 +154,11 @@ class TestEditViewNotLockable(TestEditView):
model = ModeratedModel
class TestWorkflowHistory(BaseWorkflowsTestCase):
class TestWorkflowHistory(AdminTemplateTestUtils, BaseWorkflowsTestCase):
base_breadcrumb_items = AdminTemplateTestUtils.base_breadcrumb_items + [
{"label": "Snippets", "url": "/admin/snippets/"},
]
def setUp(self):
super().setUp()
self.object.text = "Edited!"
@ -221,6 +226,27 @@ class TestWorkflowHistory(BaseWorkflowsTestCase):
self.assertContains(response, "In progress")
self.assertContains(response, "test@email.com")
items = [
{
"url": self.get_url("list", args=()),
"label": "Full-featured snippets",
},
{
"url": self.get_url("edit"),
"label": str(self.object),
},
{
"url": self.get_url("workflow_history"),
"label": "Workflow history",
},
{
"url": "",
"label": "Workflow progress",
"sublabel": str(self.object),
},
]
self.assertBreadcrumbsItemsRendered(items, response.content)
def test_get_detail_completed(self):
self.workflow_state.current_task_state.approve(user=None)
response = self.client.get(

Wyświetl plik

@ -774,10 +774,7 @@ class SnippetViewSet(ModelViewSet):
"workflow_history/detail",
fallback=self.workflow_history_detail_view_class.template_name,
),
object_icon=self.icon,
header_icon="list-ul",
workflow_history_url_name=self.get_url_name("workflow_history"),
_show_breadcrumbs=False,
)
@property