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:
|
||||
model = DocumentTypeFilename
|
||||
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,
|
||||
DocumentPageForm_edit, DocumentPageForm_text, PrintForm,
|
||||
DocumentTypeForm, DocumentTypeFilenameForm,
|
||||
DocumentTypeFilenameForm_create)
|
||||
DocumentTypeFilenameForm_create, DocumentDownloadForm)
|
||||
from .wizards import DocumentCreateWizard
|
||||
from .models import (Document, DocumentType, DocumentPage,
|
||||
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):
|
||||
document_version = None
|
||||
documents = []
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||
|
||||
if document_id:
|
||||
documents = [get_object_or_404(Document, pk=document_id)]
|
||||
post_action_redirect = reverse('document_list')
|
||||
document_versions = [get_object_or_404(Document, pk=document_id).latest_version]
|
||||
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:
|
||||
document_version = get_object_or_404(DocumentVersion, pk=document_version_pk)
|
||||
document_versions = [get_object_or_404(DocumentVersion, pk=document_version_pk)]
|
||||
|
||||
try:
|
||||
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_DOWNLOAD])
|
||||
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:
|
||||
document_version = documents[0].latest_version
|
||||
|
||||
if document_version:
|
||||
try:
|
||||
# Test permissions and trigger exception
|
||||
fd = document_version.open()
|
||||
fd.close()
|
||||
return serve_file(
|
||||
request,
|
||||
document_version.file,
|
||||
save_as=u'"%s"' % document_version.filename,
|
||||
content_type=document_version.mimetype if document_version.mimetype else 'application/octet-stream'
|
||||
subtemplates_list = []
|
||||
subtemplates_list.append(
|
||||
{
|
||||
'name': 'generic_list_subtemplate.html',
|
||||
'context': {
|
||||
'title': _(u'documents to be downloaded'),
|
||||
'object_list': document_versions,
|
||||
'hide_link': True,
|
||||
'hide_object': True,
|
||||
'hide_links': True,
|
||||
'navigation_object_links': None,
|
||||
'scrollable_content': True,
|
||||
'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:
|
||||
raise
|
||||
else:
|
||||
messages.error(request, e)
|
||||
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
||||
else:
|
||||
|
||||
if request.method == 'POST':
|
||||
form = DocumentDownloadForm(request.POST, document_versions=document_versions)
|
||||
if form.is_valid():
|
||||
if form.cleaned_data['compressed'] or len(document_versions) > 1:
|
||||
try:
|
||||
compressed_file = CompressedFile()
|
||||
for document in documents:
|
||||
descriptor = document.open()
|
||||
compressed_file.add_file(descriptor, arcname=document.filename)
|
||||
for document_version in document_versions:
|
||||
descriptor = document_version.open()
|
||||
compressed_file.add_file(descriptor, arcname=document_version.filename)
|
||||
descriptor.close()
|
||||
|
||||
compressed_file.close()
|
||||
@@ -379,6 +381,44 @@ def document_download(request, document_id=None, document_id_list=None, document
|
||||
else:
|
||||
messages.error(request, e)
|
||||
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):
|
||||
|
||||
Reference in New Issue
Block a user