Commit working workflow state serializer, API views and tests.
This commit is contained in:
@@ -250,7 +250,6 @@ class APIWorkflowView(generics.RetrieveUpdateDestroyAPIView):
|
|||||||
|
|
||||||
class APIWorkflowStateListView(generics.ListCreateAPIView):
|
class APIWorkflowStateListView(generics.ListCreateAPIView):
|
||||||
serializer_class = WorkflowStateSerializer
|
serializer_class = WorkflowStateSerializer
|
||||||
queryset = WorkflowState.objects.all()
|
|
||||||
|
|
||||||
def get(self, *args, **kwargs):
|
def get(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
@@ -258,6 +257,39 @@ class APIWorkflowStateListView(generics.ListCreateAPIView):
|
|||||||
"""
|
"""
|
||||||
return super(APIWorkflowStateListView, self).get(*args, **kwargs)
|
return super(APIWorkflowStateListView, self).get(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return self.get_workflow().states.all()
|
||||||
|
|
||||||
|
def get_serializer_context(self):
|
||||||
|
"""
|
||||||
|
Extra context provided to the serializer class.
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
'format': self.format_kwarg,
|
||||||
|
'request': self.request,
|
||||||
|
'workflow': self.get_workflow(),
|
||||||
|
'view': self
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_workflow(self):
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
permission_required = permission_workflow_view
|
||||||
|
else:
|
||||||
|
permission_required = permission_workflow_edit
|
||||||
|
|
||||||
|
workflow = get_object_or_404(Workflow, pk=self.kwargs['pk'])
|
||||||
|
|
||||||
|
try:
|
||||||
|
Permission.check_permissions(
|
||||||
|
self.request.user, (permission_required,)
|
||||||
|
)
|
||||||
|
except PermissionDenied:
|
||||||
|
AccessControlList.objects.check_access(
|
||||||
|
permission_required, self.request.user, workflow
|
||||||
|
)
|
||||||
|
|
||||||
|
return workflow
|
||||||
|
|
||||||
def post(self, *args, **kwargs):
|
def post(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Create a new workflow state.
|
Create a new workflow state.
|
||||||
@@ -265,6 +297,74 @@ class APIWorkflowStateListView(generics.ListCreateAPIView):
|
|||||||
return super(APIWorkflowStateListView, self).post(*args, **kwargs)
|
return super(APIWorkflowStateListView, self).post(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class APIWorkflowStateView(generics.RetrieveAPIView):
|
class APIWorkflowStateView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
queryset = WorkflowState.objects.all()
|
lookup_url_kwarg = 'state_pk'
|
||||||
serializer_class = WorkflowStateSerializer
|
|
||||||
|
def delete(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Delete the selected workflow state.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return super(APIWorkflowStateView, self).delete(*args, **kwargs)
|
||||||
|
|
||||||
|
def get(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Return the details of the selected workflow state.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return super(APIWorkflowStateView, self).get(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return self.get_workflow().states.all()
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
return WorkflowStateSerializer
|
||||||
|
else:
|
||||||
|
return WorkflowStateSerializer # TODO: Writable
|
||||||
|
|
||||||
|
def get_serializer_context(self):
|
||||||
|
"""
|
||||||
|
Extra context provided to the serializer class.
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
'format': self.format_kwarg,
|
||||||
|
'request': self.request,
|
||||||
|
'workflow': self.get_workflow(),
|
||||||
|
'view': self
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_workflow(self):
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
permission_required = permission_workflow_view
|
||||||
|
else:
|
||||||
|
permission_required = permission_workflow_edit
|
||||||
|
|
||||||
|
workflow = get_object_or_404(Workflow, pk=self.kwargs['pk'])
|
||||||
|
|
||||||
|
try:
|
||||||
|
Permission.check_permissions(
|
||||||
|
self.request.user, (permission_required,)
|
||||||
|
)
|
||||||
|
except PermissionDenied:
|
||||||
|
AccessControlList.objects.check_access(
|
||||||
|
permission_required, self.request.user, workflow
|
||||||
|
)
|
||||||
|
|
||||||
|
return workflow
|
||||||
|
|
||||||
|
def patch(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Edit the selected workflow state.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return super(APIWorkflowStateView, self).patch(*args, **kwargs)
|
||||||
|
|
||||||
|
def put(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Edit the selected workflow state.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return super(APIWorkflowStateView, self).put(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,14 +49,33 @@ class WorkflowDocumentTypeSerializer(DocumentTypeSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class WorkflowStateSerializer(serializers.HyperlinkedModelSerializer):
|
class WorkflowStateSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
|
workflow_url = serializers.SerializerMethodField()
|
||||||
|
url = serializers.SerializerMethodField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
extra_kwargs = {
|
fields = (
|
||||||
'url': {'view_name': 'rest_api:workflowstate-detail'},
|
'completion', 'id', 'initial', 'label', 'url', 'workflow_url',
|
||||||
'workflow': {'view_name': 'rest_api:workflow-detail'},
|
)
|
||||||
}
|
|
||||||
fields = ('completion', 'id', 'initial', 'label', 'workflow', 'url')
|
|
||||||
model = WorkflowState
|
model = WorkflowState
|
||||||
|
|
||||||
|
def create(self, validated_data):
|
||||||
|
validated_data['workflow'] = self.context['workflow']
|
||||||
|
return super(WorkflowStateSerializer, self).create(validated_data)
|
||||||
|
|
||||||
|
def get_url(self, instance):
|
||||||
|
return reverse(
|
||||||
|
'rest_api:workflowstate-detail', args=(
|
||||||
|
instance.workflow.pk, instance.pk
|
||||||
|
), request=self.context['request'], format=self.context['format']
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_workflow_url(self, instance):
|
||||||
|
return reverse(
|
||||||
|
'rest_api:workflow-detail', args=(
|
||||||
|
instance.workflow.pk,
|
||||||
|
), request=self.context['request'], format=self.context['format']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class WorkflowSerializer(serializers.HyperlinkedModelSerializer):
|
class WorkflowSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
document_types_url = serializers.HyperlinkedIdentityField(
|
document_types_url = serializers.HyperlinkedIdentityField(
|
||||||
|
|||||||
@@ -18,7 +18,10 @@ from user_management.tests.literals import (
|
|||||||
|
|
||||||
from ..models import Workflow
|
from ..models import Workflow
|
||||||
|
|
||||||
from .literals import TEST_WORKFLOW_LABEL, TEST_WORKFLOW_LABEL_EDITED
|
from .literals import (
|
||||||
|
TEST_WORKFLOW_LABEL, TEST_WORKFLOW_LABEL_EDITED,
|
||||||
|
TEST_WORKFLOW_STATE_COMPLETION, TEST_WORKFLOW_STATE_LABEL
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@override_settings(OCR_AUTO_OCR=False)
|
@override_settings(OCR_AUTO_OCR=False)
|
||||||
@@ -208,15 +211,68 @@ class WorkflowStatesAPITestCase(APITestCase):
|
|||||||
self.document_type.delete()
|
self.document_type.delete()
|
||||||
|
|
||||||
def _create_workflow(self):
|
def _create_workflow(self):
|
||||||
return Workflow.objects.create(label=TEST_WORKFLOW_LABEL)
|
self.workflow = Workflow.objects.create(label=TEST_WORKFLOW_LABEL)
|
||||||
|
|
||||||
|
def _create_workflow_state(self):
|
||||||
|
self._create_workflow()
|
||||||
|
self.workflow_state = self.workflow.states.create(
|
||||||
|
completion=TEST_WORKFLOW_STATE_COMPLETION,
|
||||||
|
label=TEST_WORKFLOW_STATE_LABEL
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_workflow_state_create_view(self):
|
||||||
|
self._create_workflow()
|
||||||
|
|
||||||
def test_workflow_create_view(self):
|
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
reverse('rest_api:workflow-list'), {
|
reverse(
|
||||||
'label': TEST_WORKFLOW_LABEL
|
'rest_api:workflowstate-list', args=(self.workflow.pk,)
|
||||||
|
), data={
|
||||||
|
'completion': TEST_WORKFLOW_STATE_COMPLETION,
|
||||||
|
'label': TEST_WORKFLOW_STATE_LABEL
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
workflow = Workflow.objects.first()
|
self.workflow.refresh_from_db()
|
||||||
self.assertEqual(Workflow.objects.count(), 1)
|
|
||||||
self.assertEqual(response.data['id'], workflow.pk)
|
self.assertEqual(
|
||||||
|
self.workflow.states.first().label, TEST_WORKFLOW_STATE_LABEL
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_workflow_state_delete_view(self):
|
||||||
|
self._create_workflow_state()
|
||||||
|
|
||||||
|
response = self.client.delete(
|
||||||
|
reverse(
|
||||||
|
'rest_api:workflowstate-detail',
|
||||||
|
args=(self.workflow.pk, self.workflow_state.pk)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.workflow.refresh_from_db()
|
||||||
|
|
||||||
|
self.assertEqual(self.workflow.states.count(), 0)
|
||||||
|
|
||||||
|
def test_workflow_state_detail_view(self):
|
||||||
|
self._create_workflow_state()
|
||||||
|
|
||||||
|
response = self.client.get(
|
||||||
|
reverse(
|
||||||
|
'rest_api:workflowstate-detail',
|
||||||
|
args=(self.workflow.pk, self.workflow_state.pk)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
response.data['label'], TEST_WORKFLOW_STATE_LABEL
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_workflow_state_list_view(self):
|
||||||
|
self._create_workflow_state()
|
||||||
|
|
||||||
|
response = self.client.get(
|
||||||
|
reverse('rest_api:workflowstate-list', args=(self.workflow.pk,)),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
response.data['results'][0]['label'], TEST_WORKFLOW_STATE_LABEL
|
||||||
|
)
|
||||||
|
|||||||
@@ -105,13 +105,12 @@ urlpatterns = patterns(
|
|||||||
|
|
||||||
api_urls = [
|
api_urls = [
|
||||||
url(
|
url(
|
||||||
r'^states/$', APIWorkflowStateListView.as_view(),
|
r'^workflows/(?P<pk>[0-9]+)/states/$',
|
||||||
name='workflowstate-list'
|
APIWorkflowStateListView.as_view(), name='workflowstate-list'
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^states/(?P<pk>[0-9]+)/$',
|
r'^workflows/(?P<pk>[0-9]+)/states/(?P<state_pk>[0-9]+)/$',
|
||||||
APIWorkflowStateView.as_view(),
|
APIWorkflowStateView.as_view(), name='workflowstate-detail'
|
||||||
name='workflowstate-detail'
|
|
||||||
),
|
),
|
||||||
url(r'^workflows/$', APIWorkflowListView.as_view(), name='workflow-list'),
|
url(r'^workflows/$', APIWorkflowListView.as_view(), name='workflow-list'),
|
||||||
url(
|
url(
|
||||||
|
|||||||
Reference in New Issue
Block a user