Add download gallery as zip

This commit is contained in:
Alexandre Iooss 2021-10-08 20:41:20 +02:00
parent e2c826ec1d
commit 52d63128fc
3 changed files with 31 additions and 3 deletions

View file

@ -38,5 +38,5 @@
</a>
{% endfor %}
</div>
<a href="#" class="btn btn-secondary">{% trans 'Download all gallery' %}</a>
<a href="{% url 'gallery-download' gallery.slug %}" class="btn btn-secondary">{% trans 'Download all gallery' %}</a>
{% endblock %}

View file

@ -1,7 +1,8 @@
from django.urls import path
from .views import TagDetail
from .views import TagDetail, GalleryDownload
urlpatterns = [
path('tag/<slug:slug>/', TagDetail.as_view(), name='tag-detail'),
path('gallery/<slug:slug>/download/', GalleryDownload.as_view(), name='gallery-download'),
]

View file

@ -1,10 +1,15 @@
# Copyright (C) 2021 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
import os
import zipfile
from io import BytesIO
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponse
from django.views.generic import DetailView
from taggit.models import Tag
from photologue.models import Gallery
from taggit.models import Tag
class TagDetail(LoginRequiredMixin, DetailView):
@ -19,3 +24,25 @@ class TagDetail(LoginRequiredMixin, DetailView):
context['galleries'] = Gallery.objects.on_site().is_public() \
.filter(extended__tags__name=current_tag)
return context
class GalleryDownload(LoginRequiredMixin, DetailView):
model = Gallery
def get(self, request, *args, **kwargs):
"""
Download a zip file of the gallery on GET request.
"""
# Create zip file with pictures
gallery = self.get_object()
byte_data = BytesIO()
zip_file = zipfile.ZipFile(byte_data, "w")
for photo in gallery.public():
filename = os.path.basename(os.path.normpath(photo.image.path))
zip_file.write(photo.image.path, filename)
zip_file.close()
# Return zip file
response = HttpResponse(byte_data.getvalue(), content_type='application/x-zip-compressed')
response['Content-Disposition'] = f"attachment; filename={gallery.slug}.zip"
return response