diff --git a/HISTORY.rst b/HISTORY.rst index b32e84ee12..e5b851be22 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,7 @@ * Remove newlines from the index name levels before using them as FUSE directories. * Fixed duplicated FUSE directory removal. +* Add link and view to show the parsed content of each document page. 3.1.4 (2018-10-4) ================= diff --git a/mayan/apps/document_parsing/apps.py b/mayan/apps/document_parsing/apps.py index 7a3acb8fe1..c410ba2237 100644 --- a/mayan/apps/document_parsing/apps.py +++ b/mayan/apps/document_parsing/apps.py @@ -29,10 +29,11 @@ from .handlers import ( handler_parse_document_version ) from .links import ( - link_document_content, link_document_content_download, - link_document_parsing_errors_list, link_document_submit_multiple, - link_document_submit, link_document_type_parsing_settings, - link_document_type_submit, link_error_list + link_document_content, link_document_page_content, + link_document_content_download, link_document_parsing_errors_list, + link_document_submit_multiple, link_document_submit, + link_document_type_parsing_settings, link_document_type_submit, + link_error_list ) from .permissions import ( permission_content_view, permission_document_type_parsing_setup, @@ -76,6 +77,9 @@ class DocumentParsingApp(MayanAppConfig): Document = apps.get_model( app_label='documents', model_name='Document' ) + DocumentPage = apps.get_model( + app_label='documents', model_name='DocumentPage' + ) DocumentType = apps.get_model( app_label='documents', model_name='DocumentType' ) @@ -154,6 +158,9 @@ class DocumentParsingApp(MayanAppConfig): menu_facet.bind_links( links=(link_document_content,), sources=(Document,) ) + menu_facet.bind_links( + links=(link_document_page_content,), sources=(DocumentPage,) + ) menu_multi_item.bind_links( links=(link_document_submit_multiple,), sources=(Document,) ) diff --git a/mayan/apps/document_parsing/forms.py b/mayan/apps/document_parsing/forms.py index 0a7fe44a5a..5c732a6bcc 100644 --- a/mayan/apps/document_parsing/forms.py +++ b/mayan/apps/document_parsing/forms.py @@ -57,6 +57,33 @@ class DocumentContentForm(forms.Form): ) +class DocumentPageContentForm(forms.Form): + contents = forms.CharField( + label=_('Contents'), + widget=TextAreaDiv( + attrs={ + 'class': 'text_area_div full-height', + 'data-height-difference': 360 + } + ) + ) + + def __init__(self, *args, **kwargs): + document_page = kwargs.pop('instance', None) + super(DocumentPageContentForm, self).__init__(*args, **kwargs) + content = '' + self.fields['contents'].initial = '' + + try: + page_content = document_page.content.content + except DocumentPageContent.DoesNotExist: + pass + else: + content = conditional_escape(force_text(page_content)) + + self.fields['contents'].initial = mark_safe(content) + + class DocumentTypeSelectForm(forms.Form): document_type = forms.ModelChoiceField( queryset=DocumentType.objects.none(), label=('Document type') diff --git a/mayan/apps/document_parsing/links.py b/mayan/apps/document_parsing/links.py index 820843d848..92f8ab9ba6 100644 --- a/mayan/apps/document_parsing/links.py +++ b/mayan/apps/document_parsing/links.py @@ -19,6 +19,11 @@ link_document_content = Link( permissions=(permission_content_view,), text=_('Content'), view='document_parsing:document_content', ) +link_document_page_content = Link( + args='resolved_object.id', icon_class=icon_document_content, + permissions=(permission_content_view,), text=_('Content'), + view='document_parsing:document_page_content', +) link_document_parsing_errors_list = Link( args='resolved_object.id', icon_class=icon_document_parsing_errors_list, permissions=(permission_content_view,), text=_('Parsing errors'), diff --git a/mayan/apps/document_parsing/tests/test_views.py b/mayan/apps/document_parsing/tests/test_views.py index a95427fad2..9c33a1fb6a 100644 --- a/mayan/apps/document_parsing/tests/test_views.py +++ b/mayan/apps/document_parsing/tests/test_views.py @@ -25,13 +25,13 @@ class DocumentContentViewsTestCase(GenericDocumentViewTestCase): super(DocumentContentViewsTestCase, self).setUp() self.login_user() - def _document_content_view(self): + def _request_document_content_view(self): return self.get( 'document_parsing:document_content', args=(self.document.pk,) ) def test_document_content_view_no_permissions(self): - response = self._document_content_view() + response = self._request_document_content_view() self.assertEqual(response.status_code, 403) @@ -39,7 +39,29 @@ class DocumentContentViewsTestCase(GenericDocumentViewTestCase): self.grant_access( permission=permission_content_view, obj=self.document ) - response = self._document_content_view() + response = self._request_document_content_view() + + self.assertContains( + response, 'Mayan EDMS Documentation', status_code=200 + ) + + def _request_document_page_content_view(self): + return self.get( + 'document_parsing:document_page_content', args=( + self.document.pages.first().pk, + ) + ) + + def test_document_page_content_view_no_permissions(self): + response = self._request_document_page_content_view() + + self.assertEqual(response.status_code, 403) + + def test_document_page_content_view_with_access(self): + self.grant_access( + permission=permission_content_view, obj=self.document + ) + response = self._request_document_page_content_view() self.assertContains( response, 'Mayan EDMS Documentation', status_code=200 diff --git a/mayan/apps/document_parsing/urls.py b/mayan/apps/document_parsing/urls.py index 3b91cbe7f5..08e5f3c289 100644 --- a/mayan/apps/document_parsing/urls.py +++ b/mayan/apps/document_parsing/urls.py @@ -5,8 +5,9 @@ from django.conf.urls import url from .api_views import APIDocumentPageContentView from .views import ( DocumentContentView, DocumentContentDownloadView, - DocumentParsingErrorsListView, DocumentSubmitView, - DocumentTypeSettingsEditView, DocumentTypeSubmitView, ParseErrorListView + DocumentPageContentView, DocumentParsingErrorsListView, + DocumentSubmitView, DocumentTypeSettingsEditView, DocumentTypeSubmitView, + ParseErrorListView ) urlpatterns = [ @@ -14,6 +15,10 @@ urlpatterns = [ r'^documents/(?P\d+)/content/$', DocumentContentView.as_view(), name='document_content' ), + url( + r'^documents/pages/(?P\d+)/content/$', + DocumentPageContentView.as_view(), name='document_page_content' + ), url( r'^documents/(?P\d+)/content/download/$', DocumentContentDownloadView.as_view(), name='document_content_download' diff --git a/mayan/apps/document_parsing/views.py b/mayan/apps/document_parsing/views.py index fa025c02de..d49ebb74ca 100644 --- a/mayan/apps/document_parsing/views.py +++ b/mayan/apps/document_parsing/views.py @@ -10,9 +10,11 @@ from common.generics import ( FormView, MultipleObjectConfirmActionView, SingleObjectDetailView, SingleObjectDownloadView, SingleObjectEditView, SingleObjectListView ) -from documents.models import Document, DocumentType +from documents.models import Document, DocumentPage, DocumentType -from .forms import DocumentContentForm, DocumentTypeSelectForm +from .forms import ( + DocumentContentForm, DocumentPageContentForm, DocumentTypeSelectForm +) from .models import DocumentVersionParseError from .permissions import ( permission_content_view, permission_document_type_parsing_setup, @@ -55,6 +57,28 @@ class DocumentContentDownloadView(SingleObjectDownloadView): ) +class DocumentPageContentView(SingleObjectDetailView): + form_class = DocumentPageContentForm + model = DocumentPage + object_permission = permission_content_view + + def dispatch(self, request, *args, **kwargs): + result = super(DocumentPageContentView, self).dispatch( + request, *args, **kwargs + ) + self.get_object().document.add_as_recent_document_for_user( + request.user + ) + return result + + def get_extra_context(self): + return { + 'hide_labels': True, + 'object': self.get_object(), + 'title': _('Content for document page: %s') % self.get_object(), + } + + class DocumentParsingErrorsListView(SingleObjectListView): view_permission = permission_content_view