def get_file(self): queryset = self.get_document_queryset() zip_filename = self.request.GET.get('zip_filename', DEFAULT_ZIP_FILENAME) if self.request.GET.get( 'compressed') == 'True' or queryset.count() > 1: compressed_file = CompressedFile() for item in queryset: descriptor = item.open() compressed_file.add_file( descriptor, arcname=DocumentDownloadView.get_item_label(item=item)) descriptor.close() DocumentDownloadView.commit_event(item=item, request=self.request) compressed_file.close() return DocumentDownloadView.VirtualFile( compressed_file.as_file(zip_filename), name=zip_filename) else: item = queryset.first() if item: DocumentDownloadView.commit_event(item=item, request=self.request) else: raise PermissionDenied return DocumentDownloadView.VirtualFile( DocumentDownloadView.get_item_file(item=item), name=DocumentDownloadView.get_item_label(item=item))
def get_file(self): queryset = self.get_document_queryset() zip_filename = self.request.GET.get( 'zip_filename', DEFAULT_ZIP_FILENAME ) if self.request.GET.get('compressed') == 'True' or queryset.count() > 1: compressed_file = CompressedFile() for item in queryset: descriptor = DocumentDownloadView.get_item_file(item=item) compressed_file.add_file( descriptor, arcname=self.get_item_label(item=item) ) descriptor.close() DocumentDownloadView.commit_event( item=item, request=self.request ) compressed_file.close() return DocumentDownloadView.VirtualFile( compressed_file.as_file(zip_filename), name=zip_filename ) else: item = queryset.first() if item: DocumentDownloadView.commit_event( item=item, request=self.request ) else: raise PermissionDenied return DocumentDownloadView.VirtualFile( DocumentDownloadView.get_item_file(item=item), name=self.get_item_label(item=item) )
def document_download(request, document_id=None, document_id_list=None, document_version_pk=None): previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) if document_id: documents = Document.objects.filter(pk=document_id) elif document_id_list: documents = Document.objects.filter(pk__in=document_id_list) elif document_version_pk: documents = Document.objects.filter( pk=get_object_or_404( DocumentVersion, pk=document_version_pk ).document.pk ) try: Permission.check_permissions( request.user, (permission_document_download,) ) except PermissionDenied: documents = AccessControlList.objects.filter_by_access( permission_document_download, request.user, documents ) if not documents: messages.error( request, _('Must provide at least one document or version.') ) return HttpResponseRedirect( request.META.get( 'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL) ) ) if document_version_pk: queryset = DocumentVersion.objects.filter(pk=document_version_pk) else: queryset = DocumentVersion.objects.filter( pk__in=[document.latest_version.pk for document in documents] ) subtemplates_list = [] subtemplates_list.append( { 'name': 'appearance/generic_list_subtemplate.html', 'context': { 'title': _('Documents to be downloaded'), 'object_list': queryset, 'hide_link': True, 'hide_object': True, 'hide_links': True, 'scrollable_content': True, 'scrollable_content_height': '200px', 'extra_columns': ( {'name': _('Document'), 'attribute': 'document'}, {'name': _('Date and time'), 'attribute': 'timestamp'}, {'name': _('MIME type'), 'attribute': 'mimetype'}, {'name': _('Encoding'), 'attribute': 'encoding'}, ), } } ) if request.method == 'POST': form = DocumentDownloadForm(request.POST, queryset=queryset) if form.is_valid(): if form.cleaned_data['compressed'] or queryset.count() > 1: try: compressed_file = CompressedFile() for document_version in queryset: descriptor = document_version.open() compressed_file.add_file( descriptor, arcname=document_version.document.label ) descriptor.close() compressed_file.close() return serve_file( request, compressed_file.as_file( form.cleaned_data['zip_filename'] ), save_as='"%s"' % form.cleaned_data['zip_filename'], content_type='application/zip' ) except Exception as exception: if settings.DEBUG: raise else: messages.error(request, exception) return HttpResponseRedirect( request.META['HTTP_REFERER'] ) else: try: # Test permissions and trigger exception fd = queryset.first().open() fd.close() return serve_file( request, queryset.first().file, save_as='"%s"' % queryset.first().document.label, content_type=queryset.first().mimetype if queryset.first().mimetype else 'application/octet-stream' ) except Exception as exception: if settings.DEBUG: raise else: messages.error(request, exception) return HttpResponseRedirect( request.META['HTTP_REFERER'] ) else: form = DocumentDownloadForm(queryset=queryset) context = { 'form': form, 'previous': previous, 'submit_label': _('Download'), 'subtemplates_list': subtemplates_list, 'title': _('Download documents'), } if queryset.count() == 1: context['object'] = queryset.first().document return render_to_response( 'appearance/generic_form.html', context, context_instance=RequestContext(request) )
def document_download(request, document_id=None, document_id_list=None, document_version_pk=None): previous = request.POST.get( 'previous', request.GET.get( 'previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) if document_id: documents = Document.objects.filter(pk=document_id) elif document_id_list: documents = Document.objects.filter(pk__in=document_id_list) elif document_version_pk: documents = Document.objects.filter(pk=get_object_or_404( DocumentVersion, pk=document_version_pk).document.pk) try: Permission.check_permissions(request.user, (permission_document_download, )) except PermissionDenied: documents = AccessControlList.objects.filter_by_access( permission_document_download, request.user, documents) if not documents: messages.error(request, _('Must provide at least one document or version.')) return HttpResponseRedirect( request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))) if document_version_pk: queryset = DocumentVersion.objects.filter(pk=document_version_pk) else: queryset = DocumentVersion.objects.filter( pk__in=[document.latest_version.pk for document in documents]) subtemplates_list = [] subtemplates_list.append({ 'name': 'appearance/generic_list_subtemplate.html', 'context': { 'title': _('Documents to be downloaded'), 'object_list': queryset, 'hide_link': True, 'hide_object': True, 'hide_links': True, 'scrollable_content': True, 'scrollable_content_height': '200px', 'extra_columns': ( { 'name': _('Document'), 'attribute': 'document' }, { 'name': _('Date and time'), 'attribute': 'timestamp' }, { 'name': _('MIME type'), 'attribute': 'mimetype' }, { 'name': _('Encoding'), 'attribute': 'encoding' }, ), } }) if request.method == 'POST': form = DocumentDownloadForm(request.POST, queryset=queryset) if form.is_valid(): if form.cleaned_data['compressed'] or queryset.count() > 1: try: compressed_file = CompressedFile() for document_version in queryset: descriptor = document_version.open() compressed_file.add_file( descriptor, arcname=document_version.document.label) descriptor.close() compressed_file.close() return serve_file(request, compressed_file.as_file( form.cleaned_data['zip_filename']), save_as='"%s"' % form.cleaned_data['zip_filename'], content_type='application/zip') except Exception as exception: if settings.DEBUG: raise else: messages.error(request, exception) return HttpResponseRedirect( request.META['HTTP_REFERER']) else: try: # Test permissions and trigger exception fd = queryset.first().open() fd.close() return serve_file(request, queryset.first().file, save_as='"%s"' % queryset.first().document.label, content_type=queryset.first().mimetype if queryset.first().mimetype else 'application/octet-stream') except Exception as exception: if settings.DEBUG: raise else: messages.error(request, exception) return HttpResponseRedirect( request.META['HTTP_REFERER']) else: form = DocumentDownloadForm(queryset=queryset) context = { 'form': form, 'previous': previous, 'submit_label': _('Download'), 'subtemplates_list': subtemplates_list, 'title': _('Download documents'), } if queryset.count() == 1: context['object'] = queryset.first().document return render_to_response('appearance/generic_form.html', context, context_instance=RequestContext(request))