diff --git a/apps/common/templates/generic_form_subtemplate.html b/apps/common/templates/generic_form_subtemplate.html
index e502d78fd6..37eeee5db4 100644
--- a/apps/common/templates/generic_form_subtemplate.html
+++ b/apps/common/templates/generic_form_subtemplate.html
@@ -35,6 +35,10 @@
{% endif %}
+ {% if previous %}
+
+ {% endif %}
+
{% for hidden_field in hidden_fields %}
{{ hidden_field.as_hidden }}
{% endfor %}
@@ -77,6 +81,13 @@
{% endif %}
{% if submit_label %}{{ submit_label }}{% else %}{% if object %}{% trans "Save" %}{% else %}{% trans "Submit" %}{% endif %}{% endif %}
+
+ {% if previous %}
+
+
{% if cancel_label %}{{ cancel_label }}{% else %}{% trans "Cancel" %}{% endif %}
+
+ {% endif %}
+
{% comment %}
{% trans 'Cancel' %}
diff --git a/apps/documents/forms.py b/apps/documents/forms.py
index 398e9f59ae..62bd3fa00d 100644
--- a/apps/documents/forms.py
+++ b/apps/documents/forms.py
@@ -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})
+
+
diff --git a/apps/documents/views.py b/apps/documents/views.py
index c33554edc1..af77a2f1aa 100644
--- a/apps/documents/views.py
+++ b/apps/documents/views.py
@@ -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,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):
- 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
+ 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())},
+ ],
+ }
+ }
+ )
- 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'
- )
- except Exception, e:
- if settings.DEBUG:
- raise
+ 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_version in document_versions:
+ descriptor = document_version.open()
+ compressed_file.add_file(descriptor, arcname=document_version.filename)
+ descriptor.close()
+
+ compressed_file.close()
+
+ 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:
- messages.error(request, e)
- return HttpResponseRedirect(request.META['HTTP_REFERER'])
+ 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:
- try:
- compressed_file = CompressedFile()
- for document in documents:
- descriptor = document.open()
- compressed_file.add_file(descriptor, arcname=document.filename)
- descriptor.close()
+ form = DocumentDownloadForm(document_versions=document_versions)
- 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(
- 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'])
+ 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):