From 5c76e5f0dbe37e53a325d418d3cc593ff61a3090 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 27 Sep 2020 18:40:45 +0200 Subject: [PATCH] Get ZIP archive of all authorizations of one team --- apps/participation/urls.py | 3 ++- apps/participation/views.py | 32 ++++++++++++++++++++++++++++++++ apps/registration/tests.py | 8 ++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/apps/participation/urls.py b/apps/participation/urls.py index b5a8c36..f094335 100644 --- a/apps/participation/urls.py +++ b/apps/participation/urls.py @@ -1,7 +1,7 @@ from django.urls import path from .views import CreateTeamView, JoinTeamView, MyParticipationDetailView, MyTeamDetailView, ParticipationDetailView,\ - TeamDetailView, TeamUpdateView, UploadVideoView + TeamAuthorizationsView, TeamDetailView, TeamUpdateView, UploadVideoView app_name = "participation" @@ -12,6 +12,7 @@ urlpatterns = [ path("team/", MyTeamDetailView.as_view(), name="my_team_detail"), path("team//", TeamDetailView.as_view(), name="team_detail"), path("team//update/", TeamUpdateView.as_view(), name="update_team"), + path("team//authorizations/", TeamAuthorizationsView.as_view(), name="team_authorizations"), path("detail/", MyParticipationDetailView.as_view(), name="my_participation_detail"), path("detail//", ParticipationDetailView.as_view(), name="participation_detail"), path("detail/upload-video//", UploadVideoView.as_view(), name="upload_video"), diff --git a/apps/participation/views.py b/apps/participation/views.py index 920bf56..498ab92 100644 --- a/apps/participation/views.py +++ b/apps/participation/views.py @@ -1,9 +1,14 @@ +from io import BytesIO +from zipfile import ZipFile + from django.contrib.auth.mixins import LoginRequiredMixin from django.core.exceptions import PermissionDenied from django.db import transaction +from django.http import FileResponse, HttpResponse from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from django.views.generic import CreateView, DetailView, FormView, RedirectView, UpdateView +from magic import Magic from .forms import JoinTeamForm, ParticipationForm, TeamForm, UploadVideoForm from .models import Participation, Team, Video @@ -117,6 +122,33 @@ class TeamUpdateView(LoginRequiredMixin, UpdateView): return reverse_lazy("participation:team_detail", args=(self.object.pk,)) +class TeamAuthorizationsView(LoginRequiredMixin, DetailView): + model = Team + + def dispatch(self, request, *args, **kwargs): + user = request.user + if user.registration.is_admin or user.registration.participates and user.registration.team.pk == kwargs["pk"]: + return super().dispatch(request, *args, **kwargs) + raise PermissionDenied + + def get(self, request, *args, **kwargs): + team = self.get_object() + output = BytesIO() + zf = ZipFile(output, "w") + for student in team.students.all(): + magic = Magic(mime=True) + mime_type = magic.from_file("media/" + student.photo_authorization.name) + ext = mime_type.split("/")[1].replace("jpeg", "jpg") + zf.write("media/" + student.photo_authorization.name, + _("Photo authorization of {student}.{ext}").format(student=str(student), ext=ext)) + zf.close() + response = HttpResponse(content_type="application/zip") + response["Content-Disposition"] = "attachment; filename=\"{filename}\""\ + .format(filename=_("Photo authorizations of team {trigram}.zip").format(trigram=team.trigram)) + response.write(output.getvalue()) + return response + + class MyParticipationDetailView(LoginRequiredMixin, RedirectView): def get_redirect_url(self, *args, **kwargs): user = self.request.user diff --git a/apps/registration/tests.py b/apps/registration/tests.py index b04ba76..db44a43 100644 --- a/apps/registration/tests.py +++ b/apps/registration/tests.py @@ -170,6 +170,14 @@ class TestRegistration(TestCase): args=(self.student.registration.photo_authorization.name.split('/')[-1],))) self.assertEqual(response.status_code, 200) + from participation.models import Team + team = Team.objects.create(name="Test", trigram="TES") + self.student.registration.team = team + self.student.registration.save() + response = self.client.get(reverse("participation:team_authorizations", args=(team.pk,))) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["content-type"], "application/zip") + self.student.registration.photo_authorization.delete() def test_string_render(self):