kopia lustrzana https://github.com/wagtail/wagtail
Use breadcrumbs and header buttons for workflow history detail
rodzic
05230388d8
commit
d79a2e7012
|
@ -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 %}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue