Add support for appending pages

Add version upload form checkbox.
Add the append_pages keyword argument.

Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-10-10 02:40:25 -04:00
parent 03379ab8ec
commit ff03ea07ca
13 changed files with 48 additions and 28 deletions

View File

@@ -148,7 +148,7 @@ 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( menu_list_facet.bind_links(
links=(link_document_page_content,), sources=(DocumentPage,) links=(link_document_page_content,), sources=(DocumentPage,)
) )
menu_list_facet.bind_links( menu_list_facet.bind_links(

View File

@@ -17,6 +17,9 @@ icon_document_content_download = Icon(
icon_document_multiple_submit = Icon( icon_document_multiple_submit = Icon(
driver_name='fontawesome', symbol='font' driver_name='fontawesome', symbol='font'
) )
icon_document_page_content = Icon(
driver_name='fontawesome', symbol='font'
)
icon_document_submit = Icon( icon_document_submit = Icon(
driver_name='fontawesome', symbol='font' driver_name='fontawesome', symbol='font'
) )

View File

@@ -32,9 +32,15 @@ link_document_content_delete_multiple = Link(
text=_('Delete parsed content'), text=_('Delete parsed content'),
view='document_parsing:document_content_delete_multiple', view='document_parsing:document_content_delete_multiple',
) )
link_document_content_download = Link(
args='resolved_object.id',
icon_class_path='mayan.apps.document_parsing.icons.icon_document_content_download',
permissions=(permission_content_view,), text=_('Download content'),
view='document_parsing:document_content_download'
)
link_document_page_content = Link( link_document_page_content = Link(
args='resolved_object.id', conditional_disable=is_document_page_disabled, args='resolved_object.id', conditional_disable=is_document_page_disabled,
icon_class_path='mayan.apps.document_parsing.icons.icon_document_content', icon_class_path='mayan.apps.document_parsing.icons.icon_document_page_content',
permissions=(permission_content_view,), text=_('Content'), permissions=(permission_content_view,), text=_('Content'),
view='document_parsing:document_page_content' view='document_parsing:document_page_content'
) )
@@ -44,12 +50,6 @@ link_document_parsing_errors_list = Link(
permissions=(permission_content_view,), text=_('Parsing errors'), permissions=(permission_content_view,), text=_('Parsing errors'),
view='document_parsing:document_parsing_error_list' view='document_parsing:document_parsing_error_list'
) )
link_document_content_download = Link(
args='resolved_object.id',
icon_class_path='mayan.apps.document_parsing.icons.icon_document_content_download',
permissions=(permission_content_view,), text=_('Download content'),
view='document_parsing:document_content_download'
)
link_document_submit_multiple = Link( link_document_submit_multiple = Link(
icon_class_path='mayan.apps.document_parsing.icons.icon_document_submit', icon_class_path='mayan.apps.document_parsing.icons.icon_document_submit',
text=_('Submit for parsing'), text=_('Submit for parsing'),

View File

@@ -18,7 +18,7 @@ from .signals import post_document_version_parsing
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class DocumentPageContentManager(models.Manager): class DocumentVersionPageContentManager(models.Manager):
def delete_content_for(self, document, user=None): def delete_content_for(self, document, user=None):
with transaction.atomic(): with transaction.atomic():
for document_page in document.pages.all(): for document_page in document.pages.all():

View File

@@ -8,7 +8,9 @@ from mayan.apps.documents.models import (
DocumentPage, DocumentType, DocumentVersion, DocumentVersionPage DocumentPage, DocumentType, DocumentVersion, DocumentVersionPage
) )
from .managers import DocumentPageContentManager, DocumentTypeSettingsManager from .managers import (
DocumentVersionPageContentManager, DocumentTypeSettingsManager
)
class DocumentTypeSettings(models.Model): class DocumentTypeSettings(models.Model):
@@ -52,7 +54,7 @@ class DocumentVersionPageContent(models.Model):
), verbose_name=_('Content') ), verbose_name=_('Content')
) )
objects = DocumentPageContentManager() objects = DocumentVersionPageContentManager()
class Meta: class Meta:
verbose_name = _('Document version page content') verbose_name = _('Document version page content')

View File

@@ -178,7 +178,7 @@ class Document(models.Model):
return (self.uuid,) return (self.uuid,)
natural_key.dependencies = ['documents.DocumentType'] natural_key.dependencies = ['documents.DocumentType']
def new_version(self, file_object, comment=None, _user=None): def new_version(self, file_object, append_pages=False, comment=None, _user=None):
logger.info('Creating new document version for document: %s', self) logger.info('Creating new document version for document: %s', self)
DocumentVersion = apps.get_model( DocumentVersion = apps.get_model(
app_label='documents', model_name='DocumentVersion' app_label='documents', model_name='DocumentVersion'
@@ -187,7 +187,7 @@ class Document(models.Model):
document_version = DocumentVersion( document_version = DocumentVersion(
document=self, comment=comment or '', file=File(file_object) document=self, comment=comment or '', file=File(file_object)
) )
document_version.save(_user=_user) document_version.save(append_pages=append_pages, _user=_user)
logger.info('New document version queued for document: %s', self) logger.info('New document version queued for document: %s', self)

View File

@@ -274,6 +274,7 @@ class DocumentVersion(models.Model):
Overloaded save method that updates the document version's checksum, Overloaded save method that updates the document version's checksum,
mimetype, and page count when created mimetype, and page count when created
""" """
append_pages = kwargs.pop('append_pages', False)
user = kwargs.pop('_user', None) user = kwargs.pop('_user', None)
new_document_version = not self.pk new_document_version = not self.pk
@@ -293,7 +294,7 @@ class DocumentVersion(models.Model):
# Only do this for new documents # Only do this for new documents
self.update_checksum(save=False) self.update_checksum(save=False)
self.update_mimetype(save=False) self.update_mimetype(save=False)
self.save() self.save(append_pages=append_pages, _user=user)
self.update_page_count(save=False) self.update_page_count(save=False)
if setting_fix_orientation.value: if setting_fix_orientation.value:
self.fix_orientation() self.fix_orientation()
@@ -326,7 +327,13 @@ class DocumentVersion(models.Model):
sender=Document, instance=self.document sender=Document, instance=self.document
) )
self.document.pages_reset(update_page_count=False) if append_pages:
for version_page in self.pages.all():
self.document.pages.create(
content_object = version_page
)
else:
self.document.pages_reset(update_page_count=False)
def save_to_file(self, file_object): def save_to_file(self, file_object):
""" """

View File

@@ -158,7 +158,7 @@ def task_update_page_count(self, version_id):
@app.task(bind=True, default_retry_delay=UPLOAD_NEW_VERSION_RETRY_DELAY, ignore_result=True) @app.task(bind=True, default_retry_delay=UPLOAD_NEW_VERSION_RETRY_DELAY, ignore_result=True)
def task_upload_new_version(self, document_id, shared_uploaded_file_id, user_id, comment=None): def task_upload_new_version(self, document_id, shared_uploaded_file_id, user_id, append_pages=False, comment=None):
SharedUploadedFile = apps.get_model( SharedUploadedFile = apps.get_model(
app_label='common', model_name='SharedUploadedFile' app_label='common', model_name='SharedUploadedFile'
) )
@@ -193,7 +193,7 @@ def task_upload_new_version(self, document_id, shared_uploaded_file_id, user_id,
document=document, comment=comment or '', file=file_object document=document, comment=comment or '', file=file_object
) )
try: try:
document_version.save(_user=user) document_version.save(append_pages=append_pages, _user=user)
except Warning as warning: except Warning as warning:
# New document version are blocked # New document version are blocked
logger.info( logger.info(

View File

@@ -15,7 +15,7 @@ def is_document_page_disabled(context):
link_document_page_ocr_content = Link( link_document_page_ocr_content = Link(
args='resolved_object.id',# conditional_disable=is_document_page_disabled, args='resolved_object.id', conditional_disable=is_document_page_disabled,
icon_class_path='mayan.apps.ocr.icons.icon_document_page_ocr_content', icon_class_path='mayan.apps.ocr.icons.icon_document_page_ocr_content',
permissions=(permission_ocr_content_view,), text=_('OCR'), permissions=(permission_ocr_content_view,), text=_('OCR'),
view='ocr:document_page_ocr_content', view='ocr:document_page_ocr_content',

View File

@@ -22,7 +22,7 @@ from .signals import post_document_version_ocr
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class DocumentPageOCRContentManager(models.Manager): class DocumentVesionPageOCRContentManager(models.Manager):
def delete_content_for(self, document, user=None): def delete_content_for(self, document, user=None):
with transaction.atomic(): with transaction.atomic():
for document_page in document.pages.all(): for document_page in document.pages.all():

View File

@@ -9,7 +9,7 @@ from mayan.apps.documents.models import (
) )
from .managers import ( from .managers import (
DocumentPageOCRContentManager, DocumentTypeSettingsManager DocumentVesionPageOCRContentManager, DocumentTypeSettingsManager
) )
@@ -52,7 +52,7 @@ class DocumentVersionPageOCRContent(models.Model):
), verbose_name=_('Content') ), verbose_name=_('Content')
) )
objects = DocumentPageOCRContentManager() objects = DocumentVesionPageOCRContentManager()
class Meta: class Meta:
verbose_name = _('Document version page OCR content') verbose_name = _('Document version page OCR content')

View File

@@ -31,6 +31,10 @@ class NewVersionForm(forms.Form):
required=False, required=False,
widget=forms.widgets.Textarea(attrs={'rows': 4}), widget=forms.widgets.Textarea(attrs={'rows': 4}),
) )
self.fields['append_pages'] = forms.BooleanField(
initial=False, label=_('Append pages?'),
required=False,
)
class UploadBaseForm(forms.Form): class UploadBaseForm(forms.Form):

View File

@@ -362,7 +362,6 @@ class UploadInteractiveView(UploadBaseView):
class UploadInteractiveVersionView(UploadBaseView): class UploadInteractiveVersionView(UploadBaseView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
self.subtemplates_list = [] self.subtemplates_list = []
self.document = get_object_or_404( self.document = get_object_or_404(
@@ -417,12 +416,17 @@ class UploadInteractiveVersionView(UploadBaseView):
else: else:
user_id = None user_id = None
task_upload_new_version.apply_async(kwargs=dict( task_upload_new_version.apply_async(
shared_uploaded_file_id=shared_uploaded_file.pk, kwargs=dict(
document_id=self.document.pk, append_pages=forms['document_form'].cleaned_data.get(
user_id=user_id, 'append_pages', False
comment=forms['document_form'].cleaned_data.get('comment') ),
)) shared_uploaded_file_id=shared_uploaded_file.pk,
document_id=self.document.pk,
user_id=user_id,
comment=forms['document_form'].cleaned_data.get('comment')
)
)
messages.success( messages.success(
message=_( message=_(