From 6e31bcc7f1319062458a0919c9bc9341758a86f6 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Wed, 6 May 2020 18:10:33 +0200 Subject: [PATCH] Select teams for final --- apps/tournament/views.py | 41 ++++++++++++++++++----- templates/tournament/team_detail.html | 48 ++++++++++++++++++--------- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/apps/tournament/views.py b/apps/tournament/views.py index 6d36a74..cdb2981 100644 --- a/apps/tournament/views.py +++ b/apps/tournament/views.py @@ -158,6 +158,26 @@ class TeamDetailView(LoginRequiredMixin, DetailView): elif "delete" in request.POST and request.user.organizes: team.delete() return redirect('tournament:detail', pk=team.tournament.pk) + elif "select_final" in request.POST and request.user.admin and not team.selected_for_final and team.pools: + for solution in team.solutions.all(): + alphabet = "0123456789abcdefghijklmnopqrstuvwxyz0123456789" + id = "" + for i in range(64): + id += random.choice(alphabet) + with solution.file.open("rb") as source: + with open("/code/media/" + id, "wb") as dest: + for chunk in source.chunks(): + dest.write(chunk) + new_sol = Solution( + file=id, + team=team, + problem=solution.problem, + final=True, + ) + new_sol.save() + team.selected_for_final = True + team.save() + return redirect('tournament:team_detail', pk=team.pk) return self.get(request, *args, **kwargs) @@ -238,7 +258,8 @@ class SolutionsView(TeamMixin, BaseFormView, SingleTableView): qs = super().get_queryset() if not self.request.user.admin: qs = qs.filter(team=self.request.user.team) - return qs.order_by('team__tournament__date_start', 'team__tournament__name', 'team__trigram', 'problem',) + return qs.order_by('final', 'team__tournament__date_start', 'team__tournament__name', 'team__trigram', + 'problem',) def form_valid(self, form): solution = form.instance @@ -274,7 +295,7 @@ class SolutionsOrgaListView(OrgaMixin, SingleTableView): def post(self, request, *args, **kwargs): if "tournament_zip" in request.POST: - tournament = Tournament.objects.get(pk=request.POST["tournament_zip"][0]) + tournament = Tournament.objects.get(pk=int(request.POST["tournament_zip"])) solutions = tournament.solutions if not request.user.admin and request.user not in tournament.organizers.all(): raise PermissionDenied @@ -307,7 +328,8 @@ class SolutionsOrgaListView(OrgaMixin, SingleTableView): qs = super().get_queryset() if not self.request.user.admin: qs = qs.filter(team__tournament__organizers=self.request.user) - return qs.order_by('team__tournament__date_start', 'team__tournament__name', 'team__trigram', 'problem',) + return qs.order_by('final', 'team__tournament__date_start', 'team__tournament__name', 'team__trigram', + 'problem',) class SynthesesView(TeamMixin, BaseFormView, SingleTableView): @@ -341,8 +363,8 @@ class SynthesesView(TeamMixin, BaseFormView, SingleTableView): qs = super().get_queryset() if not self.request.user.admin: qs = qs.filter(team=self.request.user.team) - return qs.order_by('team__tournament__date_start', 'team__tournament__name', 'team__trigram', 'round', - 'source',) + return qs.order_by('final', 'team__tournament__date_start', 'team__tournament__name', 'team__trigram', + 'round', 'source',) def get_context_data(self, **kwargs): self.object_list = self.get_queryset() @@ -392,7 +414,7 @@ class SynthesesOrgaListView(OrgaMixin, SingleTableView): def post(self, request, *args, **kwargs): if "tournament_zip" in request.POST: - tournament = Tournament.objects.get(pk=request.POST["tournament_zip"][0]) + tournament = Tournament.objects.get(pk=request.POST["tournament_zip"]) syntheses = tournament.syntheses if not request.user.admin and request.user not in tournament.organizers.all(): raise PermissionDenied @@ -425,8 +447,8 @@ class SynthesesOrgaListView(OrgaMixin, SingleTableView): qs = super().get_queryset() if not self.request.user.admin: qs = qs.filter(team__tournament__organizers=self.request.user) - return qs.order_by('team__tournament__date_start', 'team__tournament__name', 'team__trigram', 'round', - 'source',) + return qs.order_by('final', 'team__tournament__date_start', 'team__tournament__name', 'team__trigram', + 'round', 'source',) class PoolListView(LoginRequiredMixin, SingleTableView): @@ -441,7 +463,8 @@ class PoolListView(LoginRequiredMixin, SingleTableView): qs = qs.filter(Q(juries=user) | Q(teams__tournament__organizers=user)) elif user.participates: qs = qs.filter(teams=user.team) - qs = qs.distinct().order_by('teams__tournament__date_start', 'teams__tournament__name', 'round',) + qs = qs.distinct().order_by('solutions__final', 'teams__tournament__date_start', 'teams__tournament__name', + 'round',) return qs diff --git a/templates/tournament/team_detail.html b/templates/tournament/team_detail.html index cc7b19d..7bf88f9 100644 --- a/templates/tournament/team_detail.html +++ b/templates/tournament/team_detail.html @@ -19,13 +19,15 @@
{{ team.access_code }}
{% trans 'tournament'|capfirst %}
-
{{ team.tournament }}
+
{{ team.tournament }}
{% trans 'coachs'|capfirst %}
{% autoescape off %}{{ team.linked_encadrants|join:", " }}{% endautoescape %}
{% trans 'participants'|capfirst %}
-
{% autoescape off %}{{ team.linked_participants|join:", " }}{% endautoescape %}
+
+ {% autoescape off %}{{ team.linked_participants|join:", " }}{% endautoescape %}
{% trans 'validation status'|capfirst %}
{{ team.get_validation_status_display }}
@@ -40,19 +42,26 @@ {% if user.admin or user in team.tournament.organizers.all or team == user.team %} {% endif %} @@ -75,14 +84,17 @@
Pour demander à valider votre équipe, vous devez avoir au moins un encadrant, quatre participants et soumis une autorisation de droit à l'image, une fiche sanitaire et une autorisation - parentale (si besoin) par participant, ainsi qu'une lettre de motivation à transmettre aux organisateurs. + parentale (si besoin) par participant, ainsi qu'une lettre de motivation à transmettre aux + organisateurs. Les encadrants doivent également fournir une autorisation de droit à l'image.
{% endif %}
- En raison du changement de format du TFJM² 2020, il n'y a plus de document obligatoire à envoyer. Les autorisations - précédemment envoyées ont été détruites. Seules les lettres de motivation ont été conservées, mais leur envoi + En raison du changement de format du TFJM² 2020, il n'y a plus de document obligatoire à envoyer. Les + autorisations + précédemment envoyées ont été détruites. Seules les lettres de motivation ont été conservées, mais leur + envoi n'est plus obligatoire.
{% endif %} @@ -90,7 +102,7 @@ {% if team.waiting %}
- {% trans "The team is waiting about validation." %} + {% trans "The team is waiting about validation." %}
{% if user.admin %} @@ -98,7 +110,8 @@ {% csrf_token %}
- +
@@ -118,7 +131,8 @@ {% if team.motivation_letters.count %}
{% blocktrans %}Motivation letter:{% endblocktrans %} - {% trans "Download" %} + {% trans "Download" %}
{% endif %} @@ -126,7 +140,9 @@