diff --git a/wagtail/admin/templates/wagtailadmin/reports/workflow.html b/wagtail/admin/templates/wagtailadmin/reports/workflow.html new file mode 100644 index 0000000000..bc47a214b5 --- /dev/null +++ b/wagtail/admin/templates/wagtailadmin/reports/workflow.html @@ -0,0 +1,108 @@ +{% extends "wagtailadmin/base.html" %} +{% load i18n l10n wagtailadmin_tags wagtailui_tags %} + +{% block titletag %}{% trans "Workflows" %}{% endblock %} + +{% block content %} + +
+
+
+
+

{% trans "Workflows" %}

+
+
+ +
+
+ +
+ {% if object_list %} + + + + + + + + + + + + + {% for workflow_state in object_list %} + + + + + + + + + {% endfor %} + +
+ {% trans 'Workflow' %} + + {% trans 'Page' %} + + {% trans 'Status' %} + + {% trans 'Tasks' %} + + {% trans 'Requested by' %} + + {% trans 'Started at' %} +
+ {{ workflow_state.workflow }} + + + {{ workflow_state.page.get_admin_display_title }} + + + + {{ workflow_state.get_status_display }} + + +

{{ workflow_name }}

+ {% trans 'Approved task' as approved_title %} + {% trans 'Incomplete task' as incomplete_title %} + {% for task in workflow_state.all_tasks_with_status %} + + {% if task.status == 'approved' %} + {% wagtail_icon name="success" title=approved_title %} + {% else %} + {% wagtail_icon name="radio-empty" title=incomplete_title %} + {% endif %} + + {% endfor %} +
{{ workflow_state.requested_by }}{{ workflow_state.created_at }}
+ {% else %} +

{% trans "No pages have been submitted for moderation yet" %}

+ {% endif %} +
+{% endblock %} + +{% block extra_js %} + {{ block.super }} + + {# load editor js to get tooltips #} + {% include "wagtailadmin/pages/_editor_js.html" %} + + +{% endblock %} diff --git a/wagtail/admin/templates/wagtailadmin/reports/workflow_tasks.html b/wagtail/admin/templates/wagtailadmin/reports/workflow_tasks.html new file mode 100644 index 0000000000..02c04ff6b5 --- /dev/null +++ b/wagtail/admin/templates/wagtailadmin/reports/workflow_tasks.html @@ -0,0 +1,74 @@ +{% extends "wagtailadmin/base.html" %} +{% load i18n l10n wagtailadmin_tags wagtailui_tags %} + +{% block titletag %}{% trans "Workflows" %}{% endblock %} + +{% block content %} + {% trans "Workflows" as title_str %} + +
+
+
+
+

Workflows

+
+
+
+ +
+
+
+ +
+ {% if object_list %} + + + + + + + + + + + + {% for task_state in object_list %} + + + + + + + + {% endfor %} + +
+ {% trans 'Task' %} + + {% trans 'Page' %} + + {% trans 'Status' %} + + {% trans 'Started at' %} + + {% trans 'Completed at' %} +
+ {{ task_state.task }} + + {% with task_state.workflow_state.page as page %} + + {{ page.get_admin_display_title }} + + {% endwith %} + +
+ {{ task_state.get_status_display }} +
+
{{ task_state.started_at }}{{ task_state.finished_at }}
+ {% else %} +

{% blocktrans %}No pages have been submitted for moderation yet{% endblocktrans %}

+ {% endif %} +
+{% endblock %} diff --git a/wagtail/admin/urls/reports.py b/wagtail/admin/urls/reports.py index 3f1ef1856d..13f6422446 100644 --- a/wagtail/admin/urls/reports.py +++ b/wagtail/admin/urls/reports.py @@ -4,5 +4,7 @@ from wagtail.admin.views import reports app_name = 'wagtailadmin_reports' urlpatterns = [ - path('locked/', reports.LockedPagesView.as_view(), name='locked_pages') + path('locked/', reports.LockedPagesView.as_view(), name='locked_pages'), + path('workflow/', reports.WorkflowView.as_view(), name='workflow'), + path('workflow/tasks/', reports.WorkflowTasksView.as_view(), name='workflow_tasks'), ] diff --git a/wagtail/admin/views/reports.py b/wagtail/admin/views/reports.py index 19823df713..8c3346759d 100644 --- a/wagtail/admin/views/reports.py +++ b/wagtail/admin/views/reports.py @@ -12,7 +12,7 @@ from xlsxwriter.workbook import Workbook from wagtail.admin.auth import permission_denied from wagtail.admin.filters import LockedPagesReportFilterSet -from wagtail.core.models import Page, UserPagePermissionsProxy +from wagtail.core.models import Page, TaskState, UserPagePermissionsProxy, WorkflowState class Echo: @@ -271,3 +271,23 @@ class LockedPagesView(PageReportView): if not UserPagePermissionsProxy(request.user).can_remove_locks(): return permission_denied(request) return super().dispatch(request, *args, **kwargs) + + +class WorkflowView(ReportView): + template_name = 'wagtailadmin/reports/workflow.html' + title = _('Workflow') + header_icon = 'placeholder' + + def get_queryset(self): + pages = UserPagePermissionsProxy(self.request.user).editable_pages() + return WorkflowState.objects.filter(page__in=pages) + + +class WorkflowTasksView(ReportView): + template_name = 'wagtailadmin/reports/workflow_tasks.html' + title = _('Workflow') + header_icon = 'placeholder' + + def get_queryset(self): + pages = UserPagePermissionsProxy(self.request.user).editable_pages() + return TaskState.objects.filter(workflow_state__page__in=pages) diff --git a/wagtail/admin/wagtail_hooks.py b/wagtail/admin/wagtail_hooks.py index 82ff10d285..d2af03fab5 100644 --- a/wagtail/admin/wagtail_hooks.py +++ b/wagtail/admin/wagtail_hooks.py @@ -648,11 +648,21 @@ class LockedPagesMenuItem(MenuItem): return UserPagePermissionsProxy(request.user).can_remove_locks() +class WorkflowReportMenuItem(MenuItem): + def is_shown(self, request): + return True + + @hooks.register('register_reports_menu_item') def register_locked_pages_menu_item(): return LockedPagesMenuItem(_('Locked Pages'), reverse('wagtailadmin_reports:locked_pages'), classnames='icon icon-locked', order=700) +@hooks.register('register_reports_menu_item') +def register_workflow_report_menu_item(): + return WorkflowReportMenuItem(_('Workflows'), reverse('wagtailadmin_reports:workflow'), classnames='icon icon-placeholder', order=800) + + @hooks.register('register_admin_menu_item') def register_reports_menu(): return ReportsMenuItem(