Improve document detection by workflow state including initial state.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2017-07-07 13:00:22 -04:00
parent 998af4931f
commit e4c88e575f
8 changed files with 97 additions and 57 deletions

View File

@@ -2,7 +2,6 @@ from __future__ import absolute_import, unicode_literals
from django.contrib import messages
from django.core.urlresolvers import reverse, reverse_lazy
from django.db.models import F, Max
from django.db.utils import IntegrityError
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
@@ -21,8 +20,8 @@ from .forms import (
WorkflowTransitionForm
)
from .models import (
Workflow, WorkflowInstance, WorkflowInstanceLogEntry, WorkflowState,
WorkflowTransition, WorkflowRuntimeProxy, WorkflowStateRuntimeProxy
Workflow, WorkflowInstance, WorkflowState, WorkflowTransition,
WorkflowRuntimeProxy, WorkflowStateRuntimeProxy
)
from .permissions import (
permission_workflow_create, permission_workflow_delete,
@@ -97,6 +96,11 @@ class WorkflowInstanceTransitionView(FormView):
comment=form.cleaned_data['comment'],
transition=form.cleaned_data['transition'], user=self.request.user
)
messages.success(
self.request, _(
'Document "%s" transitioned successfully'
) % self.get_workflow_instance().document
)
return HttpResponseRedirect(self.get_success_url())
def get_extra_context(self):
@@ -405,7 +409,7 @@ class WorkflowListView(SingleObjectListView):
def get_extra_context(self):
return {
'hide_link': True,
'hide_object': True,
'title': _('Workflows')
}
@@ -437,51 +441,36 @@ class WorkflowDocumentListView(DocumentListView):
class WorkflowStateDocumentListView(DocumentListView):
def dispatch(self, request, *args, **kwargs):
self.workflow_state = get_object_or_404(
def get_document_queryset(self):
return self.get_workflow_state().get_documents()
def get_extra_context(self):
workflow_state = self.get_workflow_state()
return {
'hide_links': True,
'object': workflow_state,
'navigation_object_list': ('object', 'workflow'),
'workflow': WorkflowRuntimeProxy.objects.get(
pk=workflow_state.workflow.pk
),
'title': _(
'Documents in the workflow "%s", state "%s"'
) % (
workflow_state.workflow, workflow_state
)
}
def get_workflow_state(self):
workflow_state = get_object_or_404(
WorkflowStateRuntimeProxy, pk=self.kwargs['pk']
)
AccessControlList.objects.check_access(
permissions=permission_workflow_view, user=request.user,
obj=self.workflow_state.workflow
permissions=permission_workflow_view, user=self.request.user,
obj=workflow_state.workflow
)
return super(
WorkflowStateDocumentListView, self
).dispatch(request, *args, **kwargs)
def get_document_queryset(self):
latest_entries = WorkflowInstanceLogEntry.objects.annotate(
max_datetime=Max(
'workflow_instance__log_entries__datetime'
)
).filter(
datetime=F('max_datetime')
)
state_latest_entries = latest_entries.filter(
transition__destination_state=self.workflow_state
)
return Document.objects.filter(
workflows__pk__in=state_latest_entries.values_list(
'workflow_instance', flat=True
)
)
def get_extra_context(self):
return {
'hide_links': True,
'object': self.workflow_state,
'navigation_object_list': ('object', 'workflow'),
'workflow': WorkflowRuntimeProxy.objects.get(
pk=self.workflow_state.workflow.pk
),
'title': _(
'Documents in the workflow "%s", state "%s"'
) % (self.workflow_state.workflow, self.workflow_state)
}
return workflow_state
class WorkflowStateListView(SingleObjectListView):