diff --git a/mayan/apps/ocr/api_views.py b/mayan/apps/ocr/api_views.py index 71f409ede6..6e41b34957 100644 --- a/mayan/apps/ocr/api_views.py +++ b/mayan/apps/ocr/api_views.py @@ -6,55 +6,104 @@ from django.shortcuts import get_object_or_404 from rest_framework import generics, status from rest_framework.response import Response from rest_framework.settings import api_settings +from rest_framework.views import APIView from acls.models import AccessControlList -from documents.models import DocumentVersion +from documents.models import Document, DocumentPage, DocumentVersion from permissions import Permission +from rest_api.filters import MayanObjectPermissionsFilter from rest_api.permissions import MayanPermission -from .permissions import permission_ocr_document -from .serializers import DocumentVersionOCRSerializer +from .models import DocumentPageContent +from .permissions import permission_ocr_content_view, permission_ocr_document +from .serializers import DocumentPageContentSerializer -class DocumentVersionOCRView(generics.GenericAPIView): - serializer_class = DocumentVersionOCRSerializer - - permission_classes = (MayanPermission,) +class DocumentOCRAPIView(APIView): + def get_object(self): + return get_object_or_404(Document, pk=self.kwargs['pk']) def post(self, request, *args, **kwargs): """ - Submit document version for OCR. + Submit a document for OCR. + --- + omit_serializer: true + parameters: + - name: pk + paramType: path + type: number + responseMessages: + - code: 202 + message: Accepted """ - serializer = self.get_serializer( - data=request.DATA, files=request.FILES - ) - - if serializer.is_valid(): - document_version = get_object_or_404( - DocumentVersion, pk=serializer.data['document_version_id'] + document = self.get_object() + try: + Permission.check_permissions( + self.request.user, (permission_ocr_document,) + ) + except PermissionDenied: + AccessControlList.objects.check_access( + permission_ocr_document, self.request.user, document ) - try: - Permission.check_permissions( - request.user, (permission_ocr_document,) - ) - except PermissionDenied: - AccessControlList.objects.check_access( - permission_ocr_document, request.user, - document_version.document - ) + document.submit_for_ocr() + return Response(status=status.HTTP_202_ACCEPTED) - document_version.submit_for_ocr() - headers = self.get_success_headers(serializer.data) - return Response(serializer.data, status=status.HTTP_202_ACCEPTED, - headers=headers) +class DocumentVersionOCRAPIView(APIView): + def get_object(self): + return get_object_or_404(DocumentVersion, pk=self.kwargs['pk']) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + def post(self, request, *args, **kwargs): + """ + Submit a document version for OCR. + --- + omit_serializer: true + parameters: + - name: pk + paramType: path + type: number + responseMessages: + - code: 202 + message: Accepted + """ - def get_success_headers(self, data): + document_version = self.get_object() try: - return {'Location': data[api_settings.URL_FIELD_NAME]} - except (TypeError, KeyError): - return {} + Permission.check_permissions( + self.request.user, (permission_ocr_document,) + ) + except PermissionDenied: + AccessControlList.objects.check_access( + permission_ocr_document, self.request.user, document_version + ) + + document_version.submit_for_ocr() + return Response(status=status.HTTP_202_ACCEPTED) + + +class DocumentPageContentAPIView(generics.RetrieveAPIView): + """ + Returns the OCR content of the selected document page. + --- + GET: + parameters: + - name: pk + paramType: path + type: number + """ + + filter_backends = (MayanObjectPermissionsFilter,) + mayan_object_permissions = { + 'GET': (permission_ocr_content_view,), + } + permission_classes = (MayanPermission,) + serializer_class = DocumentPageContentSerializer + + def get_object(self): + document_page = get_object_or_404(DocumentPage, pk=self.kwargs['pk']) + try: + return document_page.ocr_content + except DocumentPageContent.DoesNotExist: + return DocumentPageContent.objects.none() diff --git a/mayan/apps/ocr/serializers.py b/mayan/apps/ocr/serializers.py index 9640050fb8..7161d2fc40 100644 --- a/mayan/apps/ocr/serializers.py +++ b/mayan/apps/ocr/serializers.py @@ -1,5 +1,11 @@ +from __future__ import unicode_literals + from rest_framework import serializers +from .models import DocumentPageContent -class DocumentVersionOCRSerializer(serializers.Serializer): - document_version_id = serializers.IntegerField() + +class DocumentPageContentSerializer(serializers.ModelSerializer): + class Meta: + fields = ('content',) + model = DocumentPageContent diff --git a/mayan/apps/ocr/tests/test_api.py b/mayan/apps/ocr/tests/test_api.py new file mode 100644 index 0000000000..578a3456a6 --- /dev/null +++ b/mayan/apps/ocr/tests/test_api.py @@ -0,0 +1,86 @@ +from __future__ import unicode_literals + +import json + +from django.contrib.auth.models import User +from django.core.files import File +from django.core.urlresolvers import reverse + +from rest_framework import status +from rest_framework.test import APITestCase + +from documents.models import DocumentType +from documents.tests import ( + TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME, + TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_PATH, +) + + +class OCRAPITestCase(APITestCase): + """ + Test the OCR app API endpoints + """ + + def setUp(self): + self.admin_user = User.objects.create_superuser( + username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, + password=TEST_ADMIN_PASSWORD + ) + + self.client.force_authenticate(user=self.admin_user) + + 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(file_object), + ) + + def tearDown(self): + self.admin_user.delete() + self.document.delete() + self.document_type.delete() + + def test_submit_document(self): + response = self.client.post( + reverse( + 'rest_api:document-ocr-submit-view', + args=(self.document.pk,) + ) + ) + + self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) + + content = self.document.pages.first().ocr_content.content + + self.assertTrue('Mayan EDMS Documentation' in content) + + def test_submit_document_version(self): + response = self.client.post( + reverse( + 'rest_api:document-version-ocr-submit-view', + args=(self.document.latest_version.pk,) + ) + ) + + self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) + + content = self.document.pages.first().ocr_content.content + + self.assertTrue('Mayan EDMS Documentation' in content) + + def test_get_document_version_content(self): + response = self.client.get( + reverse( + 'rest_api:document-page-content-view', + args=(self.document.latest_version.pk,) + ), + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertTrue( + 'Mayan EDMS Documentation' in json.loads(response.content)['content'] + ) diff --git a/mayan/apps/ocr/tests/test_models.py b/mayan/apps/ocr/tests/test_models.py index 12a13bc7fc..bb703ca1e6 100644 --- a/mayan/apps/ocr/tests/test_models.py +++ b/mayan/apps/ocr/tests/test_models.py @@ -30,9 +30,7 @@ class DocumentOCRTestCase(TestCase): def test_ocr_language_backends_end(self): content = self.document.pages.first().ocr_content.content - self.assertTrue( - 'Mayan EDMS Documentation' in content - ) + self.assertTrue('Mayan EDMS Documentation' in content) class GermanOCRSupportTestCase(TestCase): diff --git a/mayan/apps/ocr/urls.py b/mayan/apps/ocr/urls.py index 2331782be3..b666ce6924 100644 --- a/mayan/apps/ocr/urls.py +++ b/mayan/apps/ocr/urls.py @@ -2,7 +2,9 @@ from __future__ import unicode_literals from django.conf.urls import patterns, url -from .api_views import DocumentVersionOCRView +from .api_views import ( + DocumentOCRAPIView, DocumentPageContentAPIView, DocumentVersionOCRAPIView +) from .views import ( DocumentAllSubmitView, DocumentSubmitView, DocumentSubmitManyView, DocumentTypeSettingsEditView, DocumentTypeSubmitView, EntryListView @@ -52,7 +54,17 @@ urlpatterns = patterns( api_urls = patterns( '', url( - r'^submit/$', DocumentVersionOCRView.as_view(), + r'^document/(?P\d+)/submit/$', DocumentOCRAPIView.as_view(), + name='document-ocr-submit-view' + ), + url( + r'^document_version/(?P\d+)/submit/$', DocumentVersionOCRAPIView.as_view(), name='document-version-ocr-submit-view' ), + url( + r'^page/(?P\d+)/content/$', DocumentPageContentAPIView.as_view(), + name='document-page-content-view' + ), + ) +