Implemented WorkflowState.all_tasks_with_status

pull/6257/head
Karl Hobley 2020-02-13 11:27:57 +00:00 zatwierdzone przez Matt Westcott
rodzic b2a6274a79
commit d7b2e06ece
4 zmienionych plików z 37 dodań i 28 usunięć

Wyświetl plik

@ -17,12 +17,12 @@
{% blocktrans with title=page.get_admin_display_title page_type=content_type.model_class.get_verbose_name %}Editing {{ page_type }} <span>{{ title }}</span>{% endblocktrans %}
</h1>
</div>
{% if task_statuses %}
{% if workflow_tasks %}
<div class="center col3">
{% include "wagtailadmin/shared/workflow_status.html" with page=page_for_status %}
</div>
{% endif %}
<div class="right col{% if task_statuses %}3{% else %}6{% endif %}">
<div class="right col{% if workflow_tasks %}3{% else %}6{% endif %}">
{% trans "Status" %}
{% include "wagtailadmin/shared/page_status_tag.html" with page=page_for_status %}

Wyświetl plik

@ -1,16 +1,16 @@
{% load wagtailui_tags i18n %}
{% if task_statuses %}
{% if workflow_tasks %}
<h2>{{ workflow_name }}</h2>
{% if current_task_number %}
{% blocktrans %} Task {{ current_task_number }} of {{ total_tasks }}{% endblocktrans %}: {{ task_name }}
{% blocktrans %} Task {{ current_task_number }} of {{ workflow_tasks.count }}{% endblocktrans %}: {{ task_name }}
{% else %}
{% trans 'Task' %}: {{ task_name }}
{% endif %}
<div>
{% trans 'Approved task' as approved_title %}
{% trans 'Incomplete task' as incomplete_title %}
{% for status in task_statuses %}
{% if status == 'approved' %}
{% for task in workflow_tasks %}
{% if task.status == 'approved' %}
{% wagtail_icon name="success" title=approved_title %}
{% else %}
{% wagtail_icon name="radio-empty" title=incomplete_title %}

Wyświetl plik

@ -411,37 +411,26 @@ def edit(request, page_id):
messages.warning(request, _("This page is currently awaiting moderation"), buttons=buttons)
task_statuses = []
workflow_tasks = []
workflow_state = page.current_workflow_state
workflow_name = ''
task_name = ''
total_tasks = 0
current_task_number = None
if workflow_state:
workflow = workflow_state.workflow
task = workflow_state.current_task_state.task
workflow_tasks = WorkflowTask.objects.filter(workflow=workflow)
try:
current_task_number = workflow_tasks.get(task=task).sort_order + 1
current_task_number = WorkflowTask.objects.get(workflow=workflow, task=task).sort_order + 1
except WorkflowTask.DoesNotExist:
# The Task has been removed from the Workflow
pass
task_name = task.name
workflow_name = workflow.name
states = TaskState.objects.filter(workflow_state=workflow_state, page_revision=page.get_latest_revision()).values('task', 'status')
total_tasks = len(workflow_tasks) # len used as queryset is to be iterated over
# create a list of task statuses to be passed into the template to show workflow progress
for workflow_task in workflow_tasks:
try:
status = states.get(task=workflow_task.task)['status']
except TaskState.DoesNotExist:
status = 'not_started'
task_statuses.append(status)
workflow_tasks = workflow_state.all_tasks_with_status()
# add a warning message if tasks have been approved and may need to be re-approved
approved_task = True if 'approved' in task_statuses else False
task_has_been_approved = workflow_tasks.filter(status='approved').exists()
# TODO: add icon to message when we have added a workflows icon
if request.method == 'GET':
@ -452,15 +441,17 @@ def edit(request, page_id):
reverse('wagtailadmin_pages:revisions_compare', args=(page.id, 'live', latest_revision.id)),
_('Compare with live version')
))
# Check for revisions still undergoing moderation and warn
if total_tasks == 1:
# Check for revisions still undergoing moderation and warn
if workflow_tasks.count() == 1:
# If only one task in workflow, show simple message
workflow_info = _("This page is currently awaiting moderation")
elif current_task_number:
workflow_info = format_html(_("<b>Page '{}'</b> is on <b>Task {} of {}: '{}'</b> in <b>Workflow '{}'</b>. "), page.get_admin_display_title(), current_task_number, total_tasks, task_name, workflow_name)
workflow_info = format_html(_("<b>Page '{}'</b> is on <b>Task {} of {}: '{}'</b> in <b>Workflow '{}'</b>. "), page.get_admin_display_title(), current_task_number, workflow_tasks.count(), task_name, workflow_name)
else:
workflow_info = format_html(_("<b>Page '{}'</b> is on <b>Task '{}'</b> in <b>Workflow '{}'</b>. "), page.get_admin_display_title(), current_task_number, total_tasks, task_name, workflow_name)
if approved_task and getattr(settings, 'WAGTAIL_WORKFLOW_REQUIRE_REAPPROVAL_ON_EDIT', True):
workflow_info = format_html(_("<b>Page '{}'</b> is on <b>Task '{}'</b> in <b>Workflow '{}'</b>. "), page.get_admin_display_title(), current_task_number, workflow_tasks.count(), task_name, workflow_name)
if task_has_been_approved and getattr(settings, 'WAGTAIL_WORKFLOW_REQUIRE_REAPPROVAL_ON_EDIT', True):
messages.warning(request, mark_safe(workflow_info + _("Editing this Page will cause completed Tasks to need re-approval.")), buttons=buttons, extra_tags="workflow")
else:
messages.success(request, workflow_info, buttons=buttons, extra_tags="workflow")
@ -679,11 +670,10 @@ def edit(request, page_id):
'page_locked': page_perms.page_locked(),
'workflow_actions': page.current_workflow_task.get_actions(page, request.user) if page.current_workflow_task else [],
'current_task_state': page.current_workflow_task_state,
'task_statuses': task_statuses,
'workflow_tasks': workflow_tasks,
'current_task_number': current_task_number,
'task_name': task_name,
'workflow_name': workflow_name,
'total_tasks': total_tasks
})

Wyświetl plik

@ -14,6 +14,7 @@ from django.core.handlers.base import BaseHandler
from django.core.handlers.wsgi import WSGIRequest
from django.db import models, transaction
from django.db.models import Case, Q, Value, When
from django.db.models.expressions import OuterRef, Subquery
from django.db.models.functions import Concat, Lower, Substr
from django.http import Http404
from django.http.request import split_domain_port
@ -2843,6 +2844,24 @@ class WorkflowState(models.Model):
for state in approved_states:
state.copy(update_attrs={'page_revision': revision})
def all_tasks_with_status(self):
"""
Returns a queryset of Task objects that are linked with this workflow state's
workflow. The status of that task in this workflow state is annotated in the
`.status` field.
This is different to querying TaskState as it also returns tasks that haven't
been started yet (so won't have a TaskState).
"""
return self.workflow.tasks.annotate(
status=Subquery(
TaskState.objects.filter(
task_id=OuterRef('id'),
workflow_state_id=self.id,
).values('status')
)
)
class Meta:
verbose_name = _('Workflow state')
verbose_name_plural = _('Workflow states')