.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;
<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 %}
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
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',
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
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
else:
return collection.code + '_'
-