diff --git a/mayan/apps/document_states/admin.py b/mayan/apps/document_states/admin.py index 9243c1cc65..f338397fe3 100644 --- a/mayan/apps/document_states/admin.py +++ b/mayan/apps/document_states/admin.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals from django.contrib import admin +from organizations.admin import OrganizationAdminMixin + from .models import ( Workflow, WorkflowInstance, WorkflowInstanceLogEntry, WorkflowState, WorkflowTransition @@ -22,7 +24,7 @@ class WorkflowTransitionInline(admin.TabularInline): @admin.register(Workflow) -class WorkflowAdmin(admin.ModelAdmin): +class WorkflowAdmin(OrganizationAdminMixin, admin.ModelAdmin): def document_types_list(self, instance): return ','.join( instance.document_types.values_list('label', flat=True) diff --git a/mayan/apps/document_states/handlers.py b/mayan/apps/document_states/handlers.py index e97fdcfed4..c334930c44 100644 --- a/mayan/apps/document_states/handlers.py +++ b/mayan/apps/document_states/handlers.py @@ -7,4 +7,4 @@ def launch_workflow(sender, instance, created, **kwargs): Workflow = get_model('document_states', 'Workflow') if created: - Workflow.objects.launch_for(instance) + Workflow.on_organization.launch_for(instance) diff --git a/mayan/apps/document_states/managers.py b/mayan/apps/document_states/managers.py index f72aba5968..e5dca250df 100644 --- a/mayan/apps/document_states/managers.py +++ b/mayan/apps/document_states/managers.py @@ -1,7 +1,62 @@ +from __future__ import unicode_literals + +from django.apps import apps from django.db import models +from organizations.managers import CurrentOrganizationManager + + +class OrganizationWorkflowStateManager(models.Manager): + def get_queryset(self): + Workflow = apps.get_model('document_states', 'Workflow') + + return super( + OrganizationWorkflowStateManager, self + ).get_queryset().filter( + workflow__in=Workflow.on_organization.all(), + ) + + +class OrganizationWorkflowTransitionManager(models.Manager): + def get_queryset(self): + Workflow = apps.get_model('document_states', 'Workflow') + + return super( + OrganizationWorkflowTransitionManager, self + ).get_queryset().filter( + workflow__in=Workflow.on_organization.all(), + ) + + +class OrganizationWorkflowInstanceManager(models.Manager): + def get_queryset(self): + Document = apps.get_model('documents', 'Document') + Workflow = apps.get_model('document_states', 'Workflow') + + return super( + OrganizationWorkflowInstanceManager, self + ).get_queryset().filter( + workflow__in=Workflow.on_organization.all(), + document__in=Document.on_organization.all(), + ) + + +class OrganizationWorkflowInstanceLogEntryManager(models.Manager): + def get_queryset(self): + Workflow = apps.get_model('document_states', 'Workflow') + + return super( + OrganizationWorkflowInstanceLogEntryManager, self + ).get_queryset().filter( + workflow_instance__workflow__in=Workflow.on_organization.all(), + ) + class WorkflowManager(models.Manager): def launch_for(self, document): for workflow in document.document_type.workflows.all(): workflow.launch_for(document) + + +class OrganizationWorkflowManager(WorkflowManager, CurrentOrganizationManager): + pass diff --git a/mayan/apps/document_states/migrations/0003_workflow_organization.py b/mayan/apps/document_states/migrations/0003_workflow_organization.py new file mode 100644 index 0000000000..d537534540 --- /dev/null +++ b/mayan/apps/document_states/migrations/0003_workflow_organization.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import organizations.shortcuts + + +class Migration(migrations.Migration): + + dependencies = [ + ('organizations', '0002_add_data_default_organization'), + ('document_states', '0002_workflowstate_completion'), + ] + + operations = [ + migrations.AddField( + model_name='workflow', + name='organization', + field=models.ForeignKey(default=organizations.shortcuts.get_current_organization, to='organizations.Organization'), + ), + ] diff --git a/mayan/apps/document_states/models.py b/mayan/apps/document_states/models.py index 09fc7cf345..51ccbd1851 100644 --- a/mayan/apps/document_states/models.py +++ b/mayan/apps/document_states/models.py @@ -9,14 +9,23 @@ from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from documents.models import Document, DocumentType +from organizations.models import Organization +from organizations.shortcuts import get_current_organization -from .managers import WorkflowManager +from .managers import ( + OrganizationWorkflowManager, OrganizationWorkflowStateManager, + OrganizationWorkflowTransitionManager, OrganizationWorkflowInstanceManager, + OrganizationWorkflowInstanceLogEntryManager, WorkflowManager +) logger = logging.getLogger(__name__) @python_2_unicode_compatible class Workflow(models.Model): + organization = models.ForeignKey( + Organization, default=get_current_organization + ) label = models.CharField( max_length=255, unique=True, verbose_name=_('Label') ) @@ -26,12 +35,19 @@ class Workflow(models.Model): ) objects = WorkflowManager() + on_organization = OrganizationWorkflowManager() + + class Meta: + verbose_name = _('Workflow') + verbose_name_plural = _('Workflows') def __str__(self): return self.label def get_document_types_not_in_workflow(self): - return DocumentType.objects.exclude(pk__in=self.document_types.all()) + return DocumentType.on_organization.exclude( + pk__in=self.document_types.all() + ) def get_initial_state(self): try: @@ -54,10 +70,6 @@ class Workflow(models.Model): 'Workflow %s launched for document %s', self, document ) - class Meta: - verbose_name = _('Workflow') - verbose_name_plural = _('Workflows') - @python_2_unicode_compatible class WorkflowState(models.Model): @@ -79,6 +91,14 @@ class WorkflowState(models.Model): ), verbose_name=_('Completion') ) + objects = models.Manager() + on_organization = OrganizationWorkflowStateManager() + + class Meta: + unique_together = ('workflow', 'label') + verbose_name = _('Workflow state') + verbose_name_plural = _('Workflow states') + def __str__(self): return self.label @@ -87,11 +107,6 @@ class WorkflowState(models.Model): self.workflow.states.all().update(initial=False) return super(WorkflowState, self).save(*args, **kwargs) - class Meta: - unique_together = ('workflow', 'label') - verbose_name = _('Workflow state') - verbose_name_plural = _('Workflow states') - @python_2_unicode_compatible class WorkflowTransition(models.Model): @@ -109,8 +124,8 @@ class WorkflowTransition(models.Model): verbose_name=_('Destination state') ) - def __str__(self): - return self.label + objects = models.Manager() + on_organization = OrganizationWorkflowTransitionManager() class Meta: unique_together = ( @@ -119,6 +134,9 @@ class WorkflowTransition(models.Model): verbose_name = _('Workflow transition') verbose_name_plural = _('Workflow transitions') + def __str__(self): + return self.label + @python_2_unicode_compatible class WorkflowInstance(models.Model): @@ -129,6 +147,14 @@ class WorkflowInstance(models.Model): Document, related_name='workflows', verbose_name=_('Document') ) + objects = models.Manager() + on_organization = OrganizationWorkflowInstanceManager() + + class Meta: + unique_together = ('document', 'workflow') + verbose_name = _('Workflow instance') + verbose_name_plural = _('Workflow instances') + def __str__(self): return unicode(self.workflow) @@ -168,11 +194,6 @@ class WorkflowInstance(models.Model): def get_transition_choices(self): return self.get_current_state().origin_transitions.all() - class Meta: - unique_together = ('document', 'workflow') - verbose_name = _('Workflow instance') - verbose_name_plural = _('Workflow instances') - @python_2_unicode_compatible class WorkflowInstanceLogEntry(models.Model): @@ -189,9 +210,12 @@ class WorkflowInstanceLogEntry(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('User')) comment = models.TextField(blank=True, verbose_name=_('Comment')) - def __str__(self): - return unicode(self.transition) + objects = models.Manager() + on_organization = OrganizationWorkflowInstanceLogEntryManager() class Meta: verbose_name = _('Workflow instance log entry') verbose_name_plural = _('Workflow instance log entries') + + def __str__(self): + return unicode(self.transition) diff --git a/mayan/apps/document_states/tests/literals.py b/mayan/apps/document_states/tests/literals.py index c8fa5f52d8..bcf1b4a0a4 100644 --- a/mayan/apps/document_states/tests/literals.py +++ b/mayan/apps/document_states/tests/literals.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals TEST_WORKFLOW_LABEL = 'test workflow' +TEST_WORKFLOW_LABEL_EDITED = 'test workflow edited' TEST_WORKFLOW_INITIAL_STATE_LABEL = 'test initial state' TEST_WORKFLOW_INITIAL_STATE_COMPLETION = 33 TEST_WORKFLOW_STATE_LABEL = 'test state' diff --git a/mayan/apps/document_states/tests/test_organization_views.py b/mayan/apps/document_states/tests/test_organization_views.py new file mode 100644 index 0000000000..160b854b4b --- /dev/null +++ b/mayan/apps/document_states/tests/test_organization_views.py @@ -0,0 +1,59 @@ +from __future__ import unicode_literals + +from django.test import override_settings + +from organizations.tests.test_organization_views import OrganizationViewTestCase + +from ..models import Workflow + +from .literals import ( + TEST_WORKFLOW_LABEL, TEST_WORKFLOW_LABEL_EDITED, + TEST_WORKFLOW_INITIAL_STATE_LABEL, TEST_WORKFLOW_INITIAL_STATE_COMPLETION, + TEST_WORKFLOW_STATE_LABEL, TEST_WORKFLOW_STATE_COMPLETION, + TEST_WORKFLOW_TRANSITION_LABEL +) + + +@override_settings(OCR_AUTO_OCR=False) +class OrganizationWorkflowiewTestCase(OrganizationViewTestCase): + def create_workflow(self): + with self.settings(ORGANIZATION_ID=self.organization_a.pk): + self.workflow = Workflow.on_organization.create(label=TEST_WORKFLOW_LABEL) + + def test_workflow_create_view(self): + with self.settings(ORGANIZATION_ID=self.organization_a.pk): + response = self.post( + 'document_states:setup_workflow_create', + data={'label': TEST_WORKFLOW_LABEL_EDITED}, follow=True + ) + self.assertEqual(response.status_code, 200) + self.assertEqual(Workflow.on_organization.count(), 1) + + with self.settings(ORGANIZATION_ID=self.organization_b.pk): + self.assertEqual(Workflow.on_organization.count(), 0) + + def test_workflow_delete_view(self): + self.create_workflow() + + with self.settings(ORGANIZATION_ID=self.organization_b.pk): + response = self.post( + 'document_states:setup_workflow_delete', + args=(self.workflow.pk,), follow=True + ) + self.assertEqual(response.status_code, 404) + + def test_workflow_edit_view(self): + self.create_workflow() + + with self.settings(ORGANIZATION_ID=self.organization_b.pk): + response = self.post( + 'document_states:setup_workflow_edit', + args=(self.workflow.pk,), + data={'label': TEST_WORKFLOW_LABEL_EDITED}, follow=True + ) + self.assertEqual(response.status_code, 404) + + with self.settings(ORGANIZATION_ID=self.organization_a.pk): + self.assertEqual( + Workflow.on_organization.first().label, TEST_WORKFLOW_LABEL + ) diff --git a/mayan/apps/document_states/tests/test_views.py b/mayan/apps/document_states/tests/test_views.py index 028818247d..227e1558e6 100644 --- a/mayan/apps/document_states/tests/test_views.py +++ b/mayan/apps/document_states/tests/test_views.py @@ -1,19 +1,15 @@ from __future__ import unicode_literals -from django.contrib.auth import get_user_model -from django.core.urlresolvers import reverse -from django.test.client import Client -from django.test import TestCase - -from documents.models import DocumentType -from documents.tests.literals import ( - TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_PATH -) -from user_management.tests import ( - TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME, TEST_ADMIN_EMAIL +from documents.tests.test_views import GenericDocumentViewTestCase +from user_management.tests.literals import ( + TEST_USER_PASSWORD, TEST_USER_USERNAME ) from ..models import Workflow, WorkflowState, WorkflowTransition +from ..permissions import ( + permission_workflow_create, permission_workflow_delete, + permission_workflow_edit +) from .literals import ( TEST_WORKFLOW_LABEL, TEST_WORKFLOW_INITIAL_STATE_LABEL, @@ -22,70 +18,67 @@ from .literals import ( ) -class DocumentStateViewTestCase(TestCase): - def setUp(self): - self.admin_user = get_user_model().objects.create_superuser( - username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, - password=TEST_ADMIN_PASSWORD - ) - self.client = Client() - # Login the admin user - logged_in = self.client.login( - username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD - ) - self.assertTrue(logged_in) - self.assertTrue(self.admin_user.is_authenticated()) - - self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE +class DocumentStateViewTestCase(GenericDocumentViewTestCase): + def create_workflow(self): + self.workflow = Workflow.on_organization.create( + label=TEST_WORKFLOW_LABEL ) - with open(TEST_SMALL_DOCUMENT_PATH) as file_object: - self.document = self.document_type.new_document( - file_object=file_object - ) + def test_workflow_create_view_with_permission(self): + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) - def tearDown(self): - self.document_type.delete() + self.role.permissions.add( + permission_workflow_create.stored_permission + ) - def test_creating_workflow(self): - response = self.client.post( - reverse( - 'document_states:setup_workflow_create' - ), data={ + response = self.post( + 'document_states:setup_workflow_create', data={ 'label': TEST_WORKFLOW_LABEL, }, follow=True ) self.assertEquals(response.status_code, 200) - self.assertEquals(Workflow.objects.count(), 1) - self.assertEquals(Workflow.objects.all()[0].label, TEST_WORKFLOW_LABEL) + self.assertEquals(Workflow.on_organization.count(), 1) + self.assertEquals( + Workflow.on_organization.all()[0].label, TEST_WORKFLOW_LABEL + ) - def test_delete_workflow(self): - workflow = Workflow.objects.create(label=TEST_WORKFLOW_LABEL) + def test_workflow_delete_view_with_permission(self): + self.create_workflow() - self.assertEquals(Workflow.objects.count(), 1) - self.assertEquals(Workflow.objects.all()[0].label, TEST_WORKFLOW_LABEL) + self.assertEquals(Workflow.on_organization.count(), 1) + self.assertEquals( + Workflow.on_organization.all()[0].label, TEST_WORKFLOW_LABEL + ) - response = self.client.post( - reverse( - 'document_states:setup_workflow_delete', args=(workflow.pk,) - ), follow=True + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_workflow_delete.stored_permission + ) + + response = self.post( + 'document_states:setup_workflow_delete', args=(self.workflow.pk,), + follow=True ) self.assertEquals(response.status_code, 200) - self.assertEquals(Workflow.objects.count(), 0) + self.assertEquals(Workflow.on_organization.count(), 0) - def test_create_workflow_state(self): - workflow = Workflow.objects.create(label=TEST_WORKFLOW_LABEL) + def test_workflow_state_create_view_with_permission(self): + self.create_workflow() - response = self.client.post( - reverse( - 'document_states:setup_workflow_state_create', - args=(workflow.pk,) - ), data={ + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_workflow_edit.stored_permission + ) + + response = self.post( + 'document_states:setup_workflow_state_create', + args=(self.workflow.pk,), data={ 'label': TEST_WORKFLOW_STATE_LABEL, 'completion': TEST_WORKFLOW_STATE_COMPLETION, }, follow=True @@ -93,50 +86,61 @@ class DocumentStateViewTestCase(TestCase): self.assertEquals(response.status_code, 200) - self.assertEquals(WorkflowState.objects.count(), 1) + self.assertEquals(WorkflowState.on_organization.count(), 1) self.assertEquals( - WorkflowState.objects.all()[0].label, TEST_WORKFLOW_STATE_LABEL + WorkflowState.on_organization.all()[0].label, + TEST_WORKFLOW_STATE_LABEL ) self.assertEquals( - WorkflowState.objects.all()[0].completion, + WorkflowState.on_organization.all()[0].completion, TEST_WORKFLOW_STATE_COMPLETION ) - def test_delete_workflow_state(self): - workflow = Workflow.objects.create(label=TEST_WORKFLOW_LABEL) - workflow_state = WorkflowState.objects.create( - workflow=workflow, label=TEST_WORKFLOW_STATE_LABEL, + def test_workflow_state_delete_view_with_permission(self): + self.create_workflow() + + workflow_state = WorkflowState.on_organization.create( + workflow=self.workflow, label=TEST_WORKFLOW_STATE_LABEL, completion=TEST_WORKFLOW_STATE_COMPLETION ) - response = self.client.post( - reverse( - 'document_states:setup_workflow_state_delete', - args=(workflow_state.pk,) - ), follow=True + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_workflow_edit.stored_permission + ) + + response = self.post( + 'document_states:setup_workflow_state_delete', + args=(workflow_state.pk,), follow=True ) self.assertEquals(response.status_code, 200) - self.assertEquals(WorkflowState.objects.count(), 0) - self.assertEquals(Workflow.objects.count(), 1) + self.assertEquals(WorkflowState.on_organization.count(), 0) + self.assertEquals(Workflow.on_organization.count(), 1) - def test_create_workflow_transition(self): - workflow = Workflow.objects.create(label=TEST_WORKFLOW_LABEL) - workflow_initial_state = WorkflowState.objects.create( - workflow=workflow, label=TEST_WORKFLOW_INITIAL_STATE_LABEL, + def test_workflow_transition_create_view_with_permission(self): + self.create_workflow() + + workflow_initial_state = WorkflowState.on_organization.create( + workflow=self.workflow, label=TEST_WORKFLOW_INITIAL_STATE_LABEL, completion=TEST_WORKFLOW_INITIAL_STATE_COMPLETION, initial=True ) - workflow_state = WorkflowState.objects.create( - workflow=workflow, label=TEST_WORKFLOW_STATE_LABEL, + workflow_state = WorkflowState.on_organization.create( + workflow=self.workflow, label=TEST_WORKFLOW_STATE_LABEL, completion=TEST_WORKFLOW_STATE_COMPLETION ) - response = self.client.post( - reverse( - 'document_states:setup_workflow_transition_create', - args=(workflow.pk,) - ), data={ + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_workflow_edit.stored_permission + ) + + response = self.post( + 'document_states:setup_workflow_transition_create', + args=(self.workflow.pk,), data={ 'label': TEST_WORKFLOW_TRANSITION_LABEL, 'origin_state': workflow_initial_state.pk, 'destination_state': workflow_state.pk, @@ -145,47 +149,52 @@ class DocumentStateViewTestCase(TestCase): self.assertEquals(response.status_code, 200) - self.assertEquals(WorkflowTransition.objects.count(), 1) + self.assertEquals(WorkflowTransition.on_organization.count(), 1) self.assertEquals( - WorkflowTransition.objects.all()[0].label, + WorkflowTransition.on_organization.all()[0].label, TEST_WORKFLOW_TRANSITION_LABEL ) self.assertEquals( - WorkflowTransition.objects.all()[0].origin_state, + WorkflowTransition.on_organization.all()[0].origin_state, workflow_initial_state ) self.assertEquals( - WorkflowTransition.objects.all()[0].destination_state, + WorkflowTransition.on_organization.all()[0].destination_state, workflow_state ) - def test_delete_workflow_transition(self): - workflow = Workflow.objects.create(label=TEST_WORKFLOW_LABEL) - workflow_initial_state = WorkflowState.objects.create( - workflow=workflow, label=TEST_WORKFLOW_INITIAL_STATE_LABEL, + def test_workflow_transition_delete_view_with_permission(self): + self.create_workflow() + + workflow_initial_state = WorkflowState.on_organization.create( + workflow=self.workflow, label=TEST_WORKFLOW_INITIAL_STATE_LABEL, completion=TEST_WORKFLOW_INITIAL_STATE_COMPLETION, initial=True ) - workflow_state = WorkflowState.objects.create( - workflow=workflow, label=TEST_WORKFLOW_STATE_LABEL, + workflow_state = WorkflowState.on_organization.create( + workflow=self.workflow, label=TEST_WORKFLOW_STATE_LABEL, completion=TEST_WORKFLOW_STATE_COMPLETION ) - workflow_transition = WorkflowTransition.objects.create( - workflow=workflow, label=TEST_WORKFLOW_TRANSITION_LABEL, + workflow_transition = WorkflowTransition.on_organization.create( + workflow=self.workflow, label=TEST_WORKFLOW_TRANSITION_LABEL, origin_state=workflow_initial_state, destination_state=workflow_state ) - self.assertEquals(WorkflowTransition.objects.count(), 1) + self.assertEquals(WorkflowTransition.on_organization.count(), 1) - response = self.client.post( - reverse( - 'document_states:setup_workflow_transition_delete', - args=(workflow_transition.pk,) - ), follow=True + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_workflow_edit.stored_permission + ) + + response = self.post( + 'document_states:setup_workflow_transition_delete', + args=(workflow_transition.pk,), follow=True ) self.assertEquals(response.status_code, 200) - self.assertEquals(WorkflowState.objects.count(), 2) - self.assertEquals(Workflow.objects.count(), 1) - self.assertEquals(WorkflowTransition.objects.count(), 0) + self.assertEquals(WorkflowState.on_organization.count(), 2) + self.assertEquals(Workflow.on_organization.count(), 1) + self.assertEquals(WorkflowTransition.on_organization.count(), 0) diff --git a/mayan/apps/document_states/views.py b/mayan/apps/document_states/views.py index 132212c8f0..78099e6db9 100644 --- a/mayan/apps/document_states/views.py +++ b/mayan/apps/document_states/views.py @@ -47,7 +47,7 @@ class DocumentWorkflowInstanceListView(SingleObjectListView): ).dispatch(request, *args, **kwargs) def get_document(self): - return get_object_or_404(Document, pk=self.kwargs['pk']) + return get_object_or_404(Document.on_organization, pk=self.kwargs['pk']) def get_extra_context(self): return { @@ -64,7 +64,7 @@ class DocumentWorkflowInstanceListView(SingleObjectListView): class WorkflowDocumentListView(DocumentListView): def dispatch(self, request, *args, **kwargs): - self.workflow = get_object_or_404(Workflow, pk=self.kwargs['pk']) + self.workflow = get_object_or_404(Workflow.on_organization, pk=self.kwargs['pk']) try: Permission.check_permissions( @@ -80,7 +80,7 @@ class WorkflowDocumentListView(DocumentListView): ).dispatch(request, *args, **kwargs) def get_document_queryset(self): - return Document.objects.filter( + return Document.on_organization.filter( document_type__in=self.workflow.document_types.all() ) @@ -123,7 +123,7 @@ class WorkflowInstanceDetailView(SingleObjectListView): return self.get_workflow_instance().log_entries.order_by('-datetime') def get_workflow_instance(self): - return get_object_or_404(WorkflowInstance, pk=self.kwargs['pk']) + return get_object_or_404(WorkflowInstance.on_organization, pk=self.kwargs['pk']) class WorkflowInstanceTransitionView(FormView): @@ -175,7 +175,7 @@ class WorkflowInstanceTransitionView(FormView): return self.get_workflow_instance().get_absolute_url() def get_workflow_instance(self): - return get_object_or_404(WorkflowInstance, pk=self.kwargs['pk']) + return get_object_or_404(WorkflowInstance.on_organization, pk=self.kwargs['pk']) # Setup @@ -185,29 +185,37 @@ class SetupWorkflowListView(SingleObjectListView): 'title': _('Workflows'), 'hide_link': True, } - model = Workflow view_permission = permission_workflow_view + def get_queryset(self): + return Workflow.on_organization.all() + class SetupWorkflowCreateView(SingleObjectCreateView): form_class = WorkflowForm - model = Workflow view_permission = permission_workflow_create post_action_redirect = reverse_lazy('document_states:setup_workflow_list') + def get_queryset(self): + return Workflow.on_organization.all() + class SetupWorkflowEditView(SingleObjectEditView): form_class = WorkflowForm - model = Workflow view_permission = permission_workflow_edit post_action_redirect = reverse_lazy('document_states:setup_workflow_list') + def get_queryset(self): + return Workflow.on_organization.all() + class SetupWorkflowDeleteView(SingleObjectDeleteView): - model = Workflow view_permission = permission_workflow_delete post_action_redirect = reverse_lazy('document_states:setup_workflow_list') + def get_queryset(self): + return Workflow.on_organization.all() + class SetupWorkflowDocumentTypesView(AssignRemoveView): decode_content_type = True @@ -229,7 +237,7 @@ class SetupWorkflowDocumentTypesView(AssignRemoveView): } def get_object(self): - return get_object_or_404(Workflow, pk=self.kwargs['pk']) + return get_object_or_404(Workflow.on_organization, pk=self.kwargs['pk']) def left_list(self): return AssignRemoveView.generate_choices( @@ -273,7 +281,7 @@ class SetupWorkflowStateListView(SingleObjectListView): return self.get_workflow().states.all() def get_workflow(self): - return get_object_or_404(Workflow, pk=self.kwargs['pk']) + return get_object_or_404(Workflow.on_organization, pk=self.kwargs['pk']) class SetupWorkflowStateCreateView(SingleObjectCreateView): @@ -289,7 +297,7 @@ class SetupWorkflowStateCreateView(SingleObjectCreateView): } def get_workflow(self): - return get_object_or_404(Workflow, pk=self.kwargs['pk']) + return get_object_or_404(Workflow.on_organization, pk=self.kwargs['pk']) def get_queryset(self): return self.get_workflow().states.all() @@ -350,7 +358,7 @@ class SetupWorkflowTransitionListView(SingleObjectListView): view_permission = permission_workflow_view def get_workflow(self): - return get_object_or_404(Workflow, pk=self.kwargs['pk']) + return get_object_or_404(Workflow.on_organization, pk=self.kwargs['pk']) def get_queryset(self): return self.get_workflow().transitions.all() @@ -385,7 +393,7 @@ class SetupWorkflowTransitionCreateView(SingleObjectCreateView): return kwargs def get_workflow(self): - return get_object_or_404(Workflow, pk=self.kwargs['pk']) + return get_object_or_404(Workflow.on_organization, pk=self.kwargs['pk']) def get_queryset(self): return self.get_workflow().transitions.all()