diff --git a/HISTORY.rst b/HISTORY.rst index 546e266f16..48dd18c87a 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -121,6 +121,10 @@ - Add support for blocking the changing of password for specify users. - Add support for changing the HOME_VIEW, LOGIN_URL and LOGIN_REDIRECT_URL from the settings view. +- Instead of the document content view, the document type parsing setup + permissions is now required to view the parsing error list. +- The document type parsing setup permission can now be granted for + individual document types. 3.0.3 (2018-08-17) ================== diff --git a/mayan/apps/document_parsing/apps.py b/mayan/apps/document_parsing/apps.py index 0c1f151a98..8140e881c0 100644 --- a/mayan/apps/document_parsing/apps.py +++ b/mayan/apps/document_parsing/apps.py @@ -76,11 +76,15 @@ class DocumentParsingApp(MayanAppConfig): DocumentType = apps.get_model( app_label='documents', model_name='DocumentType' ) + DocumentTypeSettings = self.get_model( + model_name='DocumentTypeSettings' + ) DocumentVersion = apps.get_model( app_label='documents', model_name='DocumentVersion' ) - - DocumentVersionParseError = self.get_model('DocumentVersionParseError') + DocumentVersionParseError = self.get_model( + model_name='DocumentVersionParseError' + ) Document.add_to_class('submit_for_parsing', document_parsing_submit) Document.add_to_class( @@ -103,7 +107,9 @@ class DocumentParsingApp(MayanAppConfig): permission_document_type_parsing_setup, ) ) - + ModelPermission.register_inheritance( + model=DocumentTypeSettings, related='document_type', + ) SourceColumn( source=DocumentVersionParseError, label=_('Document'), func=lambda context: document_link(context['object'].document_version.document) diff --git a/mayan/apps/document_parsing/tests/test_views.py b/mayan/apps/document_parsing/tests/test_views.py index aeb55599e1..a95427fad2 100644 --- a/mayan/apps/document_parsing/tests/test_views.py +++ b/mayan/apps/document_parsing/tests/test_views.py @@ -7,7 +7,9 @@ from documents.tests import ( TEST_DOCUMENT_PATH ) -from ..permissions import permission_content_view +from ..permissions import ( + permission_content_view, permission_document_type_parsing_setup +) from ..utils import get_document_content @@ -33,28 +35,32 @@ class DocumentContentViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) - def test_document_content_view_with_permission(self): - self.grant_permission(permission=permission_content_view) + def test_document_content_view_with_access(self): + self.grant_access( + permission=permission_content_view, obj=self.document + ) response = self._document_content_view() self.assertContains( response, 'Mayan EDMS Documentation', status_code=200 ) - def test_document_parsing_download_view_no_permission(self): - response = self.get( - 'document_parsing:document_content_download', args=(self.document.pk,) + def _request_document_content_download_view(self): + return self.get( + viewname='document_parsing:document_content_download', + args=(self.document.pk,) ) + def test_document_parsing_download_view_no_permission(self): + response = self._request_document_content_download_view() self.assertEqual(response.status_code, 403) - def test_download_view_with_permission(self): + def test_download_view_with_access(self): self.expected_content_type = 'application/octet-stream; charset=utf-8' - - self.grant_permission(permission=permission_content_view) - response = self.get( - 'document_parsing:document_content_download', args=(self.document.pk,) + self.grant_access( + permission=permission_content_view, obj=self.document ) + response = self._request_document_content_download_view() self.assertEqual(response.status_code, 200) @@ -63,3 +69,23 @@ class DocumentContentViewsTestCase(GenericDocumentViewTestCase): ''.join(get_document_content(document=self.document)) ), ) + + def test_document_type_parsing_settings_view_no_permission(self): + response = self.get( + viewname='document_parsing:document_type_parsing_settings', + args=(self.document.document_type.pk,) + ) + + self.assertEqual(response.status_code, 403) + + def test_document_type_parsing_settings_view_with_access(self): + self.grant_access( + permission=permission_document_type_parsing_setup, + obj=self.document.document_type + ) + response = self.get( + viewname='document_parsing:document_type_parsing_settings', + args=(self.document.document_type.pk,) + ) + + self.assertEqual(response.status_code, 200) diff --git a/mayan/apps/document_parsing/views.py b/mayan/apps/document_parsing/views.py index 901b354dfd..fa025c02de 100644 --- a/mayan/apps/document_parsing/views.py +++ b/mayan/apps/document_parsing/views.py @@ -3,7 +3,7 @@ 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 +from django.urls import reverse, reverse_lazy from django.utils.translation import ugettext_lazy as _, ungettext from common.generics import ( @@ -115,20 +115,23 @@ class DocumentSubmitView(MultipleObjectConfirmActionView): class DocumentTypeSettingsEditView(SingleObjectEditView): fields = ('auto_parsing',) - view_permission = permission_document_type_parsing_setup + object_permission = permission_document_type_parsing_setup + post_action_redirect = reverse_lazy('documents:document_type_list') - def get_object(self, queryset=None): - return get_object_or_404( - DocumentType, pk=self.kwargs['pk'] - ).parsing_settings + def get_document_type(self): + return get_object_or_404(DocumentType, pk=self.kwargs['pk']) def get_extra_context(self): return { + 'object': self.get_document_type(), 'title': _( 'Edit parsing settings for document type: %s' - ) % self.get_object().document_type + ) % self.get_document_type() } + def get_object(self, queryset=None): + return self.get_document_type().parsing_settings + class DocumentTypeSubmitView(FormView): form_class = DocumentTypeSelectForm @@ -136,14 +139,6 @@ class DocumentTypeSubmitView(FormView): 'title': _('Submit all documents of a type for parsing') } - def get_form_extra_kwargs(self): - return { - 'user': self.request.user - } - - def get_post_action_redirect(self): - return reverse('common:tools_list') - def form_valid(self, form): count = 0 for document in form.cleaned_data['document_type'].documents.all(): @@ -162,13 +157,21 @@ class DocumentTypeSubmitView(FormView): return HttpResponseRedirect(self.get_success_url()) + def get_form_extra_kwargs(self): + return { + 'user': self.request.user + } + + def get_post_action_redirect(self): + return reverse('common:tools_list') + class ParseErrorListView(SingleObjectListView): extra_context = { 'hide_object': True, 'title': _('Parsing errors'), } - view_permission = permission_content_view + view_permission = permission_document_type_parsing_setup def get_object_list(self): return DocumentVersionParseError.objects.all()