Improve single, multiple document and document versions downloads
By using a 2 step document download view
This commit is contained in:
@@ -312,3 +312,16 @@ class DocumentTypeFilenameForm_create(forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = DocumentTypeFilename
|
model = DocumentTypeFilename
|
||||||
fields = ('filename',)
|
fields = ('filename',)
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentDownloadForm(forms.Form):
|
||||||
|
compressed = forms.BooleanField(label=_(u'Compress'), required=False, help_text=_(u'Download the document in the original format or in a compressed manner. This option is selectable only when downloading one document, for multiple documents, the bundle will always be downloads as a compressed file.'))
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.document_versions = kwargs.pop('document_versions', None)
|
||||||
|
super(DocumentDownloadForm, self).__init__(*args, **kwargs)
|
||||||
|
if len(self.document_versions) > 1:
|
||||||
|
self.fields['compressed'].initial = True
|
||||||
|
self.fields['compressed'].widget.attrs.update({'disabled': True})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ from .forms import (DocumentTypeSelectForm,
|
|||||||
DocumentPageTransformationForm, DocumentContentForm,
|
DocumentPageTransformationForm, DocumentContentForm,
|
||||||
DocumentPageForm_edit, DocumentPageForm_text, PrintForm,
|
DocumentPageForm_edit, DocumentPageForm_text, PrintForm,
|
||||||
DocumentTypeForm, DocumentTypeFilenameForm,
|
DocumentTypeForm, DocumentTypeFilenameForm,
|
||||||
DocumentTypeFilenameForm_create)
|
DocumentTypeFilenameForm_create, DocumentDownloadForm)
|
||||||
from .wizards import DocumentCreateWizard
|
from .wizards import DocumentCreateWizard
|
||||||
from .models import (Document, DocumentType, DocumentPage,
|
from .models import (Document, DocumentType, DocumentPage,
|
||||||
DocumentPageTransformation, RecentDocument, DocumentTypeFilename,
|
DocumentPageTransformation, RecentDocument, DocumentTypeFilename,
|
||||||
@@ -320,48 +320,50 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, base64_version=F
|
|||||||
|
|
||||||
|
|
||||||
def document_download(request, document_id=None, document_id_list=None, document_version_pk=None):
|
def document_download(request, document_id=None, document_id_list=None, document_version_pk=None):
|
||||||
document_version = None
|
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||||
documents = []
|
|
||||||
|
|
||||||
if document_id:
|
if document_id:
|
||||||
documents = [get_object_or_404(Document, pk=document_id)]
|
document_versions = [get_object_or_404(Document, pk=document_id).latest_version]
|
||||||
post_action_redirect = reverse('document_list')
|
|
||||||
elif document_id_list:
|
elif document_id_list:
|
||||||
documents = [get_object_or_404(Document, pk=document_id) for document_id in document_id_list.split(',')]
|
document_versions = [get_object_or_404(Document, pk=document_id).latest_version for document_id in document_id_list.split(',')]
|
||||||
elif document_version_pk:
|
elif document_version_pk:
|
||||||
document_version = get_object_or_404(DocumentVersion, pk=document_version_pk)
|
document_versions = [get_object_or_404(DocumentVersion, pk=document_version_pk)]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_DOWNLOAD])
|
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_DOWNLOAD])
|
||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_DOCUMENT_DOWNLOAD, request.user, documents, exception_on_empty=True)
|
document_versions = AccessEntry.objects.filter_objects_by_access(PERMISSION_DOCUMENT_DOWNLOAD, request.user, document_versions, related='document', exception_on_empty=True)
|
||||||
|
|
||||||
if len(documents) == 1:
|
subtemplates_list = []
|
||||||
document_version = documents[0].latest_version
|
subtemplates_list.append(
|
||||||
|
{
|
||||||
if document_version:
|
'name': 'generic_list_subtemplate.html',
|
||||||
try:
|
'context': {
|
||||||
# Test permissions and trigger exception
|
'title': _(u'documents to be downloaded'),
|
||||||
fd = document_version.open()
|
'object_list': document_versions,
|
||||||
fd.close()
|
'hide_link': True,
|
||||||
return serve_file(
|
'hide_object': True,
|
||||||
request,
|
'hide_links': True,
|
||||||
document_version.file,
|
'navigation_object_links': None,
|
||||||
save_as=u'"%s"' % document_version.filename,
|
'scrollable_content': True,
|
||||||
content_type=document_version.mimetype if document_version.mimetype else 'application/octet-stream'
|
'scrollable_content_height': '200px',
|
||||||
|
'extra_columns': [
|
||||||
|
{'name': _(u'document'), 'attribute': 'document'},
|
||||||
|
{'name': _(u'version'), 'attribute': encapsulate(lambda x: x.get_formated_version())},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
except Exception, e:
|
|
||||||
if settings.DEBUG:
|
if request.method == 'POST':
|
||||||
raise
|
form = DocumentDownloadForm(request.POST, document_versions=document_versions)
|
||||||
else:
|
if form.is_valid():
|
||||||
messages.error(request, e)
|
if form.cleaned_data['compressed'] or len(document_versions) > 1:
|
||||||
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
|
||||||
else:
|
|
||||||
try:
|
try:
|
||||||
compressed_file = CompressedFile()
|
compressed_file = CompressedFile()
|
||||||
for document in documents:
|
for document_version in document_versions:
|
||||||
descriptor = document.open()
|
descriptor = document_version.open()
|
||||||
compressed_file.add_file(descriptor, arcname=document.filename)
|
compressed_file.add_file(descriptor, arcname=document_version.filename)
|
||||||
descriptor.close()
|
descriptor.close()
|
||||||
|
|
||||||
compressed_file.close()
|
compressed_file.close()
|
||||||
@@ -379,6 +381,44 @@ def document_download(request, document_id=None, document_id_list=None, document
|
|||||||
else:
|
else:
|
||||||
messages.error(request, e)
|
messages.error(request, e)
|
||||||
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
# Test permissions and trigger exception
|
||||||
|
fd = document_versions[0].open()
|
||||||
|
fd.close()
|
||||||
|
return serve_file(
|
||||||
|
request,
|
||||||
|
document_versions[0].file,
|
||||||
|
save_as=u'"%s"' % document_versions[0].filename,
|
||||||
|
content_type=document_versions[0].mimetype if document_versions[0].mimetype else 'application/octet-stream'
|
||||||
|
)
|
||||||
|
except Exception, e:
|
||||||
|
if settings.DEBUG:
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
messages.error(request, e)
|
||||||
|
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
||||||
|
|
||||||
|
else:
|
||||||
|
form = DocumentDownloadForm(document_versions=document_versions)
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'form': form,
|
||||||
|
'subtemplates_list': subtemplates_list,
|
||||||
|
'title': _(u'Download documents'),
|
||||||
|
'submit_label': _(u'Download'),
|
||||||
|
'previous': previous,
|
||||||
|
'cancel_label': _(u'Return'),
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(document_versions) == 1:
|
||||||
|
context['object'] = document_versions[0].document
|
||||||
|
|
||||||
|
return render_to_response(
|
||||||
|
'generic_form.html',
|
||||||
|
context,
|
||||||
|
context_instance=RequestContext(request)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def document_multiple_download(request):
|
def document_multiple_download(request):
|
||||||
|
|||||||
Reference in New Issue
Block a user