Initial commit to support workflow states API endpoints.

This commit is contained in:
Roberto Rosario
2017-02-09 00:19:42 -04:00
parent e4da3eb786
commit d12d2d9865
4 changed files with 96 additions and 14 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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<pk>[0-9]+)/$',
APIWorkflowStateView.as_view(),
name='workflowstate-detail'
),
url(r'^workflows/$', APIWorkflowListView.as_view(), name='workflow-list'),
url(
r'^workflows/(?P<pk>[0-9]+)/$', APIWorkflowView.as_view(),