mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-08-16 08:50:05 +02:00
Add ZIP archive for tournament solutions
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
@@ -33,7 +33,7 @@ from odf.opendocument import OpenDocumentSpreadsheet
|
||||
from odf.style import Style, TableCellProperties, TableColumnProperties, TextProperties
|
||||
from odf.table import CoveredTableCell, Table, TableCell, TableColumn, TableRow
|
||||
from odf.text import P
|
||||
from registration.models import Payment, StudentRegistration, VolunteerRegistration
|
||||
from registration.models import Payment, VolunteerRegistration
|
||||
from registration.tables import PaymentTable
|
||||
from tfjm.lists import get_sympa_client
|
||||
from tfjm.views import AdminMixin, VolunteerMixin
|
||||
@@ -819,38 +819,107 @@ class PoolUpdateTeamsView(VolunteerMixin, UpdateView):
|
||||
return self.handle_no_permission()
|
||||
|
||||
|
||||
class PoolDownloadView(VolunteerMixin, DetailView):
|
||||
class SolutionsDownloadView(VolunteerMixin, View):
|
||||
"""
|
||||
Download all solutions or syntheses as a ZIP archive.
|
||||
"""
|
||||
model = Pool
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if not request.user.is_authenticated:
|
||||
return self.handle_no_permission()
|
||||
|
||||
reg = request.user.registration
|
||||
if reg.is_admin or reg.is_volunteer \
|
||||
and (self.get_object().tournament in reg.organized_tournaments.all()
|
||||
or reg in self.get_object().juries.all()
|
||||
or reg.pools_presided.filter(tournament=self.get_object().tournament).exists()):
|
||||
if reg.is_admin:
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
if 'team_id' in kwargs:
|
||||
team = Team.objects.get(pk=kwargs["team_id"])
|
||||
tournament = team.participation.tournament
|
||||
if reg.participates and reg.team == team \
|
||||
or reg.is_volunteer and (reg in tournament.organizers.all() or team.participation.final
|
||||
and reg in Tournament.final_tournament().organizers):
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
elif 'tournament_id' in kwargs:
|
||||
tournament = Tournament.objects.get(pk=kwargs["tournament_id"])
|
||||
if reg.is_volunteer \
|
||||
and (tournament in reg.organized_tournaments.all()
|
||||
or reg.pools_presided.filter(tournament=tournament).exists()):
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
else:
|
||||
pool = Pool.objects.get(pk=kwargs["pool_id"])
|
||||
tournament = pool.tournament
|
||||
if reg.is_volunteer \
|
||||
and (reg in tournament.organizers.all()
|
||||
or reg in pool.juries.all()
|
||||
or reg.pools_presided.filter(tournament=tournament).exists()):
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
return self.handle_no_permission()
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
pool = self.get_object()
|
||||
|
||||
is_solution = 'solutions' in request.path
|
||||
|
||||
if 'team_id' in kwargs:
|
||||
team = Team.objects.get(pk=kwargs["team_id"])
|
||||
solutions = Solution.objects.filter(participation=team.participation).all()
|
||||
syntheses = Synthesis.objects.filter(participation=team.participation).all()
|
||||
filename = _("Solutions of team {trigram}.zip") if is_solution else _("Syntheses of team {trigram}.zip")
|
||||
filename = filename.format(trigram=team.trigram)
|
||||
|
||||
def prefix(s: Solution | Synthesis) -> str:
|
||||
return ""
|
||||
elif 'tournament_id' in kwargs:
|
||||
tournament = Tournament.objects.get(pk=kwargs["tournament_id"])
|
||||
sort_by = request.GET.get('sort_by', 'team').lower()
|
||||
|
||||
if sort_by == 'pool':
|
||||
pools = Pool.objects.filter(tournament=tournament).all()
|
||||
solutions = []
|
||||
for pool in pools:
|
||||
for sol in pool.solutions:
|
||||
sol.pool = pool
|
||||
solutions.append(sol)
|
||||
syntheses = Synthesis.objects.filter(passage__pool__tournament=tournament).all()
|
||||
filename = _("Solutions of {tournament}.zip") if is_solution else _("Syntheses of {tournament}.zip")
|
||||
filename = filename.format(tournament=tournament.name)
|
||||
|
||||
def prefix(s: Solution | Synthesis) -> str:
|
||||
pool = s.pool if is_solution else s.passage.pool
|
||||
p = f"Poule {pool.get_letter_display()}{pool.round}/"
|
||||
if not is_solution:
|
||||
p += f"Passage {s.passage.position}/"
|
||||
return p
|
||||
else:
|
||||
if not tournament.final:
|
||||
solutions = Solution.objects.filter(participation__tournament=tournament).all()
|
||||
else:
|
||||
solutions = Solution.objects.filter(final_solution=True).all()
|
||||
syntheses = Synthesis.objects.filter(passage__pool__tournament=tournament).all()
|
||||
filename = _("Solutions of {tournament}.zip") if is_solution else _("Syntheses of {tournament}.zip")
|
||||
filename = filename.format(tournament=tournament.name)
|
||||
|
||||
def prefix(s: Solution | Synthesis) -> str:
|
||||
return f"{s.participation.team.trigram}/" if sort_by == "team" else f"Problème {s.problem}/"
|
||||
else:
|
||||
pool = Pool.objects.get(pk=kwargs["pool_id"])
|
||||
solutions = pool.solutions
|
||||
syntheses = Synthesis.objects.filter(passage__pool=pool).all()
|
||||
filename = _("Solutions for pool {pool} of tournament {tournament}.zip") \
|
||||
if is_solution else _("Syntheses for pool {pool} of tournament {tournament}.zip")
|
||||
filename = filename.format(pool=pool.get_letter_display() + str(pool.round),
|
||||
tournament=pool.tournament.name)
|
||||
|
||||
def prefix(s: Solution | Synthesis) -> str:
|
||||
return ""
|
||||
|
||||
output = BytesIO()
|
||||
zf = ZipFile(output, "w")
|
||||
for s in (pool.solutions if is_solution else Synthesis.objects.filter(passage__pool=pool).all()):
|
||||
zf.write("media/" + s.file.name, f"{s}.pdf")
|
||||
for s in (solutions if is_solution else syntheses):
|
||||
if s.file.storage.exists(s.file.path):
|
||||
zf.write("media/" + s.file.name, prefix(s) + f"{s}.pdf")
|
||||
|
||||
zf.close()
|
||||
response = HttpResponse(content_type="application/zip")
|
||||
filename = _("Solutions for pool {pool} of tournament {tournament}.zip") \
|
||||
if is_solution else _("Syntheses for pool {pool} of tournament {tournament}.zip")
|
||||
filename = filename.format(pool=pool.get_letter_display() + str(pool.round), tournament=pool.tournament.name)
|
||||
response["Content-Disposition"] = "attachment; filename=\"{filename}\"" \
|
||||
.format(filename=filename)
|
||||
response.write(output.getvalue())
|
||||
|
Reference in New Issue
Block a user