Refactor the OCR app API
This refactor adds two new endpoints to view the OCR content of versions and documents. Signed-off-by: Roberto Rosario <Roberto.Rosario.Gonzalez@mayan-edms.com>
This commit is contained in:
@@ -2,95 +2,104 @@ from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from rest_framework import generics, status
|
||||
from rest_framework import status
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
|
||||
from mayan.apps.documents.models import Document, DocumentVersion
|
||||
from mayan.apps.rest_api.permissions import MayanPermission
|
||||
from mayan.apps.rest_api.viewsets import MayanAPIViewSet
|
||||
|
||||
from .models import DocumentPageOCRContent
|
||||
from .permissions import permission_ocr_content_view, permission_ocr_document
|
||||
from .serializers import DocumentPageOCRContentSerializer
|
||||
from .serializers import (
|
||||
DocumentOCRSerializer, DocumentPageOCRContentSerializer,
|
||||
DocumentVersionOCRSerializer
|
||||
)
|
||||
|
||||
|
||||
class APIDocumentOCRView(generics.GenericAPIView):
|
||||
"""
|
||||
post: Submit a document for OCR.
|
||||
"""
|
||||
mayan_object_permissions = {
|
||||
'POST': (permission_ocr_document,)
|
||||
class DocumentOCRAPIViewSet(MayanAPIViewSet):
|
||||
lookup_url_kwarg = 'document_id'
|
||||
object_permission_map = {
|
||||
'ocr_content': permission_ocr_content_view,
|
||||
'ocr_submit': permission_ocr_document,
|
||||
}
|
||||
permission_classes = (MayanPermission,)
|
||||
queryset = Document.objects.all()
|
||||
serializer_class = DocumentOCRSerializer
|
||||
|
||||
def get_serializer(self, *args, **kwargs):
|
||||
return None
|
||||
|
||||
def get_serializer_class(self):
|
||||
return None
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.get_object().submit_for_ocr()
|
||||
return Response(status=status.HTTP_202_ACCEPTED)
|
||||
|
||||
|
||||
class APIDocumentVersionOCRView(generics.GenericAPIView):
|
||||
"""
|
||||
post: Submit a document version for OCR.
|
||||
"""
|
||||
lookup_url_kwarg = 'document_version_pk'
|
||||
mayan_object_permissions = {
|
||||
'POST': (permission_ocr_document,)
|
||||
}
|
||||
permission_classes = (MayanPermission,)
|
||||
queryset = DocumentVersion.objects.all()
|
||||
|
||||
def get_document(self):
|
||||
return get_object_or_404(klass=Document, pk=self.kwargs['document_pk'])
|
||||
|
||||
def get_queryset(self):
|
||||
return self.get_document().versions.all()
|
||||
|
||||
def get_serializer(self, *args, **kwargs):
|
||||
return None
|
||||
|
||||
def get_serializer_class(self):
|
||||
return None
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.get_object().submit_for_ocr()
|
||||
return Response(status=status.HTTP_202_ACCEPTED)
|
||||
|
||||
|
||||
class APIDocumentPageOCRContentView(generics.RetrieveAPIView):
|
||||
"""
|
||||
get: Returns the OCR content of the selected document page.
|
||||
"""
|
||||
lookup_url_kwarg = 'document_page_pk'
|
||||
mayan_object_permissions = {
|
||||
'GET': (permission_ocr_content_view,),
|
||||
}
|
||||
permission_classes = (MayanPermission,)
|
||||
serializer_class = DocumentPageOCRContentSerializer
|
||||
|
||||
def get_document(self):
|
||||
return get_object_or_404(klass=Document, pk=self.kwargs['document_pk'])
|
||||
|
||||
def get_document_version(self):
|
||||
return get_object_or_404(
|
||||
klass=self.get_document().versions.all(), pk=self.kwargs['document_version_pk']
|
||||
@action(
|
||||
detail=True, url_name='ocr-content', url_path='ocr'
|
||||
)
|
||||
def ocr_content(self, request, *args, **kwargs):
|
||||
instance = self.get_object()
|
||||
serializer = self.get_serializer(instance)
|
||||
headers = self.get_success_headers(data=serializer.data)
|
||||
return Response(
|
||||
serializer.data, status=status.HTTP_200_OK, headers=headers
|
||||
)
|
||||
|
||||
def get_queryset(self):
|
||||
return self.get_document_version().pages.all()
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
@action(
|
||||
detail=True, methods=('post',), url_name='ocr-submit',
|
||||
url_path='ocr/submit'
|
||||
)
|
||||
def ocr_submit(self, request, *args, **kwargs):
|
||||
instance = self.get_object()
|
||||
instance.submit_for_ocr(_user=request.user)
|
||||
return Response(
|
||||
data=None, status=status.HTTP_202_ACCEPTED
|
||||
)
|
||||
|
||||
try:
|
||||
ocr_content = instance.ocr_content
|
||||
except DocumentPageOCRContent.DoesNotExist:
|
||||
ocr_content = DocumentPageOCRContent.objects.none()
|
||||
|
||||
serializer = self.get_serializer(ocr_content)
|
||||
return Response(serializer.data)
|
||||
class DocumentVersionOCRAPIViewSet(MayanAPIViewSet):
|
||||
lookup_url_kwarg = 'document_version_id'
|
||||
object_permission_map = {
|
||||
'ocr_content': permission_ocr_content_view,
|
||||
'ocr_submit': permission_ocr_document,
|
||||
}
|
||||
queryset = DocumentVersion.objects.all()
|
||||
serializer_class = DocumentVersionOCRSerializer
|
||||
|
||||
@action(
|
||||
detail=True, url_name='ocr-content', url_path='ocr'
|
||||
)
|
||||
def ocr_content(self, request, *args, **kwargs):
|
||||
instance = self.get_object()
|
||||
serializer = self.get_serializer(instance)
|
||||
headers = self.get_success_headers(data=serializer.data)
|
||||
return Response(
|
||||
serializer.data, status=status.HTTP_200_OK, headers=headers
|
||||
)
|
||||
|
||||
@action(
|
||||
detail=True, methods=('post',), url_name='ocr-submit',
|
||||
url_path='ocr/submit'
|
||||
)
|
||||
def ocr_submit(self, request, *args, **kwargs):
|
||||
instance = self.get_object()
|
||||
instance.submit_for_ocr(_user=request.user)
|
||||
return Response(
|
||||
data=None, status=status.HTTP_202_ACCEPTED
|
||||
)
|
||||
|
||||
|
||||
class DocumentPageOCRAPIViewSet(MayanAPIViewSet):
|
||||
lookup_url_kwarg = 'document_page_id'
|
||||
object_permission_map = {
|
||||
'ocr_content': permission_ocr_content_view,
|
||||
}
|
||||
serializer_class = DocumentPageOCRContentSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
return get_object_or_404(
|
||||
klass=DocumentVersion, document_id=self.kwargs['document_id'],
|
||||
pk=self.kwargs['document_version_id']
|
||||
).pages.all()
|
||||
|
||||
@action(
|
||||
detail=True, url_name='content', url_path='ocr'
|
||||
)
|
||||
def ocr_content(self, request, *args, **kwargs):
|
||||
instance = self.get_object()
|
||||
serializer = self.get_serializer(instance)
|
||||
headers = self.get_success_headers(data=serializer.data)
|
||||
return Response(
|
||||
serializer.data, status=status.HTTP_200_OK, headers=headers
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user