Initial commit to support workflow states API endpoints.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user