mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2024-12-25 07:02:22 +00:00
Select teams for final
This commit is contained in:
parent
abafdc86d9
commit
6e31bcc7f1
@ -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
|
||||
|
||||
|
||||
|
@ -19,13 +19,15 @@
|
||||
<dd class="col-xl-6">{{ team.access_code }}</dd>
|
||||
|
||||
<dt class="col-xl-6 text-right">{% trans 'tournament'|capfirst %}</dt>
|
||||
<dd class="col-xl-6"><a href="{% url "tournament:detail" pk=team.tournament.pk %}">{{ team.tournament }}</a></dd>
|
||||
<dd class="col-xl-6"><a
|
||||
href="{% url "tournament:detail" pk=team.tournament.pk %}">{{ team.tournament }}</a></dd>
|
||||
|
||||
<dt class="col-xl-6 text-right">{% trans 'coachs'|capfirst %}</dt>
|
||||
<dd class="col-xl-6">{% autoescape off %}{{ team.linked_encadrants|join:", " }}{% endautoescape %}</dd>
|
||||
|
||||
<dt class="col-xl-6 text-right">{% trans 'participants'|capfirst %}</dt>
|
||||
<dd class="col-xl-6">{% autoescape off %}{{ team.linked_participants|join:", " }}{% endautoescape %}</dd>
|
||||
<dd class="col-xl-6">
|
||||
{% autoescape off %}{{ team.linked_participants|join:", " }}{% endautoescape %}</dd>
|
||||
|
||||
<dt class="col-xl-6 text-right">{% trans 'validation status'|capfirst %}</dt>
|
||||
<dd class="col-xl-6">{{ team.get_validation_status_display }}</dd>
|
||||
@ -40,19 +42,26 @@
|
||||
|
||||
{% if user.admin or user in team.tournament.organizers.all or team == user.team %}
|
||||
<div class="card-footer text-center">
|
||||
{% if team.invalid or user.organizes %}
|
||||
<a href="{% url "tournament:team_update" pk=team.pk %}"><button class="btn btn-secondary">{% trans "Edit team" %}</button></a>
|
||||
{% endif %}
|
||||
{% if team.invalid %}
|
||||
<form method="post">
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{% if team.invalid or user.organizes %}
|
||||
<a class="btn btn-secondary" href="{% url "tournament:team_update" pk=team.pk %}">
|
||||
{% trans "Edit team" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if team.valid and user.admin and not team.selected_for_final and team.pools %}
|
||||
<button name="select_final" class="btn btn-success">{% trans "Select for final" %}</button>
|
||||
{% endif %}
|
||||
{% if team.invalid %}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{% if user.admin %}
|
||||
<button name="delete" class="btn btn-danger">{% trans "Delete team" %}</button>
|
||||
{% elif team == user.team %}
|
||||
<button name="leave" class="btn btn-danger">{% trans "Leave this team" %}</button>
|
||||
{% endif %}
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
@ -75,14 +84,17 @@
|
||||
<div class="alert alert-warning">
|
||||
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.
|
||||
</div>
|
||||
{% endif %}
|
||||
<hr>
|
||||
<div class="alert alert-danger">
|
||||
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.
|
||||
</div>
|
||||
{% endif %}
|
||||
@ -90,7 +102,7 @@
|
||||
{% if team.waiting %}
|
||||
<hr>
|
||||
<div class="alert alert-warning">
|
||||
{% trans "The team is waiting about validation." %}
|
||||
{% trans "The team is waiting about validation." %}
|
||||
</div>
|
||||
|
||||
{% if user.admin %}
|
||||
@ -98,7 +110,8 @@
|
||||
{% csrf_token %}
|
||||
<div class="form-group row">
|
||||
<label for="message">{% trans "Message addressed to the team:" %}</label>
|
||||
<textarea class="form-control" id="message" name="message" placeholder="{% trans "Message..." %}"></textarea>
|
||||
<textarea class="form-control" id="message" name="message"
|
||||
placeholder="{% trans "Message..." %}"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
@ -118,7 +131,8 @@
|
||||
{% if team.motivation_letters.count %}
|
||||
<div class="alert alert-info">
|
||||
<strong>{% blocktrans %}Motivation letter:{% endblocktrans %}</strong>
|
||||
<a data-turbolinks="false" href="{% url "document" file=team.motivation_letters.last.file %}">{% trans "Download" %}</a>
|
||||
<a data-turbolinks="false"
|
||||
href="{% url "document" file=team.motivation_letters.last.file %}">{% trans "Download" %}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@ -126,7 +140,9 @@
|
||||
<div class="alert alert-info">
|
||||
<ul>
|
||||
{% for solution in ordered_solutions %}
|
||||
<li><strong>{{ solution }} :</strong> <a data-turbolinks="false" href="{% url "document" file=solution.file %}">{% trans "Download" %}</a></li>
|
||||
<li><strong>{{ solution }} :</strong> <a data-turbolinks="false"
|
||||
href="{% url "document" file=solution.file %}">{% trans "Download" %}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
Loading…
Reference in New Issue
Block a user