Proof of concept of the workflow instance context
Add support for workflow instance JSON context. Add support for two step workflow transition. Add support for dynamic form creation for transition execution. Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
@@ -4,13 +4,16 @@ from django.contrib import messages
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.template import RequestContext
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from mayan.apps.acls.models import AccessControlList
|
||||
from mayan.apps.common.forms import DynamicForm
|
||||
from mayan.apps.common.generics import FormView, SingleObjectListView
|
||||
from mayan.apps.common.mixins import ExternalObjectMixin
|
||||
from mayan.apps.documents.models import Document
|
||||
|
||||
from ..forms import WorkflowInstanceTransitionForm
|
||||
from ..forms import WorkflowInstanceTransitionSelectForm
|
||||
from ..icons import icon_workflow_instance_detail, icon_workflow_list
|
||||
from ..links import link_workflow_instance_transition
|
||||
from ..models import WorkflowInstance
|
||||
@@ -18,7 +21,8 @@ from ..permissions import permission_workflow_view
|
||||
|
||||
__all__ = (
|
||||
'DocumentWorkflowInstanceListView', 'WorkflowInstanceDetailView',
|
||||
'WorkflowInstanceTransitionView'
|
||||
'WorkflowInstanceTransitionSelectView',
|
||||
'WorkflowInstanceTransitionExecuteView'
|
||||
)
|
||||
|
||||
|
||||
@@ -100,14 +104,17 @@ class WorkflowInstanceDetailView(SingleObjectListView):
|
||||
return get_object_or_404(klass=WorkflowInstance, pk=self.kwargs['pk'])
|
||||
|
||||
|
||||
class WorkflowInstanceTransitionView(FormView):
|
||||
form_class = WorkflowInstanceTransitionForm
|
||||
class WorkflowInstanceTransitionExecuteView(FormView):
|
||||
form_class = DynamicForm
|
||||
template_name = 'appearance/generic_form.html'
|
||||
|
||||
def form_valid(self, form):
|
||||
form_data = form.cleaned_data
|
||||
comment = form_data.pop('comment')
|
||||
|
||||
self.get_workflow_instance().do_transition(
|
||||
comment=form.cleaned_data['comment'],
|
||||
transition=form.cleaned_data['transition'], user=self.request.user
|
||||
comment=comment, extra_data=form_data,
|
||||
transition=self.get_workflow_transition(), user=self.request.user,
|
||||
)
|
||||
messages.success(
|
||||
self.request, _(
|
||||
@@ -122,19 +129,96 @@ class WorkflowInstanceTransitionView(FormView):
|
||||
'object': self.get_workflow_instance().document,
|
||||
'submit_label': _('Submit'),
|
||||
'title': _(
|
||||
'Do transition for workflow: %s'
|
||||
) % self.get_workflow_instance(),
|
||||
'Execute transition "%(transition)s" for workflow: %(workflow)s'
|
||||
) % {
|
||||
'transition': self.get_workflow_transition(),
|
||||
'workflow': self.get_workflow_instance(),
|
||||
},
|
||||
'workflow_instance': self.get_workflow_instance(),
|
||||
}
|
||||
|
||||
def get_form_extra_kwargs(self):
|
||||
return {
|
||||
'user': self.request.user,
|
||||
'workflow_instance': self.get_workflow_instance()
|
||||
schema = {
|
||||
'fields': {
|
||||
'comment': {
|
||||
'label': _('Comment'),
|
||||
'class': 'django.forms.CharField', 'kwargs': {
|
||||
'help_text': _(
|
||||
'Optional comment to attach to the transition.'
|
||||
),
|
||||
'required': False,
|
||||
}
|
||||
}
|
||||
},
|
||||
'widgets': {
|
||||
'comment': {
|
||||
'class': 'django.forms.widgets.Textarea',
|
||||
'kwargs': {
|
||||
'attrs': {
|
||||
'rows': 3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for field in self.get_workflow_transition().fields.all():
|
||||
schema['fields'][field.name] = {
|
||||
'label': field.label,
|
||||
'class': 'django.forms.CharField', 'kwargs': {
|
||||
}
|
||||
}
|
||||
|
||||
return {'schema': schema}
|
||||
|
||||
def get_success_url(self):
|
||||
return self.get_workflow_instance().get_absolute_url()
|
||||
|
||||
def get_workflow_instance(self):
|
||||
return get_object_or_404(klass=WorkflowInstance, pk=self.kwargs['pk'])
|
||||
return get_object_or_404(
|
||||
klass=WorkflowInstance, pk=self.kwargs['workflow_instance_pk']
|
||||
)
|
||||
|
||||
def get_workflow_transition(self):
|
||||
return get_object_or_404(
|
||||
klass=self.get_workflow_instance().get_transition_choices(
|
||||
_user=self.request.user
|
||||
), pk=self.kwargs['workflow_transition_pk']
|
||||
)
|
||||
|
||||
|
||||
class WorkflowInstanceTransitionSelectView(ExternalObjectMixin, FormView):
|
||||
external_object_class = WorkflowInstance
|
||||
form_class = WorkflowInstanceTransitionSelectForm
|
||||
template_name = 'appearance/generic_form.html'
|
||||
|
||||
def form_valid(self, form):
|
||||
return HttpResponseRedirect(
|
||||
redirect_to=reverse(
|
||||
viewname='document_states:workflow_instance_transition_execute',
|
||||
kwargs={
|
||||
'workflow_instance_pk': self.external_object.pk,
|
||||
'workflow_transition_pk': form.cleaned_data['transition'].pk
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'navigation_object_list': ('object', 'workflow_instance'),
|
||||
'object': self.external_object.document,
|
||||
'submit_label': _('Select'),
|
||||
'title': _(
|
||||
'Select transition for workflow: %s'
|
||||
) % self.external_object,
|
||||
'workflow_instance': self.external_object,
|
||||
}
|
||||
|
||||
def get_form_extra_kwargs(self):
|
||||
return {
|
||||
'user': self.request.user,
|
||||
'workflow_instance': self.external_object
|
||||
}
|
||||
|
||||
#def get_workflow_instance(self):
|
||||
# return get_object_or_404(klass=WorkflowInstance, pk=self.kwargs['pk'])
|
||||
|
||||
Reference in New Issue
Block a user