diff --git a/mayan/apps/document_states/api_views.py b/mayan/apps/document_states/api_views.py index c838a82849..aff3529f01 100644 --- a/mayan/apps/document_states/api_views.py +++ b/mayan/apps/document_states/api_views.py @@ -12,14 +12,14 @@ from permissions import Permission from rest_api.filters import MayanObjectPermissionsFilter from rest_api.permissions import MayanPermission -from .models import Workflow +from .models import Workflow, WorkflowState from .permissions import ( permission_workflow_create, permission_workflow_delete, permission_workflow_edit, permission_workflow_view ) from .serializers import ( NewWorkflowDocumentTypeSerializer, WorkflowDocumentTypeSerializer, - WorkflowSerializer, WritableWorkflowSerializer + WorkflowSerializer, WorkflowStateSerializer, WritableWorkflowSerializer ) @@ -87,15 +87,6 @@ class APIWorkflowDocumentTypeList(generics.ListCreateAPIView): return workflow - #def perform_create(self, serializer): - # """ - # RESEARCH: This is not needed if the serializer uses the context - # dictionary instead. However is that an acceptable "proper" way - # to do it? - # """ - # - # serializer.save(workflow=self.get_workflow()) - def post(self, request, *args, **kwargs): """ Attach a document type to a specified workflow. @@ -252,3 +243,28 @@ class APIWorkflowView(generics.RetrieveUpdateDestroyAPIView): """ return super(APIWorkflowView, self).put(*args, **kwargs) + + +## Workflow state views + + +class APIWorkflowStateListView(generics.ListCreateAPIView): + serializer_class = WorkflowStateSerializer + queryset = WorkflowState.objects.all() + + def get(self, *args, **kwargs): + """ + Returns a list of all the workflow states. + """ + return super(APIWorkflowStateListView, self).get(*args, **kwargs) + + def post(self, *args, **kwargs): + """ + Create a new workflow state. + """ + return super(APIWorkflowStateListView, self).post(*args, **kwargs) + + +class APIWorkflowStateView(generics.RetrieveAPIView): + queryset = WorkflowState.objects.all() + serializer_class = WorkflowStateSerializer diff --git a/mayan/apps/document_states/serializers.py b/mayan/apps/document_states/serializers.py index 33337b2819..322c37743e 100644 --- a/mayan/apps/document_states/serializers.py +++ b/mayan/apps/document_states/serializers.py @@ -8,7 +8,7 @@ from rest_framework.reverse import reverse from documents.models import DocumentType from documents.serializers import DocumentTypeSerializer -from .models import Workflow +from .models import Workflow, WorkflowState class NewWorkflowDocumentTypeSerializer(serializers.Serializer): @@ -48,17 +48,28 @@ class WorkflowDocumentTypeSerializer(DocumentTypeSerializer): ) +class WorkflowStateSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + extra_kwargs = { + 'url': {'view_name': 'rest_api:workflowstate-detail'}, + 'workflow': {'view_name': 'rest_api:workflow-detail'}, + } + fields = ('completion', 'id', 'initial', 'label', 'workflow', 'url') + model = WorkflowState + + class WorkflowSerializer(serializers.HyperlinkedModelSerializer): document_types_url = serializers.HyperlinkedIdentityField( view_name='rest_api:workflow-document-type-list' ) + states = WorkflowStateSerializer(many=True, required=False) class Meta: extra_kwargs = { 'url': {'view_name': 'rest_api:workflow-detail'}, } fields = ( - 'document_types_url', 'get_initial_state', 'id', 'label', 'url' + 'document_types_url', 'id', 'label', 'states', 'url' ) model = Workflow diff --git a/mayan/apps/document_states/tests/test_api.py b/mayan/apps/document_states/tests/test_api.py index bf2ea54d82..d1276791e4 100644 --- a/mayan/apps/document_states/tests/test_api.py +++ b/mayan/apps/document_states/tests/test_api.py @@ -120,6 +120,11 @@ class WorkflowAPITestCase(APITestCase): workflow.refresh_from_db() self.assertQuerysetEqual(workflow.document_types.all(), ()) + # The workflow document type entry was deleted and not the document + # type itself. + self.assertQuerysetEqual( + DocumentType.objects.all(), (repr(self.document_type),) + ) def test_workflow_document_type_detail_view(self): workflow = self._create_workflow() @@ -175,3 +180,43 @@ class WorkflowAPITestCase(APITestCase): workflow.refresh_from_db() self.assertEqual(workflow.label, TEST_WORKFLOW_LABEL_EDITED) + + +@override_settings(OCR_AUTO_OCR=False) +class WorkflowStatesAPITestCase(APITestCase): + 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.login( + username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD + ) + + self.document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE + ) + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document = self.document_type.new_document( + file_object=file_object + ) + + def tearDown(self): + if hasattr(self, 'document_type'): + self.document_type.delete() + + def _create_workflow(self): + return Workflow.objects.create(label=TEST_WORKFLOW_LABEL) + + def test_workflow_create_view(self): + response = self.client.post( + reverse('rest_api:workflow-list'), { + 'label': TEST_WORKFLOW_LABEL + } + ) + + workflow = Workflow.objects.first() + self.assertEqual(Workflow.objects.count(), 1) + self.assertEqual(response.data['id'], workflow.pk) diff --git a/mayan/apps/document_states/urls.py b/mayan/apps/document_states/urls.py index a11c453718..bfdcac7617 100644 --- a/mayan/apps/document_states/urls.py +++ b/mayan/apps/document_states/urls.py @@ -4,7 +4,8 @@ from django.conf.urls import patterns, url from .api_views import ( APIWorkflowDocumentTypeList, APIWorkflowDocumentTypeView, - APIWorkflowListView, APIWorkflowView + APIWorkflowListView, APIWorkflowStateListView, APIWorkflowStateView, + APIWorkflowView ) from .views import ( DocumentWorkflowInstanceListView, SetupWorkflowCreateView, @@ -103,6 +104,15 @@ urlpatterns = patterns( ) api_urls = [ + url( + r'^states/$', APIWorkflowStateListView.as_view(), + name='workflowstate-list' + ), + url( + r'^states/(?P[0-9]+)/$', + APIWorkflowStateView.as_view(), + name='workflowstate-detail' + ), url(r'^workflows/$', APIWorkflowListView.as_view(), name='workflow-list'), url( r'^workflows/(?P[0-9]+)/$', APIWorkflowView.as_view(),