Files
mayan-edms/mayan/apps/documents/views/document_version_views.py
Roberto Rosario 0699ad0556 Add support for new document page structure
Documents now have their own dedicated DocumentPage
submodel. The old DocumentPage is now called DocumentVersionPage.
This allows mappings between document pages and document version
pages, allowing renumbering, appending pages.
DocumentPages have a content_object to map them to any other
object. For now they only map to DocumentVersionPages.
New option added to the version upload form to append the
pages of the new version.
A new view was added to just append new pages with wraps the
new document version upload form and hides the append pages
checkbox set to True.
Add a new action, reset_pages to reset the pages of the
document to those of the latest version.

Missing: appending tests, checks for proper content_object in OCR and
document parsing.

Author: Roberto Rosario <roberto.rosario@mayan-edms.com>
Date:   Thu Oct 11 12:00:25 2019 -0400
2019-10-10 11:55:42 -04:00

210 lines
6.4 KiB
Python

from __future__ import absolute_import, unicode_literals
import logging
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _, ungettext
from mayan.apps.common.generics import (
ConfirmView, MultipleObjectConfirmActionView, SingleObjectDetailView,
SingleObjectListView
)
from mayan.apps.common.mixins import ExternalObjectMixin
from ..events import event_document_view
from ..forms import DocumentVersionDownloadForm, DocumentVersionPreviewForm
from ..models import Document, DocumentVersion
from ..permissions import (
permission_document_download, permission_document_tools,
permission_document_version_revert, permission_document_version_view
)
from ..tasks import task_update_page_count
from .document_views import DocumentDownloadFormView, DocumentDownloadView
__all__ = (
'DocumentVersionDownloadFormView', 'DocumentVersionDownloadView',
'DocumentVersionListView', 'DocumentVersionRevertView',
'DocumentVersionView'
)
logger = logging.getLogger(__name__)
class DocumentVersionDownloadFormView(DocumentDownloadFormView):
form_class = DocumentVersionDownloadForm
model = DocumentVersion
multiple_download_view = None
querystring_form_fields = (
'compressed', 'zip_filename', 'preserve_extension'
)
single_download_view = 'documents:document_version_download'
def get_extra_context(self):
result = super(
DocumentVersionDownloadFormView, self
).get_extra_context()
result.update({
'title': _('Download document version'),
})
return result
def get_document_queryset(self):
id_list = self.request.GET.get(
'id_list', self.request.POST.get('id_list', '')
)
if not id_list:
id_list = self.kwargs['pk']
return self.model.objects.filter(
pk__in=id_list.split(',')
)
class DocumentVersionDownloadView(DocumentDownloadView):
model = DocumentVersion
object_permission = permission_document_download
@staticmethod
def get_item_file(item):
return item.file
def get_encoding(self):
return self.get_object().encoding
def get_item_label(self, item):
preserve_extension = self.request.GET.get(
'preserve_extension', self.request.POST.get(
'preserve_extension', False
)
)
preserve_extension = preserve_extension == 'true' or preserve_extension == 'True'
return item.get_rendered_string(preserve_extension=preserve_extension)
def get_mimetype(self):
return self.get_object().mimetype
class DocumentVersionListView(ExternalObjectMixin, SingleObjectListView):
external_object_class = Document
external_object_permission = permission_document_version_view
external_object_pk_url_kwarg = 'pk'
def get_document(self):
document = self.external_object
document.add_as_recent_document_for_user(user=self.request.user)
return document
def get_extra_context(self):
return {
'hide_object': True,
'list_as_items': True,
'object': self.get_document(),
'table_cell_container_classes': 'td-container-thumbnail',
'title': _('Versions of document: %s') % self.get_document(),
}
def get_source_queryset(self):
return self.get_document().versions.order_by('-timestamp')
class DocumentVersionRevertView(ExternalObjectMixin, ConfirmView):
external_object_class = DocumentVersion
external_object_permission = permission_document_version_revert
external_object_pk_url_kwarg = 'pk'
def get_extra_context(self):
return {
'message': _(
'All later version after this one will be deleted too.'
),
'object': self.get_object().document,
'title': _('Revert to this version?'),
}
def get_object(self):
return self.external_object
def view_action(self):
try:
self.get_object().revert(_user=self.request.user)
messages.success(
message=_(
'Document version reverted successfully'
), request=self.request
)
except Exception as exception:
messages.error(
message=_('Error reverting document version; %s') % exception,
request=self.request
)
class DocumentVersionUpdatePageCountView(MultipleObjectConfirmActionView):
model = DocumentVersion
object_permission = permission_document_tools
success_message = _(
'%(count)d document version queued for page count recalculation'
)
success_message_plural = _(
'%(count)d documents version queued for page count recalculation'
)
def get_extra_context(self):
queryset = self.object_list
result = {
'title': ungettext(
singular='Recalculate the page count of the selected document version?',
plural='Recalculate the page count of the selected document versions?',
number=queryset.count()
)
}
if queryset.count() == 1:
result.update(
{
'object': queryset.first(),
'title': _(
'Recalculate the page count of the document version: %s?'
) % queryset.first()
}
)
return result
def object_action(self, form, instance):
task_update_page_count.apply_async(
kwargs={'version_id': instance.pk}
)
class DocumentVersionView(SingleObjectDetailView):
form_class = DocumentVersionPreviewForm
model = DocumentVersion
object_permission = permission_document_version_view
def dispatch(self, request, *args, **kwargs):
result = super(
DocumentVersionView, self
).dispatch(request, *args, **kwargs)
self.get_object().document.add_as_recent_document_for_user(
request.user
)
event_document_view.commit(
actor=request.user, target=self.get_object().document
)
return result
def get_extra_context(self):
return {
'hide_labels': True,
'object': self.get_object(),
'title': _('Preview of document version: %s') % self.get_object(),
}