Add API views to submit documents for OCR and to retrieve document page OCR content.

This commit is contained in:
Roberto Rosario
2015-10-06 23:22:08 -04:00
parent 942b6af502
commit 41ede494db
5 changed files with 191 additions and 40 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<pk>\d+)/submit/$', DocumentOCRAPIView.as_view(),
name='document-ocr-submit-view'
),
url(
r'^document_version/(?P<pk>\d+)/submit/$', DocumentVersionOCRAPIView.as_view(),
name='document-version-ocr-submit-view'
),
url(
r'^page/(?P<pk>\d+)/content/$', DocumentPageContentAPIView.as_view(),
name='document-page-content-view'
),
)