From 7e1de2623c9af114689c6a1122d3445cc6da8b8f Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 22 Feb 2019 23:49:48 -0400 Subject: [PATCH] Update OCR app Normalize API base names. Update ViewSet base class, model classes are not needed the OCR API views. Split API tests into content and submit tests. Puntuate view test strings. Make use of success and title strings. Make use of external object mixin in document type settings view. Signed-off-by: Roberto Rosario --- mayan/apps/ocr/api_views.py | 72 +++++++++++++++--------------- mayan/apps/ocr/methods.py | 3 +- mayan/apps/ocr/tests/test_api.py | 25 ++++++----- mayan/apps/ocr/tests/test_views.py | 2 +- mayan/apps/ocr/urls.py | 4 +- mayan/apps/ocr/views.py | 53 ++++++++-------------- 6 files changed, 75 insertions(+), 84 deletions(-) diff --git a/mayan/apps/ocr/api_views.py b/mayan/apps/ocr/api_views.py index 80793ae694..bb7dd6bda6 100644 --- a/mayan/apps/ocr/api_views.py +++ b/mayan/apps/ocr/api_views.py @@ -7,7 +7,7 @@ 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.viewsets import MayanAPIViewSet +from mayan.apps.rest_api.viewsets import MayanAPIViewSet, MayanAPIGenericViewSet from .permissions import permission_ocr_content_view, permission_ocr_document from .serializers import ( @@ -26,7 +26,7 @@ class DocumentOCRAPIViewSet(MayanAPIViewSet): serializer_class = DocumentOCRSerializer @action( - detail=True, url_name='ocr-content', url_path='ocr' + detail=True, url_name='content', url_path='ocr' ) def ocr_content(self, request, *args, **kwargs): instance = self.get_object() @@ -37,7 +37,7 @@ class DocumentOCRAPIViewSet(MayanAPIViewSet): ) @action( - detail=True, methods=('post',), url_name='ocr-submit', + detail=True, methods=('post',), url_name='submit', url_path='ocr/submit' ) def ocr_submit(self, request, *args, **kwargs): @@ -48,39 +48,7 @@ class DocumentOCRAPIViewSet(MayanAPIViewSet): ) -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): +class DocumentPageOCRAPIViewSet(MayanAPIGenericViewSet): lookup_url_kwarg = 'document_page_id' object_permission_map = { 'ocr_content': permission_ocr_content_view, @@ -103,3 +71,35 @@ class DocumentPageOCRAPIViewSet(MayanAPIViewSet): return Response( serializer.data, status=status.HTTP_200_OK, headers=headers ) + + +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='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='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 + ) diff --git a/mayan/apps/ocr/methods.py b/mayan/apps/ocr/methods.py index 5c286bf283..630812b796 100644 --- a/mayan/apps/ocr/methods.py +++ b/mayan/apps/ocr/methods.py @@ -43,7 +43,8 @@ def method_document_page_get_ocr_content(self): page_content = self.ocr_content.content except DocumentPageOCRContent.DoesNotExist: return '' - return page_content + else: + return page_content def method_document_version_get_ocr_content(self): diff --git a/mayan/apps/ocr/tests/test_api.py b/mayan/apps/ocr/tests/test_api.py index c6c1adb274..976e0e268b 100644 --- a/mayan/apps/ocr/tests/test_api.py +++ b/mayan/apps/ocr/tests/test_api.py @@ -12,7 +12,7 @@ from ..permissions import ( from .literals import TEST_DOCUMENT_CONTENT -class OCRAPITestCase(DocumentTestMixin, BaseAPITestCase): +class OCRSubmitAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_ocr_submit_view(self): return self.post( viewname='rest_api:document-ocr-submit', @@ -28,7 +28,7 @@ class OCRAPITestCase(DocumentTestMixin, BaseAPITestCase): #TODO: mock OCR here def test_submit_document_with_access(self): self.grant_access( - permission=permission_ocr_document, obj=self.document + obj=self.document, permission=permission_ocr_document ) response = self._request_document_ocr_submit_view() self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) @@ -52,13 +52,15 @@ class OCRAPITestCase(DocumentTestMixin, BaseAPITestCase): def test_submit_document_version_with_access(self): self.grant_access( - permission=permission_ocr_document, obj=self.document + obj=self.document, permission=permission_ocr_document ) response = self._request_document_version_ocr_submit_view() self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) self.assertTrue(hasattr(self.document.pages.first(), 'ocr_content')) + +class OCRContentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_content_view(self): return self.get( viewname='rest_api:document-ocr-content', @@ -68,13 +70,14 @@ class OCRAPITestCase(DocumentTestMixin, BaseAPITestCase): ) def test_get_document_content_no_permission(self): + self.document.submit_for_ocr() response = self._request_document_content_view() self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_get_document_content_with_access(self): self.document.submit_for_ocr() self.grant_access( - permission=permission_ocr_content_view, obj=self.document + obj=self.document, permission=permission_ocr_content_view ) response = self._request_document_content_view() @@ -95,14 +98,15 @@ class OCRAPITestCase(DocumentTestMixin, BaseAPITestCase): } ) - def test_get_document_version_page_content_no_permission(self): + def test_get_document_page_content_no_permission(self): + self.document.submit_for_ocr() response = self._request_document_page_content_view() self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - def test_get_document_version_page_content_with_access(self): + def test_get_document_page_content_with_access(self): self.document.submit_for_ocr() self.grant_access( - permission=permission_ocr_content_view, obj=self.document + obj=self.document, permission=permission_ocr_content_view ) response = self._request_document_page_content_view() @@ -122,14 +126,15 @@ class OCRAPITestCase(DocumentTestMixin, BaseAPITestCase): } ) - def test_get_document_version_version_content_no_permission(self): + def test_get_document_version_content_no_permission(self): + self.document.submit_for_ocr() response = self._request_document_version_content_view() self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - def test_get_document_version_version_content_with_access(self): + def test_get_document_version_content_with_access(self): self.document.submit_for_ocr() self.grant_access( - permission=permission_ocr_content_view, obj=self.document + obj=self.document, permission=permission_ocr_content_view ) response = self._request_document_version_content_view() diff --git a/mayan/apps/ocr/tests/test_views.py b/mayan/apps/ocr/tests/test_views.py index 7e62121b8c..033fd01421 100644 --- a/mayan/apps/ocr/tests/test_views.py +++ b/mayan/apps/ocr/tests/test_views.py @@ -79,7 +79,7 @@ class OCRViewsTestCase(GenericDocumentViewTestCase): def test_document_submit_view_with_access(self): self.grant_access( - permission=permission_ocr_document, obj=self.document + obj=self.document, permission=permission_ocr_document ) self._request_document_submit_view() self.assertTrue( diff --git a/mayan/apps/ocr/urls.py b/mayan/apps/ocr/urls.py index cb4caf2b12..a6d07ab1ce 100644 --- a/mayan/apps/ocr/urls.py +++ b/mayan/apps/ocr/urls.py @@ -58,11 +58,11 @@ urlpatterns = [ api_router_entries = ( { 'prefix': r'documents', - 'viewset': DocumentOCRAPIViewSet, 'basename': 'document' + 'viewset': DocumentOCRAPIViewSet, 'basename': 'document-ocr' }, { 'prefix': r'documents/(?P\d+)/document_versions', - 'viewset': DocumentVersionOCRAPIViewSet, 'basename': 'document_version' + 'viewset': DocumentVersionOCRAPIViewSet, 'basename': 'document_version-ocr' }, { 'prefix': r'documents/(?P\d+)/document_versions/(?P\d+)/document_pages', diff --git a/mayan/apps/ocr/views.py b/mayan/apps/ocr/views.py index addaff1ca3..123fbec28b 100644 --- a/mayan/apps/ocr/views.py +++ b/mayan/apps/ocr/views.py @@ -4,13 +4,13 @@ from django.contrib import messages from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy -from django.utils.translation import ugettext_lazy as _, ungettext +from django.utils.translation import ugettext_lazy as _ -from mayan.apps.acls.models import AccessControlList from mayan.apps.common.generics import ( FormView, MultipleObjectConfirmActionView, SingleObjectDetailView, SingleObjectDownloadView, SingleObjectEditView, SingleObjectListView ) +from mayan.apps.common.mixins import ExternalObjectMixin from mayan.apps.documents.forms import DocumentTypeFilteredSelectForm from mayan.apps.documents.mixins import RecentDocumentMixin from mayan.apps.documents.models import Document, DocumentPage, DocumentType @@ -35,7 +35,7 @@ class DocumentOCRContentView(RecentDocumentMixin, SingleObjectDetailView): 'document': self.get_object(), 'hide_labels': True, 'object': self.get_object(), - 'title': _('OCR result for document: %s') % self.get_object(), + 'title': _('OCR result for document: %s.') % self.get_object(), } @@ -65,7 +65,7 @@ class DocumentOCRErrorsListView(SingleObjectListView): return { 'hide_object': True, 'object': self.get_document(), - 'title': _('OCR errors for document: %s') % self.get_document(), + 'title': _('OCR errors for document: %s.') % self.get_document(), } def get_object_list(self): @@ -82,7 +82,7 @@ class DocumentPageOCRContentView(RecentDocumentMixin, SingleObjectDetailView): return { 'hide_labels': True, 'object': self.object, - 'title': _('OCR result for document page: %s') % self.object, + 'title': _('OCR result for document page: %s.') % self.object, } def get_recent_document(self): @@ -93,49 +93,34 @@ class DocumentSubmitView(MultipleObjectConfirmActionView): model = Document object_permission = permission_ocr_document pk_url_kwarg = 'document_id' - success_message_singular = '%(count)d document submitted to the OCR queue.' - success_message_plural = '%(count)d documents submitted to the OCR queue.' - - def get_extra_context(self): - queryset = self.get_queryset() - - result = { - 'title': ungettext( - singular='Submit the selected document to the OCR queue?', - plural='Submit the selected documents to the OCR queue?', - number=queryset.count() - ) - } - - return result + success_message_single = _('Document "%(object)s" added to the OCR queue.') + success_message_singular = _('%(count)d document submitted to the OCR queue.') + success_message_plural = _('%(count)d documents submitted to the OCR queue.') + title_single = _('Submit the document "%(object)s" to the OCR queue.') + title_singular = _('Submit the selected document to the OCR queue.') + title_plural = _('Submit the selected documents to the OCR queue.') def object_action(self, form, instance): instance.submit_for_ocr() -class DocumentTypeSettingsEditView(SingleObjectEditView): +class DocumentTypeSettingsEditView(ExternalObjectMixin, SingleObjectEditView): + external_object_class = DocumentType + external_object_permission = permission_document_type_ocr_setup + external_object_pk_url_kwarg = 'document_type_id' fields = ('auto_ocr',) - object_permission = permission_document_type_ocr_setup post_action_redirect = reverse_lazy( viewname='documents:document_type_list' ) def get_document_type(self): - queryset = AccessControlList.objects.restrict_queryset( - permission=permission_document_type_ocr_setup, - queryset=DocumentType.objects.all(), - user=self.request.user - ) - - return get_object_or_404( - klass=queryset, pk=self.kwargs['document_type_id'] - ) + return self.external_object def get_extra_context(self): return { 'object': self.get_document_type(), 'title': _( - 'Edit OCR settings for document type: %s' + 'Edit OCR settings for document type: %s.' ) % self.get_document_type() } @@ -145,7 +130,7 @@ class DocumentTypeSettingsEditView(SingleObjectEditView): class DocumentTypeSubmitView(FormView): extra_context = { - 'title': _('Submit all documents of a type for OCR') + 'title': _('Submit all documents of a type for OCR.') } form_class = DocumentTypeFilteredSelectForm post_action_redirect = reverse_lazy(viewname='common:tools_list') @@ -178,7 +163,7 @@ class DocumentTypeSubmitView(FormView): class EntryListView(SingleObjectListView): extra_context = { 'hide_object': True, - 'title': _('OCR errors'), + 'title': _('OCR errors.'), } view_permission = permission_document_type_ocr_setup