]> git.parisson.com Git - telemeta.git/commitdiff
add collection zip package button and view
authorGuillaume Pellerin <yomguy@parisson.com>
Thu, 13 Jun 2013 17:15:28 +0000 (19:15 +0200)
committerGuillaume Pellerin <yomguy@parisson.com>
Thu, 13 Jun 2013 17:15:28 +0000 (19:15 +0200)
telemeta/static/telemeta/css/telemeta.css
telemeta/static/telemeta/images/zip.png [new file with mode: 0644]
telemeta/templates/telemeta/collection_detail.html
telemeta/urls.py
telemeta/views/collection.py
telemeta/views/core.py

index 9bb64b0718c43e292e59167223c2ab78fbc53372..1eb19c88e349da11fa80a2f1d34ffa061352d87b 100644 (file)
@@ -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 (file)
index 0000000..7e5d49a
Binary files /dev/null and b/telemeta/static/telemeta/images/zip.png differ
index bdba2f190b18f86530ecc7985abf8f1e8a8cc2ba..db055fef6571d074dbf966cd817ba4d042b1336f 100644 (file)
       <a href="{% url telemeta-collection-additem collection.public_id %}" class="component_icon button icon_add">{% trans "Add item" %}</a>
      {% endif %}
     {% if user.is_authenticated %}
-    <a href=# id ="_add_to_playlist" class="component_icon button icon_add_to_playlist">{% trans "Add to playlist" %}</a>
+     <a href=# id="_add_to_playlist" class="component_icon button icon_add_to_playlist">{% trans "Add to playlist" %}</a>
+    {% if audio_export_enabled or perms.telemeta.can_download_all_items or user.is_superuser %}
+     <a href="{% url telemeta-collection-package collection.public_id %}" id="zip_package" class="component_icon button icon_zip">{% trans "Download" %} ZIP</a>
+    {% endif %}
     {% endif %}
    </div>
 {% endblock %}
index 85d16ca73161bca5aa44ef9571b80295277a82c6..63c584e26acb19a17c7357edf2acebdbcf48cc20 100644 (file)
@@ -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<path>[A-Za-z0-9._-s/]+)/$', redirect_to, {'url': '/archives/collections/%(path)s/', 'permanent': False}, name="telemeta-collection-redir"),
-
+    url(r'^archives/collections/(?P<public_id>[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',
index f2039d47eb45ee5cff2c3610f1555b6165c37999..1af008afd30579ecc2ad5ac667cf59039c9c806b 100644 (file)
@@ -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
index 69fe99ce2722848f46cc36e1776d7d9a8b34430f..0267dd01b54ff5f293772714a1eb073357a469fc 100644 (file)
@@ -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 + '_'
 
-