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

View File

@@ -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,65 +320,105 @@ 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(
{
'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())},
],
}
}
)
if document_version: if request.method == 'POST':
try: form = DocumentDownloadForm(request.POST, document_versions=document_versions)
# Test permissions and trigger exception if form.is_valid():
fd = document_version.open() if form.cleaned_data['compressed'] or len(document_versions) > 1:
fd.close() try:
return serve_file( compressed_file = CompressedFile()
request, for document_version in document_versions:
document_version.file, descriptor = document_version.open()
save_as=u'"%s"' % document_version.filename, compressed_file.add_file(descriptor, arcname=document_version.filename)
content_type=document_version.mimetype if document_version.mimetype else 'application/octet-stream' descriptor.close()
)
except Exception, e: compressed_file.close()
if settings.DEBUG:
raise return serve_file(
request,
compressed_file.as_file('document_bundle.zip'),
save_as=u'"document_bundle.zip"',
content_type='application/zip'
)
# TODO: DO a redirection afterwards
except Exception, e:
if settings.DEBUG:
raise
else:
messages.error(request, e)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
else: else:
messages.error(request, e) try:
return HttpResponseRedirect(request.META['HTTP_REFERER']) # 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: else:
try: form = DocumentDownloadForm(document_versions=document_versions)
compressed_file = CompressedFile()
for document in documents:
descriptor = document.open()
compressed_file.add_file(descriptor, arcname=document.filename)
descriptor.close()
compressed_file.close() context = {
'form': form,
'subtemplates_list': subtemplates_list,
'title': _(u'Download documents'),
'submit_label': _(u'Download'),
'previous': previous,
'cancel_label': _(u'Return'),
}
return serve_file( if len(document_versions) == 1:
request, context['object'] = document_versions[0].document
compressed_file.as_file('document_bundle.zip'),
save_as=u'"document_bundle.zip"', return render_to_response(
content_type='application/zip' 'generic_form.html',
) context,
# TODO: DO a redirection afterwards context_instance=RequestContext(request)
except Exception, e: )
if settings.DEBUG:
raise
else:
messages.error(request, e)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
def document_multiple_download(request): def document_multiple_download(request):