diff --git a/mayan/apps/document_states/apps.py b/mayan/apps/document_states/apps.py index 83744b2826..697ac051f8 100644 --- a/mayan/apps/document_states/apps.py +++ b/mayan/apps/document_states/apps.py @@ -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 diff --git a/mayan/apps/document_states/icons.py b/mayan/apps/document_states/icons.py index 64db956c50..d9f305eebf 100644 --- a/mayan/apps/document_states/icons.py +++ b/mayan/apps/document_states/icons.py @@ -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') diff --git a/mayan/apps/document_states/links.py b/mayan/apps/document_states/links.py index 27b1fd89c0..c80fa8c2e4 100644 --- a/mayan/apps/document_states/links.py +++ b/mayan/apps/document_states/links.py @@ -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' ) diff --git a/mayan/apps/document_states/models.py b/mayan/apps/document_states/models.py index f8e179daf8..c131c2a02b 100644 --- a/mayan/apps/document_states/models.py +++ b/mayan/apps/document_states/models.py @@ -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} ) diff --git a/mayan/apps/document_states/tests/test_views.py b/mayan/apps/document_states/tests/test_views.py index d25fa91971..f9de435c0f 100644 --- a/mayan/apps/document_states/tests/test_views.py +++ b/mayan/apps/document_states/tests/test_views.py @@ -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) diff --git a/mayan/apps/document_states/urls.py b/mayan/apps/document_states/urls.py index 48baa4d5e8..d7447a08f7 100644 --- a/mayan/apps/document_states/urls.py +++ b/mayan/apps/document_states/urls.py @@ -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\d+)/delete/$', - name='setup_workflow_delete', view=SetupWorkflowDeleteView.as_view() + name='workflow_delete', view=WorkflowDeleteView.as_view() ), url( regex=r'^workflows/(?P\d+)/edit/$', - name='setup_workflow_edit', view=SetupWorkflowEditView.as_view() + name='workflow_edit', view=WorkflowEditView.as_view() ), url( regex=r'^workflows/(?P\d+)/preview/$', @@ -50,106 +49,113 @@ urlpatterns = [ ), url( regex=r'^workflows/(?P\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\d+)/states/$', - name='setup_workflow_state_list', - view=SetupWorkflowStateListView.as_view() + name='workflow_state_list', + view=WorkflowStateListView.as_view() ), url( regex=r'^workflows/(?P\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\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\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\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\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\d+)/actions/(?P[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\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\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\d+)/transitions/$', - name='setup_workflow_transition_list', - view=SetupWorkflowTransitionListView.as_view() + name='workflow_transition_list', + view=WorkflowTransitionListView.as_view() ), url( regex=r'^workflows/(?P\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\d+)/delete/$', - name='setup_workflow_transition_delete', - view=SetupWorkflowTransitionDeleteView.as_view() + regex=r'^workflows/transitions/(?P\d+)/delete/$', + name='workflow_transition_delete', + view=WorkflowTransitionDeleteView.as_view() ), url( - regex=r'^workflows/transitions/(?P\d+)/edit/$', - name='setup_workflow_transition_edit', - view=SetupWorkflowTransitionEditView.as_view() + regex=r'^workflows/transitions/(?P\d+)/edit/$', + name='workflow_transition_edit', + view=WorkflowTransitionEditView.as_view() ), url( - regex=r'^workflows/(?P\d+)/transitions/events/$', - name='setup_workflow_transition_events', - view=SetupWorkflowTransitionTriggerEventListView.as_view() + regex=r'^workflows/transitions/(?P\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\d+)/documents/$', - name='setup_workflow_document_list', - view=WorkflowDocumentListView.as_view() + regex=r'^workflow_runtime_proxies/(?P\d+)/documents/$', + name='workflow_runtime_proxy_document_list', + view=WorkflowRuntimeProxyDocumentListView.as_view() ), url( - regex=r'^workflow_instances/(?P\d+)/documents/$', - name='workflow_document_list', - view=WorkflowDocumentListView.as_view() + regex=r'^workflow_runtime_proxies/(?P\d+)/states/$', + name='workflow_runtime_proxy_state_list', + view=WorkflowRuntimeProxyStateListView.as_view() ), url( - regex=r'^workflow_instances/(?P\d+)/states/$', - name='workflow_state_list', view=WorkflowStateListView.as_view() - ), - url( - regex=r'^workflow_instances/states/(?P\d+)/documents/$', - name='workflow_state_document_list', - view=WorkflowStateDocumentListView.as_view() + regex=r'^workflow_runtime_proxies/states/(?P\d+)/documents/$', + name='workflow_runtime_proxy_state_document_list', + view=WorkflowRuntimeProxyStateDocumentListView.as_view() ), + # Workflow instances + url( regex=r'^documents/(?P\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', diff --git a/mayan/apps/document_states/views/__init__.py b/mayan/apps/document_states/views/__init__.py new file mode 100644 index 0000000000..b51fdb3cce --- /dev/null +++ b/mayan/apps/document_states/views/__init__.py @@ -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 diff --git a/mayan/apps/document_states/views/workflow_instance_views.py b/mayan/apps/document_states/views/workflow_instance_views.py new file mode 100644 index 0000000000..8633531fcc --- /dev/null +++ b/mayan/apps/document_states/views/workflow_instance_views.py @@ -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() diff --git a/mayan/apps/document_states/views/workflow_proxy_views.py b/mayan/apps/document_states/views/workflow_proxy_views.py new file mode 100644 index 0000000000..aa9c90ede3 --- /dev/null +++ b/mayan/apps/document_states/views/workflow_proxy_views.py @@ -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() diff --git a/mayan/apps/document_states/views.py b/mayan/apps/document_states/views/workflow_views.py similarity index 54% rename from mayan/apps/document_states/views.py rename to mayan/apps/document_states/views/workflow_views.py index 8e023f791b..d33af2624b 100644 --- a/mayan/apps/document_states/views.py +++ b/mayan/apps/document_states/views/workflow_views.py @@ -8,210 +8,90 @@ 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.mixins import ExternalObjectMixin from mayan.apps.common.views import ( AssignRemoveView, ConfirmView, FormView, SingleObjectCreateView, SingleObjectDeleteView, SingleObjectDetailView, SingleObjectDynamicFormCreateView, SingleObjectDynamicFormEditView, SingleObjectEditView, SingleObjectListView ) -from mayan.apps.documents.models import Document -from mayan.apps.documents.views import DocumentListView from mayan.apps.events.classes import EventType from mayan.apps.events.models import StoredEventType -from .classes import WorkflowAction -from .forms import ( - WorkflowActionSelectionForm, WorkflowForm, WorkflowInstanceTransitionForm, - WorkflowPreviewForm, WorkflowStateActionDynamicForm, WorkflowStateForm, - WorkflowTransitionForm, WorkflowTransitionTriggerEventRelationshipFormSet +from ..classes import WorkflowAction +from ..forms import ( + WorkflowActionSelectionForm, WorkflowForm, WorkflowPreviewForm, + WorkflowStateActionDynamicForm, WorkflowStateForm, WorkflowTransitionForm, + WorkflowTransitionTriggerEventRelationshipFormSet ) -from .icons import ( +from ..icons import ( icon_workflow_list, icon_workflow_state, icon_workflow_state_action, icon_workflow_transition ) -from .links import ( - link_setup_workflow_create, link_setup_workflow_state_action_selection, - link_setup_workflow_state_create, link_setup_workflow_transition_create +from ..links import ( + link_workflow_create, link_workflow_state_action_selection, + link_workflow_state_create, link_workflow_transition_create ) -from .models import ( - Workflow, WorkflowInstance, WorkflowRuntimeProxy, WorkflowState, - WorkflowStateAction, WorkflowStateRuntimeProxy, WorkflowTransition +from ..models import ( + Workflow, WorkflowState, WorkflowStateAction, WorkflowTransition ) -from .permissions import ( +from ..permissions import ( permission_workflow_create, permission_workflow_delete, permission_workflow_edit, permission_workflow_tools, permission_workflow_view ) -from .tasks import task_launch_all_workflows +from ..tasks import task_launch_all_workflows + +__all__ = ( + 'ToolLaunchAllWorkflows', 'WorkflowCreateView', 'WorkflowDeleteView', + 'WorkflowDocumentTypesView', 'WorkflowEditView', 'WorkflowListView', + 'WorkflowPreviewView', 'WorkflowStateActionCreateView', + 'WorkflowStateActionDeleteView', 'WorkflowStateActionEditView', + 'WorkflowStateActionListView', 'WorkflowStateActionSelectionView', + 'WorkflowStateCreateView', 'WorkflowStateDeleteView', + 'WorkflowStateEditView', 'WorkflowStateListView', + 'WorkflowTransitionCreateView', 'WorkflowTransitionDeleteView', + 'WorkflowTransitionEditView', 'WorkflowTransitionListView', + 'WorkflowTransitionTriggerEventListView' +) -class DocumentWorkflowInstanceListView(SingleObjectListView): - def dispatch(self, request, *args, **kwargs): - AccessControlList.objects.check_access( - permissions=permission_workflow_view, user=request.user, - obj=self.get_document() +class ToolLaunchAllWorkflows(ConfirmView): + extra_context = { + 'title': _('Launch all workflows?'), + 'subtitle': _( + 'This will launch all workflows created after documents have ' + 'already been uploaded.' ) + } + view_permission = permission_workflow_tools - 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(FormView): - 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 - ) + def view_action(self): + task_launch_all_workflows.apply_async() messages.success( - message=_( - 'Document "%s" transitioned successfully' - ) % self.get_workflow_instance().document, + message=_('Workflow launch queued successfully.'), 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 get_object_or_404( - klass=WorkflowInstance, pk=self.kwargs['workflow_instance_id'] - ) -# Setup - -class SetupWorkflowListView(SingleObjectListView): - model = Workflow - 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_setup_workflow_create.resolve( - context=RequestContext(request=self.request) - ), - 'no_results_text': _( - 'Workflows store a series of states and keep track of the ' - 'current state of a document. Transitions are used to change the ' - 'current state to a new one.' - ), - 'no_results_title': _( - 'No workflows have been defined' - ), - 'title': _('Workflows'), - } - - -class SetupWorkflowCreateView(SingleObjectCreateView): +class WorkflowCreateView(SingleObjectCreateView): + extra_context = { + 'title': _('Create new workflow'), + } form_class = WorkflowForm model = Workflow - post_action_redirect = reverse_lazy(viewname='document_states:setup_workflow_list') + post_action_redirect = reverse_lazy(viewname='workflows:workflow_list') view_permission = permission_workflow_create -class SetupWorkflowEditView(SingleObjectEditView): - form_class = WorkflowForm - model = Workflow - object_permission = permission_workflow_edit - pk_url_kwarg = 'workflow_id' - post_action_redirect = reverse_lazy(viewname='document_states:setup_workflow_list') - - -class SetupWorkflowDeleteView(SingleObjectDeleteView): +class WorkflowDeleteView(SingleObjectDeleteView): model = Workflow object_permission = permission_workflow_delete pk_url_kwarg = 'workflow_id' - post_action_redirect = reverse_lazy(viewname='document_states:setup_workflow_list') + post_action_redirect = reverse_lazy(viewname='workflows:workflow_list') -class SetupWorkflowDocumentTypesView(AssignRemoveView): +class WorkflowDocumentTypesView(AssignRemoveView): decode_content_type = True left_list_title = _('Available document types') object_permission = permission_workflow_edit @@ -258,10 +138,52 @@ class SetupWorkflowDocumentTypesView(AssignRemoveView): self.get_object().instances.filter(document__document_type=item).delete() -# Workflow state actions +class WorkflowEditView(SingleObjectEditView): + form_class = WorkflowForm + model = Workflow + object_permission = permission_workflow_edit + pk_url_kwarg = 'workflow_id' + post_action_redirect = reverse_lazy(viewname='workflows:workflow_list') -class SetupWorkflowStateActionCreateView(SingleObjectDynamicFormCreateView): +class WorkflowListView(SingleObjectListView): + model = Workflow + 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(request=self.request) + ), + 'no_results_text': _( + 'Workflows store a series of states and keep track of the ' + 'current state of a document. Transitions are used to change the ' + 'current state to a new one.' + ), + 'no_results_title': _( + 'No workflows have been defined' + ), + 'title': _('Workflows'), + } + + +class WorkflowPreviewView(SingleObjectDetailView): + form_class = WorkflowPreviewForm + model = Workflow + object_permission = permission_workflow_view + pk_url_kwarg = 'workflow_id' + + def get_extra_context(self): + return { + 'hide_labels': True, + 'object': self.get_object(), + 'title': _('Preview of: %s') % self.get_object() + } + + +class WorkflowStateActionCreateView(SingleObjectDynamicFormCreateView): form_class = WorkflowStateActionDynamicForm object_permission = permission_workflow_edit @@ -305,12 +227,12 @@ class SetupWorkflowStateActionCreateView(SingleObjectDynamicFormCreateView): def get_post_action_redirect(self): return reverse( - viewname='document_states:setup_workflow_state_action_list', + viewname='workflows:workflow_state_action_list', kwargs={'workflow_state_id': self.get_object().pk} ) -class SetupWorkflowStateActionDeleteView(SingleObjectDeleteView): +class WorkflowStateActionDeleteView(SingleObjectDeleteView): model = WorkflowStateAction object_permission = permission_workflow_edit pk_url_kwarg = 'workflow_state_action_id' @@ -328,12 +250,12 @@ class SetupWorkflowStateActionDeleteView(SingleObjectDeleteView): def get_post_action_redirect(self): return reverse( - viewname='document_states:setup_workflow_state_action_list', + viewname='workflows:workflow_state_action_list', kwargs={'workflow_state_id': self.get_object().state.pk} ) -class SetupWorkflowStateActionEditView(SingleObjectDynamicFormEditView): +class WorkflowStateActionEditView(SingleObjectDynamicFormEditView): form_class = WorkflowStateActionDynamicForm model = WorkflowStateAction object_permission = permission_workflow_edit @@ -363,12 +285,12 @@ class SetupWorkflowStateActionEditView(SingleObjectDynamicFormEditView): def get_post_action_redirect(self): return reverse( - viewname='document_states:setup_workflow_state_action_list', + viewname='workflows:workflow_state_action_list', kwargs={'workflow_state_id': self.get_object().state.pk} ) -class SetupWorkflowStateActionListView(SingleObjectListView): +class WorkflowStateActionListView(SingleObjectListView): object_permission = permission_workflow_edit def get_extra_context(self): @@ -376,7 +298,7 @@ class SetupWorkflowStateActionListView(SingleObjectListView): 'hide_object': True, 'navigation_object_list': ('object', 'workflow'), 'no_results_icon': icon_workflow_state_action, - 'no_results_main_link': link_setup_workflow_state_action_selection.resolve( + 'no_results_main_link': link_workflow_state_action_selection.resolve( context=RequestContext( request=self.request, dict_={ 'object': self.get_workflow_state() @@ -409,7 +331,7 @@ class SetupWorkflowStateActionListView(SingleObjectListView): ) -class SetupWorkflowStateActionSelectionView(FormView): +class WorkflowStateActionSelectionView(FormView): form_class = WorkflowActionSelectionForm view_permission = permission_workflow_edit @@ -417,7 +339,7 @@ class SetupWorkflowStateActionSelectionView(FormView): klass = form.cleaned_data['klass'] return HttpResponseRedirect( redirect_to=reverse( - viewname='document_states:setup_workflow_state_action_create', + viewname='workflows:workflow_state_action_create', kwargs={ 'workflow_state_id': self.get_object().pk, 'class_path': klass @@ -441,10 +363,10 @@ class SetupWorkflowStateActionSelectionView(FormView): ) -# Workflow states - - -class SetupWorkflowStateCreateView(SingleObjectCreateView): +class WorkflowStateCreateView(ExternalObjectMixin, SingleObjectCreateView): + external_object_class = Workflow + external_object_permission = permission_workflow_edit + external_object_pk_url_kwarg = 'workflow_id' form_class = WorkflowStateForm def get_extra_context(self): @@ -463,20 +385,15 @@ class SetupWorkflowStateCreateView(SingleObjectCreateView): def get_success_url(self): return reverse( - viewname='document_states:setup_workflow_state_list', + viewname='workflows:workflow_state_list', kwargs={'workflow_id': self.kwargs['workflow_id']} ) def get_workflow(self): - workflow = get_object_or_404(klass=Workflow, pk=self.kwargs['workflow_id']) - AccessControlList.objects.check_access( - permissions=(permission_workflow_edit,), obj=workflow, - user=self.request.user - ) - return workflow + return self.get_external_object() -class SetupWorkflowStateDeleteView(SingleObjectDeleteView): +class WorkflowStateDeleteView(SingleObjectDeleteView): model = WorkflowState object_permission = permission_workflow_edit pk_url_kwarg = 'workflow_state_id' @@ -488,25 +405,14 @@ class SetupWorkflowStateDeleteView(SingleObjectDeleteView): 'workflow_instance': self.get_object().workflow, } - def get_object_list(self): - return self.get_workflow().states.all() - def get_success_url(self): return reverse( - viewname='document_states:setup_workflow_state_list', + viewname='workflows:workflow_state_list', kwargs={'workflow_id': self.get_object().workflow.pk} ) - def get_workflow(self): - workflow = get_object_or_404(klass=Workflow, pk=self.kwargs['workflow_id']) - AccessControlList.objects.check_access( - permissions=(permission_workflow_edit,), obj=workflow, - user=self.request.user - ) - return workflow - -class SetupWorkflowStateEditView(SingleObjectEditView): +class WorkflowStateEditView(SingleObjectEditView): form_class = WorkflowStateForm model = WorkflowState object_permission = permission_workflow_edit @@ -521,29 +427,22 @@ class SetupWorkflowStateEditView(SingleObjectEditView): def get_success_url(self): return reverse( - viewname='document_states:setup_workflow_state_list', + viewname='workflows:workflow_state_list', kwargs={'workflow_id': self.get_object().workflow.pk} ) -class SetupWorkflowStateListView(SingleObjectListView): +class WorkflowStateListView(ExternalObjectMixin, SingleObjectListView): + external_object_class = Workflow + external_object_permission = permission_workflow_view + external_object_pk_url_kwarg = 'workflow_id' object_permission = permission_workflow_view - def dispatch(self, request, *args, **kwargs): - AccessControlList.objects.check_access( - permissions=permission_workflow_view, user=request.user, - obj=self.get_workflow() - ) - - return super( - SetupWorkflowStateListView, self - ).dispatch(request, *args, **kwargs) - def get_extra_context(self): return { 'hide_object': True, 'no_results_icon': icon_workflow_state, - 'no_results_main_link': link_setup_workflow_state_create.resolve( + 'no_results_main_link': link_workflow_state_create.resolve( context=RequestContext( self.request, {'object': self.get_workflow()} ) @@ -562,13 +461,13 @@ class SetupWorkflowStateListView(SingleObjectListView): return self.get_workflow().states.all() def get_workflow(self): - return get_object_or_404(klass=Workflow, pk=self.kwargs['workflow_id']) + return self.get_external_object() -# Transitions - - -class SetupWorkflowTransitionCreateView(SingleObjectCreateView): +class WorkflowTransitionCreateView(ExternalObjectMixin, SingleObjectCreateView): + external_object_class = Workflow + external_object_permission = permission_workflow_edit + external_object_pk_url_kwarg = 'workflow_id' form_class = WorkflowTransitionForm def get_extra_context(self): @@ -581,7 +480,7 @@ class SetupWorkflowTransitionCreateView(SingleObjectCreateView): def get_form_kwargs(self): kwargs = super( - SetupWorkflowTransitionCreateView, self + WorkflowTransitionCreateView, self ).get_form_kwargs() kwargs['workflow'] = self.get_workflow() return kwargs @@ -594,20 +493,15 @@ class SetupWorkflowTransitionCreateView(SingleObjectCreateView): def get_success_url(self): return reverse( - viewname='document_states:setup_workflow_transition_list', + viewname='workflows:workflow_transition_list', kwargs={'workflow_id': self.kwargs['workflow_id']} ) def get_workflow(self): - workflow = get_object_or_404(klass=Workflow, pk=self.kwargs['workflow_id']) - AccessControlList.objects.check_access( - permissions=(permission_workflow_edit,), obj=workflow, - user=self.request.user - ) - return workflow + return self.get_external_object() -class SetupWorkflowTransitionDeleteView(SingleObjectDeleteView): +class WorkflowTransitionDeleteView(SingleObjectDeleteView): model = WorkflowTransition object_permission = permission_workflow_edit pk_url_kwarg = 'workflow_transition_id' @@ -621,12 +515,12 @@ class SetupWorkflowTransitionDeleteView(SingleObjectDeleteView): def get_success_url(self): return reverse( - viewname='document_states:setup_workflow_transition_list', + viewname='workflows:workflow_transition_list', kwargs={'workflow_id': self.get_object().workflow.pk} ) -class SetupWorkflowTransitionEditView(SingleObjectEditView): +class WorkflowTransitionEditView(SingleObjectEditView): form_class = WorkflowTransitionForm model = WorkflowTransition object_permission = permission_workflow_edit @@ -641,26 +535,29 @@ class SetupWorkflowTransitionEditView(SingleObjectEditView): def get_form_kwargs(self): kwargs = super( - SetupWorkflowTransitionEditView, self + WorkflowTransitionEditView, self ).get_form_kwargs() kwargs['workflow'] = self.get_object().workflow return kwargs def get_success_url(self): return reverse( - viewname='document_states:setup_workflow_transition_list', + viewname='workflows:workflow_transition_list', kwargs={'workflow_id': self.get_object().workflow.pk} ) -class SetupWorkflowTransitionListView(SingleObjectListView): +class WorkflowTransitionListView(ExternalObjectMixin, SingleObjectListView): + external_object_class = Workflow + external_object_permission = permission_workflow_view + external_object_pk_url_kwarg = 'workflow_id' object_permission = permission_workflow_view def get_extra_context(self): return { 'hide_object': True, 'no_results_icon': icon_workflow_transition, - 'no_results_main_link': link_setup_workflow_transition_create.resolve( + 'no_results_main_link': link_workflow_transition_create.resolve( context=RequestContext( self.request, {'object': self.get_workflow()} ) @@ -682,167 +579,20 @@ class SetupWorkflowTransitionListView(SingleObjectListView): return self.get_workflow().transitions.all() def get_workflow(self): - return get_object_or_404( - klass=Workflow, pk=self.kwargs['workflow_id'] - ) + return self.get_external_object() -# Other - - -class WorkflowListView(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_setup_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 WorkflowDocumentListView(DocumentListView): - def dispatch(self, request, *args, **kwargs): - self.workflow = get_object_or_404( - klass=WorkflowRuntimeProxy, pk=self.kwargs['pk'] - ) - - AccessControlList.objects.check_access( - permissions=permission_workflow_view, user=request.user, - obj=self.workflow - ) - - return super( - WorkflowDocumentListView, self - ).dispatch(request, *args, **kwargs) - - def get_document_queryset(self): - return Document.objects.filter(workflows__workflow=self.workflow) - - def get_extra_context(self): - context = super(WorkflowDocumentListView, 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.workflow, - 'title': _('Documents with the workflow: %s') % self.workflow - } - ) - return context - - -class WorkflowStateDocumentListView(DocumentListView): - 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(WorkflowStateDocumentListView, 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=WorkflowStateRuntimeProxy, - pk=self.kwargs['workflow_state_id'] - ) - - AccessControlList.objects.check_access( - permissions=permission_workflow_view, user=self.request.user, - obj=workflow_state.workflow - ) - - return workflow_state - - -class WorkflowStateListView(SingleObjectListView): - def dispatch(self, request, *args, **kwargs): - AccessControlList.objects.check_access( - permissions=permission_workflow_view, user=request.user, - obj=self.get_workflow() - ) - - return super( - WorkflowStateListView, self - ).dispatch(request, *args, **kwargs) - - def get_extra_context(self): - return { - 'hide_columns': True, - 'hide_link': True, - 'no_results_main_link': link_setup_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 get_object_or_404(klass=WorkflowRuntimeProxy, pk=self.kwargs['pk']) - - -class SetupWorkflowTransitionTriggerEventListView(FormView): +class WorkflowTransitionTriggerEventListView(ExternalObjectMixin, FormView): + external_object_class = WorkflowTransition + external_object_permission = permission_workflow_edit + external_object_pk_url_kwarg = 'workflow_transition_id' form_class = WorkflowTransitionTriggerEventRelationshipFormSet submodel = StoredEventType def dispatch(self, *args, **kwargs): - AccessControlList.objects.check_access( - permissions=permission_workflow_edit, - user=self.request.user, obj=self.get_object().workflow - ) - EventType.refresh() return super( - SetupWorkflowTransitionTriggerEventListView, self + WorkflowTransitionTriggerEventListView, self ).dispatch(*args, **kwargs) def form_valid(self, form): @@ -864,13 +614,11 @@ class SetupWorkflowTransitionTriggerEventListView(FormView): ) return super( - SetupWorkflowTransitionTriggerEventListView, self + WorkflowTransitionTriggerEventListView, self ).form_valid(form=form) def get_object(self): - return get_object_or_404( - klass=WorkflowTransition, pk=self.kwargs['worflow_transition_id'] - ) + return self.get_external_object() def get_extra_context(self): return { @@ -906,38 +654,6 @@ class SetupWorkflowTransitionTriggerEventListView(FormView): def get_post_action_redirect(self): return reverse( - viewname='document_states:setup_workflow_transition_list', + viewname='workflows:workflow_transition_list', kwargs={'workflow_id': self.get_object().workflow.pk} ) - - -class ToolLaunchAllWorkflows(ConfirmView): - extra_context = { - 'title': _('Launch all workflows?'), - 'subtitle': _( - 'This will launch all workflows created after documents have ' - 'already been uploaded.' - ) - } - view_permission = permission_workflow_tools - - def view_action(self): - task_launch_all_workflows.apply_async() - messages.success( - message=_('Workflow launch queued successfully.'), - request=self.request - ) - - -class WorkflowPreviewView(SingleObjectDetailView): - form_class = WorkflowPreviewForm - model = Workflow - object_permission = permission_workflow_view - pk_url_kwarg = 'workflow_id' - - def get_extra_context(self): - return { - 'hide_labels': True, - 'object': self.get_object(), - 'title': _('Preview of: %s') % self.get_object() - }