Improve single, multiple document and document versions downloads

By using a 2 step document download view
This commit is contained in:
Roberto Rosario
2012-01-24 12:13:53 -04:00
parent 4eaf4bd785
commit e44ef229b0
2 changed files with 99 additions and 46 deletions

View File

@@ -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})

View File

@@ -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):