Update document states app

Change the app view namespace from 'document_states' to
'workflows'.

Add missing icons.

Improve view names.

Split views into 3 modules: workflows views, runtime proxy views
and instance views.

Update views to comply with new MERCs 5 and 6.

Fix failing tests.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-01-22 03:19:30 -04:00
parent 55356c4781
commit c7bd2ee8f2
10 changed files with 829 additions and 751 deletions

View File

@@ -22,28 +22,25 @@ from mayan.celery import app
from .classes import WorkflowAction
from .handlers import (
handler_index_document, handler_launch_workflow,
handler_trigger_transition,
handler_trigger_transition
)
from .links import (
link_document_workflow_instance_list, link_tool_launch_all_workflows,
link_workflow_create, link_workflow_delete, link_workflow_document_types,
link_workflow_edit, link_workflow_instance_detail,
link_workflow_instance_transition, link_workflow_list,
link_workflow_preview, link_workflow_runtime_proxy_document_list,
link_workflow_runtime_proxy_list,
link_workflow_runtime_proxy_state_document_list,
link_workflow_runtime_proxy_state_list, link_workflow_state_action_delete,
link_workflow_state_action_edit, link_workflow_state_action_list,
link_workflow_state_action_selection, link_workflow_state_create,
link_workflow_state_delete, link_workflow_state_edit,
link_workflow_state_list, link_workflow_transition_create,
link_workflow_transition_delete, link_workflow_transition_edit,
link_workflow_transition_list, link_workflow_transition_triggers
)
from .methods import method_get_workflow
from .links import (
link_document_workflow_instance_list, link_setup_workflow_create,
link_setup_workflow_delete, link_setup_workflow_document_types,
link_setup_workflow_edit, link_setup_workflow_list,
link_setup_workflow_state_action_delete,
link_setup_workflow_state_action_edit,
link_setup_workflow_state_action_list,
link_setup_workflow_state_action_selection,
link_setup_workflow_state_create, link_setup_workflow_state_delete,
link_setup_workflow_state_edit, link_setup_workflow_states,
link_setup_workflow_transition_create,
link_setup_workflow_transition_delete, link_setup_workflow_transition_edit,
link_setup_workflow_transitions, link_tool_launch_all_workflows,
link_workflow_document_list, link_workflow_instance_detail,
link_workflow_instance_transition,
link_workflow_instance_transition_events, link_workflow_list,
link_workflow_preview, link_workflow_state_document_list,
link_workflow_state_list
)
from .permissions import (
permission_workflow_delete, permission_workflow_edit,
permission_workflow_transition, permission_workflow_view
@@ -53,7 +50,7 @@ from .widgets import widget_transition_events
class DocumentStatesApp(MayanAppConfig):
app_namespace = 'document_states'
app_namespace = 'workflows'
app_url = 'workflows'
has_rest_api = True
has_tests = True
@@ -239,30 +236,30 @@ class DocumentStatesApp(MayanAppConfig):
)
menu_list_facet.bind_links(
links=(
link_setup_workflow_document_types,
link_setup_workflow_states, link_setup_workflow_transitions,
link_workflow_document_types,
link_workflow_state_list, link_workflow_transition_list,
link_workflow_preview, link_acl_list
), sources=(Workflow,)
)
menu_main.bind_links(links=(link_workflow_list,), position=10)
menu_main.bind_links(links=(link_workflow_runtime_proxy_list,), position=10)
menu_object.bind_links(
links=(
link_setup_workflow_edit,
link_setup_workflow_delete
link_workflow_edit,
link_workflow_delete
), sources=(Workflow,)
)
menu_object.bind_links(
links=(
link_setup_workflow_state_edit,
link_setup_workflow_state_action_list,
link_setup_workflow_state_delete
link_workflow_state_edit,
link_workflow_state_action_list,
link_workflow_state_delete
), sources=(WorkflowState,)
)
menu_object.bind_links(
links=(
link_setup_workflow_transition_edit,
link_workflow_instance_transition_events, link_acl_list,
link_setup_workflow_transition_delete
link_workflow_transition_edit,
link_workflow_transition_triggers, link_acl_list,
link_workflow_transition_delete
), sources=(WorkflowTransition,)
)
menu_object.bind_links(
@@ -273,60 +270,60 @@ class DocumentStatesApp(MayanAppConfig):
)
menu_object.bind_links(
links=(
link_workflow_document_list, link_workflow_state_list,
link_workflow_runtime_proxy_document_list,
link_workflow_runtime_proxy_state_list,
), sources=(WorkflowRuntimeProxy,)
)
menu_object.bind_links(
links=(
link_workflow_state_document_list,
link_workflow_runtime_proxy_state_document_list,
), sources=(WorkflowStateRuntimeProxy,)
)
menu_object.bind_links(
links=(
link_setup_workflow_state_action_edit,
link_workflow_state_action_edit,
link_object_error_list,
link_setup_workflow_state_action_delete,
link_workflow_state_action_delete,
), sources=(WorkflowStateAction,)
)
menu_secondary.bind_links(
links=(link_setup_workflow_list, link_setup_workflow_create),
links=(link_workflow_list, link_workflow_create),
sources=(
Workflow, 'document_states:setup_workflow_create',
'document_states:setup_workflow_list'
Workflow, 'document_states:workflow_create',
'document_states:workflow_list'
)
)
menu_secondary.bind_links(
links=(link_workflow_list,),
links=(link_workflow_runtime_proxy_list,),
sources=(
WorkflowRuntimeProxy,
)
)
menu_secondary.bind_links(
links=(link_setup_workflow_state_action_selection,),
links=(link_workflow_state_action_selection,),
sources=(
WorkflowState,
)
)
menu_setup.bind_links(links=(link_setup_workflow_list,))
menu_setup.bind_links(links=(link_workflow_list,))
menu_sidebar.bind_links(
links=(
link_setup_workflow_transition_create,
link_workflow_transition_create,
), sources=(
WorkflowTransition,
'document_states:setup_workflow_transition_list',
'document_states:workflow_transition_list',
)
)
menu_sidebar.bind_links(
links=(
link_setup_workflow_state_create,
link_workflow_state_create,
), sources=(
WorkflowState,
'document_states:setup_workflow_state_list',
'document_states:workflow_state_list',
)
)
menu_tools.bind_links(links=(link_tool_launch_all_workflows,))
post_save.connect(
dispatch_uid='workflows_handler_launch_workflow',
receiver=handler_launch_workflow, sender=Document

View File

@@ -9,11 +9,42 @@ icon_setup_workflow_list = Icon(driver_name='fontawesome', symbol='sitemap')
icon_tool_launch_all_workflows = Icon(
driver_name='fontawesome', symbol='sitemap'
)
icon_workflow_create = Icon(driver_name='fontawesome', symbol='plus')
icon_workflow_create = Icon(
driver_name='fontawesome-dual', primary_symbol='sitemap',
secondary_symbol='plus'
)
icon_workflow_delete = Icon(driver_name='fontawesome', symbol='times')
icon_workflow_edit = Icon(driver_name='fontawesome', symbol='pencil-alt')
icon_workflow_list = Icon(driver_name='fontawesome', symbol='sitemap')
icon_workflow_preview = Icon(driver_name='fontawesome', symbol='eye')
icon_workflow_state_action_delete = Icon(
driver_name='fontawesome', symbol='times'
)
icon_workflow_state_action_edit = Icon(
driver_name='fontawesome', symbol='pencil-alt'
)
icon_workflow_state_action_list = Icon(
driver_name='fontawesome', symbol='code'
)
icon_workflow_state = Icon(driver_name='fontawesome', symbol='circle')
icon_workflow_state_create = Icon(
driver_name='fontawesome-dual', primary_symbol='circle',
secondary_symbol='plus'
)
icon_workflow_state_delete = Icon(driver_name='fontawesome', symbol='times')
icon_workflow_state_edit = Icon(driver_name='fontawesome', symbol='pencil-alt')
icon_workflow_state_action = Icon(driver_name='fontawesome', symbol='code')
icon_workflow_state_action_selection = Icon(
driver_name='fontawesome-dual', primary_symbol='code',
secondary_symbol='plus'
)
icon_workflow_transition = Icon(
driver_name='fontawesome', symbol='arrows-alt-h'
)
icon_workflow_transition_create = Icon(
driver_name='fontawesome-dual', primary_symbol='arrows-alt-h',
secondary_symbol='plus'
)
icon_workflow_transition_delete = Icon(driver_name='fontawesome', symbol='times')
icon_workflow_transition_edit = Icon(driver_name='fontawesome', symbol='pencil-alt')

View File

@@ -6,10 +6,15 @@ from mayan.apps.documents.icons import icon_document_type
from mayan.apps.navigation import Link
from .icons import (
icon_document_workflow_instance_list, icon_setup_workflow_list,
icon_tool_launch_all_workflows, icon_workflow_create, icon_workflow_list,
icon_workflow_preview, icon_workflow_state, icon_workflow_state_action,
icon_workflow_transition
icon_document_workflow_instance_list, icon_tool_launch_all_workflows,
icon_workflow_create, icon_workflow_delete, icon_workflow_edit,
icon_workflow_list, icon_workflow_preview, icon_workflow_state,
icon_workflow_state_action, icon_workflow_state_action_delete,
icon_workflow_state_action_edit, icon_workflow_state_action_list,
icon_workflow_state_action_selection, icon_workflow_state_create,
icon_workflow_state_delete, icon_workflow_state_edit,
icon_workflow_transition, icon_workflow_transition_create,
icon_workflow_transition_delete, icon_workflow_transition_edit
)
from .permissions import (
permission_workflow_create, permission_workflow_delete,
@@ -18,129 +23,166 @@ from .permissions import (
)
link_document_workflow_instance_list = Link(
args='resolved_object.pk', icon_class=icon_document_workflow_instance_list,
icon_class=icon_document_workflow_instance_list,
kwargs={'document_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('Workflows'),
view='document_states:document_workflow_instance_list',
)
link_setup_workflow_create = Link(
icon_class=icon_workflow_create, permissions=(permission_workflow_create,),
text=_('Create workflow'), view='document_states:setup_workflow_create'
)
link_setup_workflow_delete = Link(
args='resolved_object.pk', permissions=(permission_workflow_delete,),
tags='dangerous', text=_('Delete'),
view='document_states:setup_workflow_delete',
)
link_setup_workflow_document_types = Link(
args='resolved_object.pk', icon_class=icon_document_type,
permissions=(permission_workflow_edit,), text=_('Document types'),
view='document_states:setup_workflow_document_types',
)
link_setup_workflow_edit = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
text=_('Edit'), view='document_states:setup_workflow_edit',
)
link_setup_workflow_list = Link(
icon_class=icon_setup_workflow_list,
permissions=(permission_workflow_view,), text=_('Workflows'),
view='document_states:setup_workflow_list'
)
link_setup_workflow_state_action_delete = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
tags='dangerous', text=_('Delete'),
view='document_states:setup_workflow_state_action_delete',
)
link_setup_workflow_state_action_edit = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
text=_('Edit'), view='document_states:setup_workflow_state_action_edit',
)
link_setup_workflow_state_action_list = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
text=_('Actions'),
view='document_states:setup_workflow_state_action_list',
)
link_setup_workflow_state_action_selection = Link(
args='resolved_object.pk', icon_class=icon_workflow_state_action,
permissions=(permission_workflow_edit,), text=_('Create action'),
view='document_states:setup_workflow_state_action_selection',
)
link_setup_workflow_state_create = Link(
args='resolved_object.pk', icon_class=icon_workflow_state,
permissions=(permission_workflow_edit,), text=_('Create state'),
view='document_states:setup_workflow_state_create',
)
link_setup_workflow_state_delete = Link(
args='object.pk', permissions=(permission_workflow_edit,),
tags='dangerous', text=_('Delete'),
view='document_states:setup_workflow_state_delete',
)
link_setup_workflow_state_edit = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
text=_('Edit'), view='document_states:setup_workflow_state_edit',
)
link_setup_workflow_states = Link(
args='resolved_object.pk', icon_class=icon_workflow_state,
permissions=(permission_workflow_view,), text=_('States'),
view='document_states:setup_workflow_state_list',
)
link_setup_workflow_transition_create = Link(
args='resolved_object.pk', icon_class=icon_workflow_transition,
permissions=(permission_workflow_edit,), text=_('Create transition'),
view='document_states:setup_workflow_transition_create',
)
link_setup_workflow_transition_delete = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
tags='dangerous', text=_('Delete'),
view='document_states:setup_workflow_transition_delete',
)
link_setup_workflow_transition_edit = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
text=_('Edit'), view='document_states:setup_workflow_transition_edit',
)
link_setup_workflow_transitions = Link(
args='resolved_object.pk', icon_class=icon_workflow_transition,
permissions=(permission_workflow_view,), text=_('Transitions'),
view='document_states:setup_workflow_transition_list',
view='workflows:document_workflow_instance_list'
)
link_tool_launch_all_workflows = Link(
icon_class=icon_tool_launch_all_workflows,
permissions=(permission_workflow_tools,),
text=_('Launch all workflows'),
view='document_states:tool_launch_all_workflows'
view='workflows:tool_launch_all_workflows'
)
link_workflow_instance_detail = Link(
args='resolved_object.pk', permissions=(permission_workflow_view,),
text=_('Detail'), view='document_states:workflow_instance_detail',
link_workflow_create = Link(
icon_class=icon_workflow_create, permissions=(permission_workflow_create,),
text=_('Create workflow'), view='workflows:workflow_create'
)
link_workflow_instance_transition = Link(
args='resolved_object.pk', text=_('Transition'),
view='document_states:workflow_instance_transition',
link_workflow_delete = Link(
icon_class=icon_workflow_delete,
kwargs={'workflow_id': 'resolved_object.pk'},
permissions=(permission_workflow_delete,), tags='dangerous',
text=_('Delete'), view='workflows:workflow_delete'
)
link_workflow_document_list = Link(
args='resolved_object.pk', permissions=(permission_workflow_view,),
text=_('Workflow documents'),
view='document_states:workflow_document_list',
link_workflow_document_types = Link(
icon_class=icon_document_type, kwargs={'workflow_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Document types'),
view='workflows:workflow_document_types'
)
link_workflow_edit = Link(
icon_class=icon_workflow_edit,
kwargs={'workflow_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Edit'),
view='workflows:workflow_edit'
)
link_workflow_list = Link(
icon_class=icon_workflow_list, permissions=(permission_workflow_view,),
text=_('Workflows'), view='document_states:workflow_list'
)
link_workflow_state_document_list = Link(
args='resolved_object.pk', permissions=(permission_workflow_view,),
text=_('State documents'),
view='document_states:workflow_state_document_list',
)
link_workflow_state_list = Link(
args='resolved_object.pk', permissions=(permission_workflow_view,),
text=_('States'), view='document_states:workflow_state_list',
)
link_workflow_instance_transition_events = Link(
args='resolved_object.pk', permissions=(permission_workflow_edit,),
text=_('Transition triggers'),
view='document_states:setup_workflow_transition_events'
icon_class=icon_workflow_list,
permissions=(permission_workflow_view,), text=_('Workflows'),
view='workflows:workflow_list'
)
link_workflow_preview = Link(
args='resolved_object.pk', icon_class=icon_workflow_preview,
icon_class=icon_workflow_preview,
kwargs={'workflow_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('Preview'),
view='document_states:workflow_preview'
view='workflows:workflow_preview'
)
# Workflow instances
link_workflow_instance_detail = Link(
kwargs={'workflow_instance_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('Detail'),
view='workflows:workflow_instance_detail'
)
link_workflow_instance_transition = Link(
kwargs={'workflow_instance_id': 'resolved_object.pk'}, text=_('Transition'),
view='workflows:workflow_instance_transition'
)
# Workflow state actions
link_workflow_state_action_delete = Link(
icon_class=icon_workflow_state_action_delete,
kwargs={'workflow_state_action_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), tags='dangerous',
text=_('Delete'), view='workflows:workflow_state_action_delete'
)
link_workflow_state_action_edit = Link(
icon_class=icon_workflow_state_action_edit,
kwargs={'workflow_state_action_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Edit'),
view='workflows:workflow_state_action_edit'
)
link_workflow_state_action_list = Link(
icon_class=icon_workflow_state_action_list,
kwargs={'workflow_state_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Actions'),
view='workflows:workflow_state_action_list'
)
link_workflow_state_action_selection = Link(
icon_class=icon_workflow_state_action_selection,
kwargs={'workflow_state_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Create action'),
view='workflows:workflow_state_action_selection'
)
# Workflow states
link_workflow_state_create = Link(
icon_class=icon_workflow_state_create,
kwargs={'workflow_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Create state'),
view='workflows:workflow_state_create'
)
link_workflow_state_delete = Link(
icon_class=icon_workflow_state_delete,
kwargs={'workflow_state_id': 'object.pk'},
permissions=(permission_workflow_edit,), tags='dangerous', text=_('Delete'),
view='workflows:workflow_state_delete'
)
link_workflow_state_edit = Link(
icon_class=icon_workflow_state_edit,
kwargs={'workflow_state_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Edit'),
view='workflows:workflow_state_edit'
)
link_workflow_state_list = Link(
icon_class=icon_workflow_state,
kwargs={'workflow_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('States'),
view='workflows:workflow_state_list'
)
# Workflow transitions
link_workflow_transition_create = Link(
icon_class=icon_workflow_transition_create,
kwargs={'workflow_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Create transition'),
view='workflows:workflow_transition_create'
)
link_workflow_transition_delete = Link(
icon_class=icon_workflow_transition_delete,
kwargs={'workflow_transition_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), tags='dangerous', text=_('Delete'),
view='workflows:workflow_transition_delete'
)
link_workflow_transition_edit = Link(
icon_class=icon_workflow_transition_edit,
kwargs={'workflow_transition_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Edit'),
view='workflows:workflow_transition_edit'
)
link_workflow_transition_list = Link(
icon_class=icon_workflow_transition,
kwargs={'workflow_transition_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('Transitions'),
view='workflows:workflow_transition_list'
)
link_workflow_transition_triggers = Link(
kwargs={'workflow_transition_id': 'resolved_object.pk'},
permissions=(permission_workflow_edit,), text=_('Transition triggers'),
view='workflows:workflow_transition_triggers'
)
# Workflow runtime proxies
link_workflow_runtime_proxy_document_list = Link(
kwargs={'workflow_runtime_proxy_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('Workflow documents'),
view='workflows:workflow_runtime_proxy_document_list'
)
link_workflow_runtime_proxy_list = Link(
icon_class=icon_workflow_list, permissions=(permission_workflow_view,),
text=_('Workflows'), view='workflows:workflow_runtime_proxy_list'
)
link_workflow_runtime_proxy_state_document_list = Link(
kwargs={'workflow_runtime_proxy_state_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('State documents'),
view='workflows:workflow_runtime_proxy_state_document_list'
)
link_workflow_runtime_proxy_state_list = Link(
kwargs={'workflow_runtime_proxy_id': 'resolved_object.pk'},
permissions=(permission_workflow_view,), text=_('States'),
view='workflows:workflow_runtime_proxy_state_list'
)

View File

@@ -406,7 +406,7 @@ class WorkflowInstance(models.Model):
def get_absolute_url(self):
return reverse(
viewname='document_states:workflow_instance_detail',
viewname='workflows:workflow_instance_detail',
kwargs={'workflow_instance_id': self.pk}
)

View File

@@ -22,14 +22,10 @@ from .literals import (
from .mixins import WorkflowTestMixin
class DocumentStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def setUp(self):
super(DocumentStateViewTestCase, self).setUp()
self.login_user()
class WorkflowViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def _request_workflow_create_view(self):
return self.post(
viewname='document_states:setup_workflow_create', data={
viewname='workflows:workflow_create', data={
'label': TEST_WORKFLOW_LABEL,
'internal_name': TEST_WORKFLOW_INTERNAL_NAME,
}
@@ -37,38 +33,38 @@ class DocumentStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def test_workflow_create_view_no_permission(self):
response = self._request_workflow_create_view()
self.assertEquals(response.status_code, 403)
self.assertEquals(Workflow.objects.count(), 0)
self.assertEqual(response.status_code, 403)
self.assertEqual(Workflow.objects.count(), 0)
def test_workflow_create_view_with_permission(self):
self.grant_permission(permission=permission_workflow_create)
response = self._request_workflow_create_view()
self.assertEquals(response.status_code, 302)
self.assertEquals(Workflow.objects.count(), 1)
self.assertEquals(Workflow.objects.all()[0].label, TEST_WORKFLOW_LABEL)
self.assertEqual(response.status_code, 302)
self.assertEqual(Workflow.objects.count(), 1)
self.assertEqual(Workflow.objects.all()[0].label, TEST_WORKFLOW_LABEL)
def _request_workflow_delete_view(self):
return self.post(
viewname='document_states:setup_workflow_delete',
viewname='workflows:workflow_delete',
kwargs={'workflow_id': self.workflow.pk}
)
def test_workflow_delete_view_no_access(self):
self._create_workflow()
response = self._request_workflow_delete_view()
self.assertEquals(response.status_code, 403)
self.assertEqual(response.status_code, 404)
self.assertTrue(self.workflow in Workflow.objects.all())
def test_workflow_delete_view_with_access(self):
self._create_workflow()
self.grant_access(permission=permission_workflow_delete, obj=self.workflow)
response = self._request_workflow_delete_view()
self.assertEquals(response.status_code, 302)
self.assertEqual(response.status_code, 302)
self.assertFalse(self.workflow in Workflow.objects.all())
def _request_workflow_edit_view(self):
return self.post(
viewname='document_states:setup_workflow_edit',
viewname='workflows:workflow_edit',
kwargs={'workflow_id': self.workflow.pk},
data={
'label': TEST_WORKFLOW_LABEL_EDITED,
@@ -79,7 +75,7 @@ class DocumentStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def test_workflow_edit_view_no_access(self):
self._create_workflow()
response = self._request_workflow_edit_view()
self.assertEquals(response.status_code, 404)
self.assertEqual(response.status_code, 404)
self.workflow.refresh_from_db()
self.assertEqual(self.workflow.label, TEST_WORKFLOW_LABEL)
@@ -87,55 +83,52 @@ class DocumentStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
self._create_workflow()
self.grant_access(permission=permission_workflow_edit, obj=self.workflow)
response = self._request_workflow_edit_view()
self.assertEquals(response.status_code, 302)
self.assertEqual(response.status_code, 302)
self.workflow.refresh_from_db()
self.assertEqual(self.workflow.label, TEST_WORKFLOW_LABEL_EDITED)
def _request_workflow_list_view(self):
return self.get(
viewname='document_states:setup_workflow_list',
viewname='workflows:workflow_list',
)
def test_workflow_list_view_no_access(self):
self._create_workflow()
response = self._request_workflow_list_view()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, text=self.workflow.label)
def test_workflow_list_view_with_access(self):
self._create_workflow()
self.grant_access(permission=permission_workflow_view, obj=self.workflow)
response = self._request_workflow_list_view()
self.assertEquals(response.status_code, 200)
self.assertContains(response, text=self.workflow.label)
self.assertContains(
response=response, text=self.workflow.label, status_code=200
)
def _request_workflow_preview_view(self):
return self.get(
viewname='document_states:workflow_preview',
viewname='workflows:workflow_preview',
kwargs={'workflow_id': self.workflow.pk}
)
def test_workflow_preview_view_no_access(self):
self._create_workflow()
response = self._request_workflow_preview_view()
self.assertEquals(response.status_code, 404)
self.assertEqual(response.status_code, 404)
self.assertTrue(self.workflow in Workflow.objects.all())
def test_workflow_preview_view_with_access(self):
self._create_workflow()
self.grant_access(permission=permission_workflow_view, obj=self.workflow)
response = self._request_workflow_preview_view()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
class DocumentStateStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def setUp(self):
super(DocumentStateStateViewTestCase, self).setUp()
self.login_user()
class WorkflowStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def _request_workflow_state_create_view(self):
return self.post(
viewname='document_states:setup_workflow_state_create',
viewname='workflows:workflow_state_create',
kwargs={'workflow_id': self.workflow.pk},
data={
'label': TEST_WORKFLOW_STATE_LABEL,
@@ -146,8 +139,8 @@ class DocumentStateStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def test_create_workflow_state_no_access(self):
self._create_workflow()
response = self._request_workflow_state_create_view()
self.assertEquals(response.status_code, 403)
self.assertEquals(WorkflowState.objects.count(), 0)
self.assertEqual(response.status_code, 404)
self.assertEqual(WorkflowState.objects.count(), 0)
def test_create_workflow_state_with_access(self):
self._create_workflow()
@@ -155,19 +148,19 @@ class DocumentStateStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
permission=permission_workflow_edit, obj=self.workflow
)
response = self._request_workflow_state_create_view()
self.assertEquals(response.status_code, 302)
self.assertEquals(WorkflowState.objects.count(), 1)
self.assertEquals(
self.assertEqual(response.status_code, 302)
self.assertEqual(WorkflowState.objects.count(), 1)
self.assertEqual(
WorkflowState.objects.all()[0].label, TEST_WORKFLOW_STATE_LABEL
)
self.assertEquals(
self.assertEqual(
WorkflowState.objects.all()[0].completion,
TEST_WORKFLOW_STATE_COMPLETION
)
def _request_workflow_state_delete_view(self):
return self.post(
viewname='document_states:setup_workflow_state_delete',
viewname='workflows:workflow_state_delete',
kwargs={'workflow_state_id': self.workflow_state.pk}
)
@@ -175,20 +168,20 @@ class DocumentStateStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
self._create_workflow()
self._create_workflow_states()
response = self._request_workflow_state_delete_view()
self.assertEquals(response.status_code, 404)
self.assertEquals(WorkflowState.objects.count(), 2)
self.assertEqual(response.status_code, 404)
self.assertEqual(WorkflowState.objects.count(), 2)
def test_delete_workflow_state_with_access(self):
self._create_workflow()
self._create_workflow_states()
self.grant_access(permission=permission_workflow_edit, obj=self.workflow)
response = self._request_workflow_state_delete_view()
self.assertEquals(response.status_code, 302)
self.assertEquals(WorkflowState.objects.count(), 1)
self.assertEqual(response.status_code, 302)
self.assertEqual(WorkflowState.objects.count(), 1)
def _request_workflow_state_edit_view(self):
return self.post(
viewname='document_states:setup_workflow_state_edit',
viewname='workflows:workflow_state_edit',
kwargs={'workflow_state_id': self.workflow_state.pk},
data={
'label': TEST_WORKFLOW_STATE_LABEL_EDITED
@@ -199,21 +192,21 @@ class DocumentStateStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
self._create_workflow()
self._create_workflow_states()
response = self._request_workflow_state_edit_view()
self.assertEquals(response.status_code, 404)
self.assertEquals(self.workflow_state.label, TEST_WORKFLOW_STATE_LABEL)
self.assertEqual(response.status_code, 404)
self.assertEqual(self.workflow_state.label, TEST_WORKFLOW_STATE_LABEL)
def test_edit_workflow_state_with_access(self):
self._create_workflow()
self._create_workflow_states()
self.grant_access(permission=permission_workflow_edit, obj=self.workflow)
response = self._request_workflow_state_edit_view()
self.assertEquals(response.status_code, 302)
self.assertEqual(response.status_code, 302)
self.workflow_state.refresh_from_db()
self.assertEquals(self.workflow_state.label, TEST_WORKFLOW_STATE_LABEL_EDITED)
self.assertEqual(self.workflow_state.label, TEST_WORKFLOW_STATE_LABEL_EDITED)
def _request_workflow_state_list_view(self):
return self.get(
viewname='document_states:setup_workflow_state_list',
viewname='workflows:workflow_state_list',
kwargs={'workflow_id': self.workflow.pk}
)
@@ -221,22 +214,19 @@ class DocumentStateStateViewTestCase(WorkflowTestMixin, GenericViewTestCase):
self._create_workflow()
self._create_workflow_states()
response = self._request_workflow_state_list_view()
self.assertEquals(response.status_code, 404)
self.assertEqual(response.status_code, 404)
def test_workflow_state_list_with_access(self):
self._create_workflow()
self._create_workflow_states()
self.grant_access(permission=permission_workflow_view, obj=self.workflow)
response = self._request_workflow_state_list_view()
self.assertEquals(response.status_code, 200)
self.assertContains(response, text=self.workflow_state.label)
self.assertContains(
response=response, text=self.workflow_state.label, status_code=200
)
class DocumentStateToolViewTestCase(GenericDocumentViewTestCase):
def setUp(self):
super(DocumentStateToolViewTestCase, self).setUp()
self.login_user()
class WorkflowToolViewTestCase(GenericDocumentViewTestCase):
def _create_workflow(self):
self.workflow = Workflow.objects.create(label=TEST_WORKFLOW_LABEL)
self.workflow.document_types.add(self.document_type)
@@ -262,7 +252,7 @@ class DocumentStateToolViewTestCase(GenericDocumentViewTestCase):
def _request_workflow_launch_view(self):
return self.post(
viewname='document_states:tool_launch_all_workflows',
viewname='workflows:tool_launch_all_workflows',
)
def test_tool_launch_all_workflows_view_no_permission(self):
@@ -283,11 +273,7 @@ class DocumentStateToolViewTestCase(GenericDocumentViewTestCase):
)
class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentViewTestCase):
def setUp(self):
super(DocumentStateTransitionViewTestCase, self).setUp()
self.login_user()
class WorkflowTransitionViewTestCase(WorkflowTestMixin, GenericDocumentViewTestCase):
def _create_document(self):
with open(TEST_SMALL_DOCUMENT_PATH, mode='rb') as file_object:
self.document_2 = self.document_type.new_document(
@@ -296,7 +282,7 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
def _request_workflow_transition_create_view(self):
return self.post(
viewname='document_states:setup_workflow_transition_create',
viewname='workflows:workflow_transition_create',
kwargs={'workflow_id': self.workflow.pk}, data={
'label': TEST_WORKFLOW_TRANSITION_LABEL,
'origin_state': self.workflow_initial_state.pk,
@@ -308,32 +294,32 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_workflow()
self._create_workflow_states()
response = self._request_workflow_transition_create_view()
self.assertEquals(response.status_code, 404)
self.assertEquals(WorkflowTransition.objects.count(), 0)
self.assertEqual(response.status_code, 404)
self.assertEqual(WorkflowTransition.objects.count(), 0)
def test_create_workflow_transition_with_access(self):
self._create_workflow()
self._create_workflow_states()
self.grant_access(permission=permission_workflow_edit, obj=self.workflow)
response = self._request_workflow_transition_create_view()
self.assertEquals(response.status_code, 302)
self.assertEquals(WorkflowTransition.objects.count(), 1)
self.assertEquals(
self.assertEqual(response.status_code, 302)
self.assertEqual(WorkflowTransition.objects.count(), 1)
self.assertEqual(
WorkflowTransition.objects.all()[0].label,
TEST_WORKFLOW_TRANSITION_LABEL
)
self.assertEquals(
self.assertEqual(
WorkflowTransition.objects.all()[0].origin_state,
self.workflow_initial_state
)
self.assertEquals(
self.assertEqual(
WorkflowTransition.objects.all()[0].destination_state,
self.workflow_state
)
def _request_workflow_transition_delete_view(self):
return self.post(
viewname='document_states:setup_workflow_transition_delete',
viewname='workflows:workflow_transition_delete',
kwargs={'workflow_transition_id': self.workflow_transition.pk}
)
@@ -342,7 +328,7 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_workflow_states()
self._create_workflow_transition()
response = self._request_workflow_transition_delete_view()
self.assertEquals(response.status_code, 404)
self.assertEqual(response.status_code, 404)
self.assertTrue(self.workflow_transition in WorkflowTransition.objects.all())
def test_delete_workflow_transition_with_access(self):
@@ -351,12 +337,12 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_workflow_transition()
self.grant_access(permission=permission_workflow_edit, obj=self.workflow)
response = self._request_workflow_transition_delete_view()
self.assertEquals(response.status_code, 302)
self.assertEqual(response.status_code, 302)
self.assertFalse(self.workflow_transition in WorkflowTransition.objects.all())
def _request_workflow_transition_edit_view(self):
return self.post(
viewname='document_states:setup_workflow_transition_edit',
viewname='workflows:workflow_transition_edit',
kwargs={'workflow_transition_id': self.workflow_transition.pk},
data={
'label': TEST_WORKFLOW_TRANSITION_LABEL_EDITED,
@@ -370,7 +356,7 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_workflow_states()
self._create_workflow_transition()
response = self._request_workflow_transition_edit_view()
self.assertEquals(response.status_code, 404)
self.assertEqual(response.status_code, 404)
self.workflow_transition.refresh_from_db()
self.assertEqual(
self.workflow_transition.label, TEST_WORKFLOW_TRANSITION_LABEL
@@ -382,7 +368,7 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_workflow_transition()
self.grant_access(permission=permission_workflow_edit, obj=self.workflow)
response = self._request_workflow_transition_edit_view()
self.assertEquals(response.status_code, 302)
self.assertEqual(response.status_code, 302)
self.workflow_transition.refresh_from_db()
self.assertEqual(
self.workflow_transition.label, TEST_WORKFLOW_TRANSITION_LABEL_EDITED
@@ -390,7 +376,7 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
def _request_workflow_transition_list_view(self):
return self.get(
viewname='document_states:setup_workflow_transition_list',
viewname='workflows:workflow_transition_list',
kwargs={'workflow_id': self.workflow.pk}
)
@@ -399,8 +385,9 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_workflow_states()
self._create_workflow_transition()
response = self._request_workflow_transition_list_view()
self.assertEquals(response.status_code, 200)
self.assertNotContains(response, text=self.workflow_transition.label)
self.assertNotContains(
response, text=self.workflow_transition.label, status_code=404
)
def test_workflow_transition_list_with_access(self):
self._create_workflow()
@@ -408,12 +395,14 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_workflow_transition()
self.grant_access(permission=permission_workflow_view, obj=self.workflow)
response = self._request_workflow_transition_list_view()
self.assertEquals(response.status_code, 200)
self.assertContains(response, text=self.workflow_transition.label)
self.assertContains(
response=response, text=self.workflow_transition.label,
status_code=200
)
def _request_workflow_transition(self):
return self.post(
viewname='document_states:workflow_instance_transition',
viewname='workflows:workflow_instance_transition',
kwargs={'workflow_instance_id': self.workflow_instance.pk},
data={
'transition': self.workflow_transition.pk,
@@ -432,7 +421,7 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
self._create_document()
self.workflow_instance = self.document_2.workflows.first()
response = self._request_workflow_transition()
self.assertEqual(response.status_code, 200)
self.assertEqual(response.status_code, 404)
# Workflow should remain in the same initial state
self.assertEqual(
self.workflow_instance.get_current_state(), self.workflow_initial_state
@@ -477,28 +466,24 @@ class DocumentStateTransitionViewTestCase(WorkflowTestMixin, GenericDocumentView
)
class DocumentStateTransitionEventViewTestCase(WorkflowTestMixin, GenericDocumentViewTestCase):
def setUp(self):
super(DocumentStateTransitionEventViewTestCase, self).setUp()
self.login_user()
def _request_workflow_transition_event_list_view(self):
class WorkflowTransitionTriggerViewTestCase(WorkflowTestMixin, GenericViewTestCase):
def _request_workflow_transition_triggers_list_view(self):
return self.get(
viewname='document_states:setup_workflow_transition_events',
viewname='workflows:workflow_transition_triggers',
kwargs={'workflow_transition_id': self.workflow_transition.pk}
)
def test_workflow_transition_event_list_no_access(self):
def test_workflow_transition_triggers_list_no_access(self):
self._create_workflow()
self._create_workflow_states()
self._create_workflow_transition()
response = self._request_workflow_transition_event_list_view()
self.assertEquals(response.status_code, 404)
response = self._request_workflow_transition_triggers_list_view()
self.assertEqual(response.status_code, 404)
def test_workflow_transition_event_list_with_access(self):
def test_workflow_transition_triggers_list_with_access(self):
self._create_workflow()
self._create_workflow_states()
self._create_workflow_transition()
self.grant_access(permission=permission_workflow_edit, obj=self.workflow)
response = self._request_workflow_transition_event_list_view()
self.assertEquals(response.status_code, 200)
response = self._request_workflow_transition_triggers_list_view()
self.assertEqual(response.status_code, 200)

View File

@@ -11,38 +11,37 @@ from .api_views import (
APIWorkflowTransitionView, APIWorkflowView
)
from .views import (
DocumentWorkflowInstanceListView, SetupWorkflowCreateView,
SetupWorkflowDeleteView, SetupWorkflowDocumentTypesView,
SetupWorkflowEditView, SetupWorkflowListView,
SetupWorkflowStateActionCreateView, SetupWorkflowStateActionDeleteView,
SetupWorkflowStateActionEditView, SetupWorkflowStateActionListView,
SetupWorkflowStateActionSelectionView, SetupWorkflowStateCreateView,
SetupWorkflowStateDeleteView, SetupWorkflowStateEditView,
SetupWorkflowStateListView, SetupWorkflowTransitionCreateView,
SetupWorkflowTransitionDeleteView, SetupWorkflowTransitionEditView,
SetupWorkflowTransitionListView,
SetupWorkflowTransitionTriggerEventListView, ToolLaunchAllWorkflows,
WorkflowDocumentListView, WorkflowInstanceDetailView,
DocumentWorkflowInstanceListView, ToolLaunchAllWorkflows,
WorkflowCreateView, WorkflowDeleteView, WorkflowDocumentTypesView,
WorkflowEditView, WorkflowInstanceDetailView,
WorkflowInstanceTransitionView, WorkflowListView, WorkflowPreviewView,
WorkflowStateDocumentListView, WorkflowStateListView
WorkflowRuntimeProxyDocumentListView, WorkflowRuntimeProxyListView,
WorkflowRuntimeProxyStateDocumentListView,
WorkflowRuntimeProxyStateListView, WorkflowStateActionCreateView,
WorkflowStateActionDeleteView, WorkflowStateActionEditView,
WorkflowStateActionListView, WorkflowStateActionSelectionView,
WorkflowStateCreateView, WorkflowStateDeleteView, WorkflowStateEditView,
WorkflowStateListView, WorkflowTransitionCreateView,
WorkflowTransitionDeleteView, WorkflowTransitionEditView,
WorkflowTransitionListView, WorkflowTransitionTriggerEventListView
)
urlpatterns = [
url(
regex=r'^workflows/$', name='setup_workflow_list',
view=SetupWorkflowListView.as_view()
regex=r'^workflows/$', name='workflow_list',
view=WorkflowListView.as_view()
),
url(
regex=r'^workflows/create/$', name='setup_workflow_create',
view=SetupWorkflowCreateView.as_view()
regex=r'^workflows/create/$', name='workflow_create',
view=WorkflowCreateView.as_view()
),
url(
regex=r'^workflows/(?P<workflow_id>\d+)/delete/$',
name='setup_workflow_delete', view=SetupWorkflowDeleteView.as_view()
name='workflow_delete', view=WorkflowDeleteView.as_view()
),
url(
regex=r'^workflows/(?P<workflow_id>\d+)/edit/$',
name='setup_workflow_edit', view=SetupWorkflowEditView.as_view()
name='workflow_edit', view=WorkflowEditView.as_view()
),
url(
regex=r'^workflows/(?P<workflow_id>\d+)/preview/$',
@@ -50,106 +49,113 @@ urlpatterns = [
),
url(
regex=r'^workflows/(?P<workflow_id>\d+)/document_types/$',
name='setup_workflow_document_types',
view=SetupWorkflowDocumentTypesView.as_view()
name='workflow_document_types',
view=WorkflowDocumentTypesView.as_view()
),
# Workflow states
url(
regex=r'^workflows/(?P<workflow_id>\d+)/states/$',
name='setup_workflow_state_list',
view=SetupWorkflowStateListView.as_view()
name='workflow_state_list',
view=WorkflowStateListView.as_view()
),
url(
regex=r'^workflows/(?P<workflow_id>\d+)/states/create/$',
name='setup_workflow_state_create',
view=SetupWorkflowStateCreateView.as_view()
name='workflow_state_create',
view=WorkflowStateCreateView.as_view()
),
url(
regex=r'^workflows/states/(?P<workflow_state_id>\d+)/delete/$',
name='setup_workflow_state_delete',
view=SetupWorkflowStateDeleteView.as_view()
name='workflow_state_delete',
view=WorkflowStateDeleteView.as_view()
),
url(
regex=r'^workflows/states/(?P<workflow_state_id>\d+)/edit/$',
name='setup_workflow_state_edit',
view=SetupWorkflowStateEditView.as_view()
name='workflow_state_edit',
view=WorkflowStateEditView.as_view()
),
# Workflow states actions
url(
regex=r'^workflows/states/(?P<workflow_state_id>\d+)/actions/$',
name='setup_workflow_state_action_list',
view=SetupWorkflowStateActionListView.as_view()
name='workflow_state_action_list',
view=WorkflowStateActionListView.as_view()
),
url(
regex=r'^workflows/states/(?P<workflow_state_id>\d+)/actions/selection/$',
name='setup_workflow_state_action_selection',
view=SetupWorkflowStateActionSelectionView.as_view(),
name='workflow_state_action_selection',
view=WorkflowStateActionSelectionView.as_view(),
),
url(
regex=r'^workflows/states/(?P<workflow_state_id>\d+)/actions/(?P<class_path>[a-zA-Z0-9_.]+)/create/$',
name='setup_workflow_state_action_create',
view=SetupWorkflowStateActionCreateView.as_view()
name='workflow_state_action_create',
view=WorkflowStateActionCreateView.as_view()
),
url(
regex=r'^workflows/states/actions/(?P<workflow_state_action_id>\d+)/delete/$',
view=SetupWorkflowStateActionDeleteView.as_view(),
name='setup_workflow_state_action_delete'
view=WorkflowStateActionDeleteView.as_view(),
name='workflow_state_action_delete'
),
url(
regex=r'^workflows/states/actions/(?P<workflow_state_action_id>\d+)/edit/$',
name='setup_workflow_state_action_edit',
view=SetupWorkflowStateActionEditView.as_view()
name='workflow_state_action_edit',
view=WorkflowStateActionEditView.as_view()
),
# Workflow transitions
url(
regex=r'^workflows/(?P<workflow_id>\d+)/transitions/$',
name='setup_workflow_transition_list',
view=SetupWorkflowTransitionListView.as_view()
name='workflow_transition_list',
view=WorkflowTransitionListView.as_view()
),
url(
regex=r'^workflows/(?P<workflow_id>\d+)/transitions/create/$',
name='setup_workflow_transition_create',
view=SetupWorkflowTransitionCreateView.as_view()
name='workflow_transition_create',
view=WorkflowTransitionCreateView.as_view()
),
url(
regex=r'^workflows/transitions/(?P<workflow_transitions_id>\d+)/delete/$',
name='setup_workflow_transition_delete',
view=SetupWorkflowTransitionDeleteView.as_view()
regex=r'^workflows/transitions/(?P<workflow_transition_id>\d+)/delete/$',
name='workflow_transition_delete',
view=WorkflowTransitionDeleteView.as_view()
),
url(
regex=r'^workflows/transitions/(?P<workflow_transitions_id>\d+)/edit/$',
name='setup_workflow_transition_edit',
view=SetupWorkflowTransitionEditView.as_view()
regex=r'^workflows/transitions/(?P<workflow_transition_id>\d+)/edit/$',
name='workflow_transition_edit',
view=WorkflowTransitionEditView.as_view()
),
url(
regex=r'^workflows/(?P<workflow_id>\d+)/transitions/events/$',
name='setup_workflow_transition_events',
view=SetupWorkflowTransitionTriggerEventListView.as_view()
regex=r'^workflows/transitions/(?P<workflow_transition_id>\d+)/triggers/$',
name='workflow_transition_triggers',
view=WorkflowTransitionTriggerEventListView.as_view()
),
# Workflow runtime proxies
url(
regex=r'^workflow_instances/$', name='workflow_list',
view=WorkflowListView.as_view()
regex=r'^workflow_runtime_proxies/$', name='workflow_runtime_proxy_list',
view=WorkflowRuntimeProxyListView.as_view()
),
url(
regex=r'^workflow_instances/(?P<workflow_id>\d+)/documents/$',
name='setup_workflow_document_list',
view=WorkflowDocumentListView.as_view()
regex=r'^workflow_runtime_proxies/(?P<workflow_runtime_proxy_id>\d+)/documents/$',
name='workflow_runtime_proxy_document_list',
view=WorkflowRuntimeProxyDocumentListView.as_view()
),
url(
regex=r'^workflow_instances/(?P<workflow_id>\d+)/documents/$',
name='workflow_document_list',
view=WorkflowDocumentListView.as_view()
regex=r'^workflow_runtime_proxies/(?P<workflow_runtime_proxy_id>\d+)/states/$',
name='workflow_runtime_proxy_state_list',
view=WorkflowRuntimeProxyStateListView.as_view()
),
url(
regex=r'^workflow_instances/(?P<workflow_id>\d+)/states/$',
name='workflow_state_list', view=WorkflowStateListView.as_view()
),
url(
regex=r'^workflow_instances/states/(?P<workflow_state_id>\d+)/documents/$',
name='workflow_state_document_list',
view=WorkflowStateDocumentListView.as_view()
regex=r'^workflow_runtime_proxies/states/(?P<workflow_runtime_proxy_state_id>\d+)/documents/$',
name='workflow_runtime_proxy_state_document_list',
view=WorkflowRuntimeProxyStateDocumentListView.as_view()
),
# Workflow instances
url(
regex=r'^documents/(?P<document_id>\d+)/workflows/$',
name='document_workflow_instance_list',
@@ -165,6 +171,9 @@ urlpatterns = [
name='workflow_instance_transition',
view=WorkflowInstanceTransitionView.as_view()
),
# Workflow tools
url(
regex=r'^tools/workflows/all/launch/$',
name='tool_launch_all_workflows',

View File

@@ -0,0 +1,5 @@
from __future__ import absolute_import, unicode_literals
from .workflow_instance_views import * # NOQA
from .workflow_proxy_views import * # NOQA
from .workflow_views import * # NOQA

View File

@@ -0,0 +1,142 @@
from __future__ import absolute_import, unicode_literals
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _
from mayan.apps.acls.models import AccessControlList
from mayan.apps.common.mixins import ExternalObjectMixin
from mayan.apps.common.views import FormView, SingleObjectListView
from mayan.apps.documents.models import Document
from ..forms import WorkflowInstanceTransitionForm
from ..icons import icon_workflow_list
from ..models import WorkflowInstance
from ..permissions import (
permission_workflow_transition, permission_workflow_view
)
__all__ = (
'DocumentWorkflowInstanceListView', 'WorkflowInstanceDetailView',
'WorkflowInstanceTransitionView'
)
class DocumentWorkflowInstanceListView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access(
permissions=permission_workflow_view, user=request.user,
obj=self.get_document()
)
return super(
DocumentWorkflowInstanceListView, self
).dispatch(request, *args, **kwargs)
def get_document(self):
return get_object_or_404(
klass=Document, pk=self.kwargs['document_id']
)
def get_extra_context(self):
return {
'hide_object': True,
'no_results_icon': icon_workflow_list,
'no_results_text': _(
'Assign workflows to the document type of this document '
'to have this document execute those workflows. '
),
'no_results_title': _(
'There are no workflow for this document'
),
'object': self.get_document(),
'title': _(
'Workflows for document: %s'
) % self.get_document(),
}
def get_object_list(self):
return self.get_document().workflows.all()
class WorkflowInstanceDetailView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access(
permissions=permission_workflow_view, user=request.user,
obj=self.get_workflow_instance().document
)
return super(
WorkflowInstanceDetailView, self
).dispatch(request, *args, **kwargs)
def get_extra_context(self):
return {
'hide_object': True,
'navigation_object_list': ('object', 'workflow_instance'),
'no_results_text': _(
'This view will show the states changed as a workflow '
'instance is transitioned.'
),
'no_results_title': _(
'There are no details for this workflow instance'
),
'object': self.get_workflow_instance().document,
'title': _('Detail of workflow: %(workflow)s') % {
'workflow': self.get_workflow_instance()
},
'workflow_instance': self.get_workflow_instance(),
}
def get_object_list(self):
return self.get_workflow_instance().log_entries.order_by('-datetime')
def get_workflow_instance(self):
return get_object_or_404(
klass=WorkflowInstance, pk=self.kwargs['workflow_instance_id']
)
class WorkflowInstanceTransitionView(ExternalObjectMixin, FormView):
external_object_class = WorkflowInstance
external_object_permission = permission_workflow_transition
external_object_pk_url_kwarg = 'workflow_instance_id'
form_class = WorkflowInstanceTransitionForm
template_name = 'appearance/generic_form.html'
def form_valid(self, form):
self.get_workflow_instance().do_transition(
comment=form.cleaned_data['comment'],
transition=form.cleaned_data['transition'], user=self.request.user
)
messages.success(
message=_(
'Document "%s" transitioned successfully'
) % self.get_workflow_instance().document,
request=self.request
)
return HttpResponseRedirect(redirect_to=self.get_success_url())
def get_extra_context(self):
return {
'navigation_object_list': ('object', 'workflow_instance'),
'object': self.get_workflow_instance().document,
'submit_label': _('Submit'),
'title': _(
'Do transition for workflow: %s'
) % 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()
}
def get_success_url(self):
return self.get_workflow_instance().get_absolute_url()
def get_workflow_instance(self):
return self.get_external_object()

View File

@@ -0,0 +1,151 @@
from __future__ import absolute_import, unicode_literals
from django.shortcuts import get_object_or_404
from django.template import RequestContext
from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.mixins import ExternalObjectMixin
from mayan.apps.common.views import SingleObjectListView
from mayan.apps.documents.models import Document
from mayan.apps.documents.views import DocumentListView
from ..icons import icon_workflow_list
from ..links import link_workflow_create, link_workflow_state_create
from ..models import WorkflowRuntimeProxy, WorkflowStateRuntimeProxy
from ..permissions import permission_workflow_view
__all__ = (
'WorkflowRuntimeProxyDocumentListView', 'WorkflowRuntimeProxyListView',
'WorkflowRuntimeProxyStateDocumentListView',
'WorkflowRuntimeProxyStateListView'
)
class WorkflowRuntimeProxyDocumentListView(ExternalObjectMixin, DocumentListView):
external_object_class = WorkflowRuntimeProxy
external_object_permission = permission_workflow_view
external_object_pk_url_kwarg = 'workflow_runtime_proxy_id'
def get_document_queryset(self):
return Document.objects.filter(workflows__workflow=self.get_workflow())
def get_extra_context(self):
context = super(WorkflowRuntimeProxyDocumentListView, self).get_extra_context()
context.update(
{
'no_results_text': _(
'Associate a workflow with some document types and '
'documents of those types will be listed in this view.'
),
'no_results_title': _(
'There are no documents executing this workflow'
),
'object': self.get_workflow(),
'title': _('Documents with the workflow: %s') % self.get_workflow()
}
)
return context
def get_workflow(self):
return self.get_external_object()
class WorkflowRuntimeProxyListView(SingleObjectListView):
object_permission = permission_workflow_view
def get_extra_context(self):
return {
'hide_object': True,
'no_results_icon': icon_workflow_list,
'no_results_main_link': link_workflow_create.resolve(
context=RequestContext(
self.request, {}
)
),
'no_results_text': _(
'Create some workflows and associated them with a document '
'type. Active workflows will be shown here and the documents '
'for which they are executing.'
),
'no_results_title': _('There are no workflows'),
'title': _('Workflows'),
}
def get_object_list(self):
return WorkflowRuntimeProxy.objects.all()
class WorkflowRuntimeProxyStateDocumentListView(ExternalObjectMixin, DocumentListView):
external_object_class = WorkflowRuntimeProxy
external_object_permission = permission_workflow_view
external_object_pk_url_kwarg = 'workflow_runtime_proxy_id'
def get_document_queryset(self):
return self.get_workflow_state().get_documents()
def get_extra_context(self):
workflow_state = self.get_workflow_state()
context = super(WorkflowRuntimeProxyStateDocumentListView, self).get_extra_context()
context.update(
{
'object': workflow_state,
'navigation_object_list': ('object', 'workflow'),
'no_results_title': _(
'There are documents in this workflow state'
),
'title': _(
'Documents in the workflow "%s", state "%s"'
) % (
workflow_state.workflow, workflow_state
),
'workflow': WorkflowRuntimeProxy.objects.get(
pk=workflow_state.workflow.pk
),
}
)
return context
def get_workflow_state(self):
workflow_state = get_object_or_404(
klass=WorkflowRuntimeProxyStateDocumentListView,
pk=self.kwargs['workflow_instance_state_id'],
workflow_pk=self.get_workflow()
)
return workflow_state
def get_workflow(self):
return self.get_external_object()
class WorkflowRuntimeProxyStateListView(ExternalObjectMixin, SingleObjectListView):
external_object_class = WorkflowRuntimeProxy
external_object_permission = permission_workflow_view
external_object_pk_url_kwarg = 'workflow_runtime_proxy_id'
def get_extra_context(self):
return {
'hide_columns': True,
'hide_link': True,
'no_results_main_link': link_workflow_state_create.resolve(
context=RequestContext(
self.request, {'object': self.get_workflow()}
)
),
'no_results_text': _(
'Create states and link them using transitions.'
),
'no_results_title': _(
'This workflow doesn\'t have any state'
),
'object': self.get_workflow(),
'title': _('States of workflow: %s') % self.get_workflow()
}
def get_object_list(self):
return WorkflowStateRuntimeProxy.objects.filter(
workflow=self.get_workflow()
)
def get_workflow(self):
return self.get_external_object()