Improve downloading series zip files

This commit is contained in:
Ross
2023-12-23 16:20:08 +00:00
parent 5790f6430d
commit 8c0aaa82e2
3 changed files with 43 additions and 18 deletions
+5 -10
View File
@@ -15,6 +15,7 @@ from django.core.exceptions import (
) )
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import View
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from generic.mixins import SuperuserRequiredMixin from generic.mixins import SuperuserRequiredMixin
@@ -121,15 +122,13 @@ import logging
from copy import deepcopy from copy import deepcopy
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
from generic.views import ExamCloneMixin, ExamViews from generic.views import ExamCloneMixin, ExamViews, SeriesImagesZipViewBase
from reversion.views import RevisionMixin from reversion.views import RevisionMixin
import reversion import reversion
from rest_framework import viewsets from rest_framework import viewsets
from zipview.views import BaseZipView
import os import os
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1074,13 +1073,9 @@ def series_order_upload_filename(request, pk):
return redirect("atlas:series_detail", pk=pk) return redirect("atlas:series_detail", pk=pk)
class SeriesImagesZipView(SuperuserRequiredMixin, BaseZipView): # Vendored in from BaseZipView
"""Download all images from an image series""" class SeriesImagesZipView(SeriesImagesZipViewBase, SuperuserRequiredMixin):
series_object = Series
def get_files(self):
series = Series.objects.get(pk=self.kwargs["pk"])
return [i.image.file for i in series.get_images()]
def create_series_findings(request): def create_series_findings(request):
+35
View File
@@ -51,6 +51,10 @@ from generic.filters import CidUserFilter, ExaminationFilter
from generic.tables import CidUserExamTable, CidUserTable, ExaminationTable from generic.tables import CidUserExamTable, CidUserTable, ExaminationTable
from generic.mixins import SuperuserRequiredMixin from generic.mixins import SuperuserRequiredMixin
import zipfile
from django.core.files.base import ContentFile
from .forms import ( from .forms import (
CidGroupExamForm, CidGroupExamForm,
CidUserForm, CidUserForm,
@@ -3189,3 +3193,34 @@ class ExaminationDelete(RevisionMixin, SuperuserRequiredMixin, DeleteView):
class ExaminationUpdate(UpdateView, SuperuserRequiredMixin): class ExaminationUpdate(UpdateView, SuperuserRequiredMixin):
model = Examination model = Examination
form_class = ExaminationForm form_class = ExaminationForm
class SeriesImagesZipViewBase(SuperuserRequiredMixin, View):
"""Download all images from an image series"""
http_method_names = ['get']
series_object = None
def get_files(self):
series = self.series_object.objects.get(pk=self.kwargs["pk"])
return [i.image.file for i in series.get_images()]
def get_archive_name(self, request):
#series = Series.objects.get(pk=self.kwargs["pk"])
return f"Series {self.kwargs['pk']}.zip"
def get(self, request, *args, **kwargs):
temp_file = ContentFile(b"", name=self.get_archive_name(request))
with zipfile.ZipFile(temp_file, mode='w', compression=zipfile.ZIP_DEFLATED) as zip_file:
files = self.get_files()
for file_ in files:
path = os.path.split(file_.name)[-1]
zip_file.writestr(path, file_.read())
file_size = temp_file.tell()
temp_file.seek(0)
response = HttpResponse(temp_file, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=%s' % self.get_archive_name(request)
response['Content-Length'] = file_size
return response
+3 -8
View File
@@ -75,7 +75,7 @@ from django.forms.models import model_to_dict
from longs.forms import LongCreationDefaultForm from longs.forms import LongCreationDefaultForm
from longs.models import LongCreationDefault from longs.models import LongCreationDefault
from generic.views import AuthorRequiredMixin, ExamCloneMixin, ExamCreateBase, ExamDeleteBase, ExamUpdateBase, ExamViews from generic.views import AuthorRequiredMixin, ExamCloneMixin, ExamCreateBase, ExamDeleteBase, ExamUpdateBase, ExamViews, SeriesImagesZipViewBase
from reversion.views import RevisionMixin from reversion.views import RevisionMixin
import reversion import reversion
@@ -1244,13 +1244,8 @@ def refresh_exam_question_json(request, pk):
return redirect("longs:exam_overview", pk=pk) return redirect("longs:exam_overview", pk=pk)
class SeriesImagesZipView(SuperuserRequiredMixin, BaseZipView): class SeriesImagesZipView(SeriesImagesZipViewBase, SuperuserRequiredMixin):
"""Download all images from an image series""" series_object = LongSeries
def get_files(self):
series = LongSeries.objects.get(pk=self.kwargs["pk"])
return [i.image.file for i in series.images.all()]
def question_review(request, pk): def question_review(request, pk):