diff --git a/HISTORY.rst b/HISTORY.rst index a779e012f5..faa682e5b1 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,10 @@ - Hide the multi item selection help text on mobile screens. - Update Django to version 1.11.26. - Remove body spacer HTML and JavaScript. Not needed with the new UI. +- Change the required permission to view the document parsing error + from "View document parsed content" to "Parse document". This way only + users with the access to affect the parsed content are the only ones + that can view what errors occurred during parsing. 3.3 (2019-12-03) ================ diff --git a/mayan/apps/document_parsing/links.py b/mayan/apps/document_parsing/links.py index 2cfe95fab9..8d5aadcbb5 100644 --- a/mayan/apps/document_parsing/links.py +++ b/mayan/apps/document_parsing/links.py @@ -79,6 +79,6 @@ link_document_type_submit = Link( ) link_error_list = Link( icon_class_path='mayan.apps.document_parsing.icons.icon_link_error_list', - permissions=(permission_content_view,), text=_('Parsing errors'), + permissions=(permission_parse_document,), text=_('Parsing errors'), view='document_parsing:error_list' ) diff --git a/mayan/apps/document_parsing/tests/test_views.py b/mayan/apps/document_parsing/tests/test_views.py index 423a11adcd..9a62b42530 100644 --- a/mayan/apps/document_parsing/tests/test_views.py +++ b/mayan/apps/document_parsing/tests/test_views.py @@ -43,6 +43,13 @@ class DocumentContentViewTestMixin(object): } ) + def _request_test_document_parsing_error_list_view(self): + return self.get( + viewname='document_parsing:document_parsing_error_list', kwargs={ + 'pk': self.test_document.pk, + } + ) + @override_settings(DOCUMENT_PARSING_AUTO_PARSING=True) class DocumentContentViewsTestCase( @@ -97,7 +104,7 @@ class DocumentContentViewsTestCase( def test_document_page_content_view_with_access(self): self.grant_access( - permission=permission_content_view, obj=self.test_document + obj=self.test_document, permission=permission_content_view ) response = self._request_test_document_page_content_view() @@ -109,10 +116,12 @@ class DocumentContentViewsTestCase( response = self._request_test_document_content_download_view() self.assertEqual(response.status_code, 403) - def test_download_view_with_access(self): - self.expected_content_types = ('application/octet-stream; charset=utf-8',) + def test_document_parsing_download_view_with_access(self): + self.expected_content_types = ( + 'application/octet-stream; charset=utf-8', + ) self.grant_access( - permission=permission_content_view, obj=self.test_document + obj=self.test_document, permission=permission_content_view ) response = self._request_test_document_content_download_view() @@ -124,6 +133,18 @@ class DocumentContentViewsTestCase( ), ) + def test_document_parsing_error_list_view_no_permission(self): + response = self._request_test_document_parsing_error_list_view() + self.assertEqual(response.status_code, 404) + + def test_document_parsing_error_list_view_with_access(self): + self.grant_access( + obj=self.test_document, permission=permission_parse_document + ) + + response = self._request_test_document_parsing_error_list_view() + self.assertEqual(response.status_code, 200) + class DocumentTypeContentViewsTestMixin(object): def _request_test_document_type_parsing_settings(self): @@ -144,19 +165,17 @@ class DocumentTypeContentViewsTestCase( def test_document_type_parsing_settings_view_with_access(self): self.grant_access( - permission=permission_document_type_parsing_setup, - obj=self.test_document_type + obj=self.test_document_type, + permission=permission_document_type_parsing_setup ) response = self._request_test_document_type_parsing_settings() self.assertEqual(response.status_code, 200) -class DocumentContentToolsViewsTestCase(GenericDocumentViewTestCase): - _skip_file_descriptor_test = True - - # Ensure we use a PDF file - test_document_filename = TEST_HYBRID_DOCUMENT +class DocumentContentToolsViewsTestMixin(object): + def _request_document_parsing_error_list_view(self): + return self.get(viewname='document_parsing:error_list') def _request_document_parsing_tool_view(self): return self.post( @@ -165,10 +184,33 @@ class DocumentContentToolsViewsTestCase(GenericDocumentViewTestCase): } ) + +class DocumentContentToolsViewsTestCase( + DocumentContentToolsViewsTestMixin, GenericDocumentViewTestCase +): + _skip_file_descriptor_test = True + auto_upload_document = False + + # Ensure we use a PDF file + test_document_filename = TEST_HYBRID_DOCUMENT + def _get_document_content(self): - return ''.join(list(get_document_content(document=self.test_document))) + return ''.join( + list(get_document_content(document=self.test_document)) + ) + + def test_document_parsing_error_list_view_no_permission(self): + response = self._request_document_parsing_error_list_view() + self.assertEqual(response.status_code, 403) + + def test_document_parsing_error_list_view_with_permission(self): + self.grant_permission(permission=permission_parse_document) + + response = self._request_document_parsing_error_list_view() + self.assertEqual(response.status_code, 200) def test_document_parsing_tool_view_no_permission(self): + self.upload_document() response = self._request_document_parsing_tool_view() self.assertEqual(response.status_code, 200) @@ -184,6 +226,8 @@ class DocumentContentToolsViewsTestCase(GenericDocumentViewTestCase): def test_document_parsing_tool_view_with_permission(self): self.grant_permission(permission=permission_parse_document) + self.upload_document() + response = self._request_document_parsing_tool_view() self.assertEqual(response.status_code, 302) diff --git a/mayan/apps/document_parsing/views.py b/mayan/apps/document_parsing/views.py index de9cb3ef0b..286da29787 100644 --- a/mayan/apps/document_parsing/views.py +++ b/mayan/apps/document_parsing/views.py @@ -2,7 +2,6 @@ from __future__ import absolute_import, unicode_literals 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 @@ -107,23 +106,23 @@ class DocumentPageContentView(SingleObjectDetailView): } -class DocumentParsingErrorsListView(SingleObjectListView): - view_permission = permission_content_view - - def get_document(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) +class DocumentParsingErrorsListView( + ExternalObjectMixin, SingleObjectListView +): + external_object_class = Document + external_object_permission = permission_parse_document def get_extra_context(self): return { 'hide_object': True, - 'object': self.get_document(), + 'object': self.external_object, 'title': _( 'Parsing errors for document: %s' - ) % self.get_document(), + ) % self.external_object, } def get_source_queryset(self): - return self.get_document().latest_version.parsing_errors.all() + return self.external_object.latest_version.parsing_errors.all() class DocumentSubmitView(MultipleObjectConfirmActionView): @@ -224,7 +223,7 @@ class ParseErrorListView(SingleObjectListView): 'hide_object': True, 'title': _('Parsing errors'), } - view_permission = permission_document_type_parsing_setup + view_permission = permission_parse_document def get_source_queryset(self): return DocumentVersionParseError.objects.all()