Add API views to submit documents for OCR and to retrieve document page OCR content.
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
86
mayan/apps/ocr/tests/test_api.py
Normal file
86
mayan/apps/ocr/tests/test_api.py
Normal 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']
|
||||
)
|
||||
@@ -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):
|
||||
|
||||
@@ -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'
|
||||
),
|
||||
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user