Add link and view to show the content of parsed text for each document page.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
* Remove newlines from the index name levels before using them as FUSE
|
* Remove newlines from the index name levels before using them as FUSE
|
||||||
directories.
|
directories.
|
||||||
* Fixed duplicated FUSE directory removal.
|
* Fixed duplicated FUSE directory removal.
|
||||||
|
* Add link and view to show the parsed content of each document page.
|
||||||
|
|
||||||
3.1.4 (2018-10-4)
|
3.1.4 (2018-10-4)
|
||||||
=================
|
=================
|
||||||
|
|||||||
@@ -29,10 +29,11 @@ from .handlers import (
|
|||||||
handler_parse_document_version
|
handler_parse_document_version
|
||||||
)
|
)
|
||||||
from .links import (
|
from .links import (
|
||||||
link_document_content, link_document_content_download,
|
link_document_content, link_document_page_content,
|
||||||
link_document_parsing_errors_list, link_document_submit_multiple,
|
link_document_content_download, link_document_parsing_errors_list,
|
||||||
link_document_submit, link_document_type_parsing_settings,
|
link_document_submit_multiple, link_document_submit,
|
||||||
link_document_type_submit, link_error_list
|
link_document_type_parsing_settings, link_document_type_submit,
|
||||||
|
link_error_list
|
||||||
)
|
)
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_content_view, permission_document_type_parsing_setup,
|
permission_content_view, permission_document_type_parsing_setup,
|
||||||
@@ -76,6 +77,9 @@ class DocumentParsingApp(MayanAppConfig):
|
|||||||
Document = apps.get_model(
|
Document = apps.get_model(
|
||||||
app_label='documents', model_name='Document'
|
app_label='documents', model_name='Document'
|
||||||
)
|
)
|
||||||
|
DocumentPage = apps.get_model(
|
||||||
|
app_label='documents', model_name='DocumentPage'
|
||||||
|
)
|
||||||
DocumentType = apps.get_model(
|
DocumentType = apps.get_model(
|
||||||
app_label='documents', model_name='DocumentType'
|
app_label='documents', model_name='DocumentType'
|
||||||
)
|
)
|
||||||
@@ -154,6 +158,9 @@ class DocumentParsingApp(MayanAppConfig):
|
|||||||
menu_facet.bind_links(
|
menu_facet.bind_links(
|
||||||
links=(link_document_content,), sources=(Document,)
|
links=(link_document_content,), sources=(Document,)
|
||||||
)
|
)
|
||||||
|
menu_facet.bind_links(
|
||||||
|
links=(link_document_page_content,), sources=(DocumentPage,)
|
||||||
|
)
|
||||||
menu_multi_item.bind_links(
|
menu_multi_item.bind_links(
|
||||||
links=(link_document_submit_multiple,), sources=(Document,)
|
links=(link_document_submit_multiple,), sources=(Document,)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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):
|
class DocumentTypeSelectForm(forms.Form):
|
||||||
document_type = forms.ModelChoiceField(
|
document_type = forms.ModelChoiceField(
|
||||||
queryset=DocumentType.objects.none(), label=('Document type')
|
queryset=DocumentType.objects.none(), label=('Document type')
|
||||||
|
|||||||
@@ -19,6 +19,11 @@ link_document_content = Link(
|
|||||||
permissions=(permission_content_view,), text=_('Content'),
|
permissions=(permission_content_view,), text=_('Content'),
|
||||||
view='document_parsing:document_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(
|
link_document_parsing_errors_list = Link(
|
||||||
args='resolved_object.id', icon_class=icon_document_parsing_errors_list,
|
args='resolved_object.id', icon_class=icon_document_parsing_errors_list,
|
||||||
permissions=(permission_content_view,), text=_('Parsing errors'),
|
permissions=(permission_content_view,), text=_('Parsing errors'),
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ class DocumentContentViewsTestCase(GenericDocumentViewTestCase):
|
|||||||
super(DocumentContentViewsTestCase, self).setUp()
|
super(DocumentContentViewsTestCase, self).setUp()
|
||||||
self.login_user()
|
self.login_user()
|
||||||
|
|
||||||
def _document_content_view(self):
|
def _request_document_content_view(self):
|
||||||
return self.get(
|
return self.get(
|
||||||
'document_parsing:document_content', args=(self.document.pk,)
|
'document_parsing:document_content', args=(self.document.pk,)
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_document_content_view_no_permissions(self):
|
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)
|
self.assertEqual(response.status_code, 403)
|
||||||
|
|
||||||
@@ -39,7 +39,29 @@ class DocumentContentViewsTestCase(GenericDocumentViewTestCase):
|
|||||||
self.grant_access(
|
self.grant_access(
|
||||||
permission=permission_content_view, obj=self.document
|
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(
|
self.assertContains(
|
||||||
response, 'Mayan EDMS Documentation', status_code=200
|
response, 'Mayan EDMS Documentation', status_code=200
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ from django.conf.urls import url
|
|||||||
from .api_views import APIDocumentPageContentView
|
from .api_views import APIDocumentPageContentView
|
||||||
from .views import (
|
from .views import (
|
||||||
DocumentContentView, DocumentContentDownloadView,
|
DocumentContentView, DocumentContentDownloadView,
|
||||||
DocumentParsingErrorsListView, DocumentSubmitView,
|
DocumentPageContentView, DocumentParsingErrorsListView,
|
||||||
DocumentTypeSettingsEditView, DocumentTypeSubmitView, ParseErrorListView
|
DocumentSubmitView, DocumentTypeSettingsEditView, DocumentTypeSubmitView,
|
||||||
|
ParseErrorListView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -14,6 +15,10 @@ urlpatterns = [
|
|||||||
r'^documents/(?P<pk>\d+)/content/$', DocumentContentView.as_view(),
|
r'^documents/(?P<pk>\d+)/content/$', DocumentContentView.as_view(),
|
||||||
name='document_content'
|
name='document_content'
|
||||||
),
|
),
|
||||||
|
url(
|
||||||
|
r'^documents/pages/(?P<pk>\d+)/content/$',
|
||||||
|
DocumentPageContentView.as_view(), name='document_page_content'
|
||||||
|
),
|
||||||
url(
|
url(
|
||||||
r'^documents/(?P<pk>\d+)/content/download/$',
|
r'^documents/(?P<pk>\d+)/content/download/$',
|
||||||
DocumentContentDownloadView.as_view(), name='document_content_download'
|
DocumentContentDownloadView.as_view(), name='document_content_download'
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ from common.generics import (
|
|||||||
FormView, MultipleObjectConfirmActionView, SingleObjectDetailView,
|
FormView, MultipleObjectConfirmActionView, SingleObjectDetailView,
|
||||||
SingleObjectDownloadView, SingleObjectEditView, SingleObjectListView
|
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 .models import DocumentVersionParseError
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_content_view, permission_document_type_parsing_setup,
|
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):
|
class DocumentParsingErrorsListView(SingleObjectListView):
|
||||||
view_permission = permission_content_view
|
view_permission = permission_content_view
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user