From acd68cf9759695aa0bf72cc3b0d570aec7e50e5e Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Thu, 13 Jun 2013 19:15:28 +0200 Subject: [PATCH] add collection zip package button and view --- telemeta/static/telemeta/css/telemeta.css | 3 ++ telemeta/static/telemeta/images/zip.png | Bin 0 -> 528 bytes .../templates/telemeta/collection_detail.html | 5 ++- telemeta/urls.py | 6 ++-- telemeta/views/collection.py | 29 ++++++++++++++---- telemeta/views/core.py | 4 +-- 6 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 telemeta/static/telemeta/images/zip.png diff --git a/telemeta/static/telemeta/css/telemeta.css b/telemeta/static/telemeta/css/telemeta.css index 9bb64b07..1eb19c88 100644 --- a/telemeta/static/telemeta/css/telemeta.css +++ b/telemeta/static/telemeta/css/telemeta.css @@ -1202,6 +1202,9 @@ a.image-link { .icon_delete{ background-image: url('../images/delete.png'); } +.icon_zip{ + background-image: url('../images/zip.png'); +} .icon_rss,.icon_rss:hover{ background: url('../images/feed-icon-14x14.png') no-repeat; background-position: 0ex .8ex; diff --git a/telemeta/static/telemeta/images/zip.png b/telemeta/static/telemeta/images/zip.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5d49a6a423799ef3c0ef4b6f77605b6a4d893c GIT binary patch literal 528 zcmV+r0`L8aP)O^bC=jBrDYc2bRvjgWIjkatd!dQ+5l zN|$;~mwQl~eo&l$QJjcnoq$rFf>WM|WS@gppNnatg;%19UZaU$qmXc?iCL$LT&av* zs*PT%lyIw;b*-6qt*D)@sh+W^nX{5zvz~sqmtwoJqQ0DGzn^QrpKQOOZ^NN%!=!P< zseQ$!a>cHQ#<-!#r*X}!bT)3oN-zUR)S=hwaG+s5hP((C5i|Nj2}|Nj?@=w|=`00DGTPE!Ct=GbNc z005LpL_t&-(~Zc*8iHUHgyAtzN>oHt!otQ5>~8M=f;>NN)RpgMzGr}6!*6t40>$_I zb=ZkdHeekd=hKR;ulw850)$AmP~UA9+xsY$2@8Pk4sx;bblxvT^F3Dw)Cm!1$EL_a z1(Y%ARG*bL3k8t7#Pod6WFZ4mi)dcl(^yCV-ynwLI|d6L;A%`dlnj=m;~QRX*dsew Sy_~ZE0000P^+ literal 0 HcmV?d00001 diff --git a/telemeta/templates/telemeta/collection_detail.html b/telemeta/templates/telemeta/collection_detail.html index bdba2f19..db055fef 100644 --- a/telemeta/templates/telemeta/collection_detail.html +++ b/telemeta/templates/telemeta/collection_detail.html @@ -46,7 +46,10 @@ {% trans "Add item" %} {% endif %} {% if user.is_authenticated %} - {% trans "Add to playlist" %} + {% trans "Add to playlist" %} + {% if audio_export_enabled or perms.telemeta.can_download_all_items or user.is_superuser %} + {% trans "Download" %} ZIP + {% endif %} {% endif %} {% endblock %} diff --git a/telemeta/urls.py b/telemeta/urls.py index 85d16ca7..63c584e2 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -40,7 +40,8 @@ from django.views.generic.simple import redirect_to from telemeta.models import MediaItem, MediaCollection, MediaItemMarker, MediaCorpus, MediaFonds from telemeta.views import HomeView, AdminView, CollectionView, ItemView, \ InstrumentView, PlaylistView, ProfileView, GeoView, \ - LastestRevisionsFeed, ResourceView, UserRevisionsFeed + LastestRevisionsFeed, ResourceView, UserRevisionsFeed, \ + CollectionPackageView from jsonrpc import jsonrpc_site import os.path import telemeta.config @@ -165,7 +166,8 @@ urlpatterns = patterns('', dict(all_collections_sound, paginate_by=20, template_name="telemeta/collection_list.html"), name="telemeta-collections-sound"), # FIXME: need all paths url(r'^collections/(?P[A-Za-z0-9._-s/]+)/$', redirect_to, {'url': '/archives/collections/%(path)s/', 'permanent': False}, name="telemeta-collection-redir"), - + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/package/$', CollectionPackageView.as_view(), + name="telemeta-collection-package"), # RESOURCES # Corpus list url(r'^archives/corpus/$', 'django.views.generic.list_detail.object_list', diff --git a/telemeta/views/collection.py b/telemeta/views/collection.py index f2039d47..1af008af 100644 --- a/telemeta/views/collection.py +++ b/telemeta/views/collection.py @@ -160,27 +160,44 @@ class CollectionView(object): return render(request, template, {'collection': collection, 'formset': formset,}) -class CollectionPackageView(DetailView): +class CollectionPackageView(View): model = MediaCollection - def render_to_reponse(self, context): + def get_object(self): + return MediaCollection.objects.get(public_id=self.kwargs['public_id']) + + def get(self, request, *args, **kwargs): """ Create a ZIP file on disk and transmit it in chunks of 8KB, without loading the whole file into memory. A similar approach can be used for large dynamic PDF files. """ + from telemeta.views import MarkerView + from telemeta.backup import CollectionSerializer + import json + collection = self.get_object() temp = tempfile.TemporaryFile() archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED) + serializer = CollectionSerializer(collection) + archive.writestr('%s/%s%s' % (collection.code, collection.code, '.xml'), + serializer.get_xml().encode("utf-8")) + for item in collection.items.all(): - ext = item.file.path.splitext()[1] - archive.write(item.file, '%s.%s' % (code, ext)) + ext = os.path.splitext(item.file.path)[1] + archive.write(item.file.path, '%s/%s%s' % (collection.code, item.code, ext)) + marker_view = MarkerView() + markers = marker_view.get_markers(item.id) + if markers: + archive.writestr('%s/%s%s' % (collection.code, item.code, '.json'), json.dumps(markers)) + archive.close() - wrapper = FileWrapper(temp) + wrapper = FixedFileWrapper(temp) response = HttpResponse(wrapper, content_type='application/zip') + response['Content-Disposition'] = "attachment; filename=%s.%s" % \ - (item.code, 'zip') + (collection.code, 'zip') response['Content-Length'] = temp.tell() temp.seek(0) return response diff --git a/telemeta/views/core.py b/telemeta/views/core.py index 69fe99ce..0267dd01 100644 --- a/telemeta/views/core.py +++ b/telemeta/views/core.py @@ -55,7 +55,8 @@ from django.http import HttpResponse, HttpResponseRedirect from django.http import Http404 from django.shortcuts import render_to_response, redirect, get_object_or_404 from django.views.generic import list_detail -from django.views.generic import DetailView +from django.views.generic import DetailView, View +from django.views.generic.detail import SingleObjectMixin from django.conf import settings from django.contrib import auth from django.contrib import messages @@ -262,4 +263,3 @@ def auto_code(collection): else: return collection.code + '_' - -- 2.39.5