mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-10-31 06:49:52 +01:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			c8780a6d9d
			...
			61703b130d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 61703b130d | ||
|  | a97541064e | ||
|  | ef785a5eb8 | ||
|  | be8904079d | 
| @@ -12,6 +12,8 @@ class ParticipationConfig(AppConfig): | ||||
|     name = 'participation' | ||||
|  | ||||
|     def ready(self): | ||||
|         from participation.signals import create_team_participation, update_mailing_list | ||||
|         from participation.signals import create_notes, create_team_participation, update_mailing_list | ||||
|         pre_save.connect(update_mailing_list, "participation.Team") | ||||
|         post_save.connect(create_team_participation, "participation.Team") | ||||
|         post_save.connect(create_notes, "participation.Passage") | ||||
|         post_save.connect(create_notes, "participation.Pool") | ||||
|   | ||||
| @@ -9,7 +9,7 @@ from django.core.exceptions import ValidationError | ||||
| from django.utils import formats | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
|  | ||||
| from .models import Participation, Passage, Pool, Team, Tournament, Solution, Synthesis | ||||
| from .models import Note, Participation, Passage, Pool, Team, Tournament, Solution, Synthesis | ||||
|  | ||||
|  | ||||
| class TeamForm(forms.ModelForm): | ||||
| @@ -173,3 +173,10 @@ class SynthesisForm(forms.ModelForm): | ||||
|     class Meta: | ||||
|         model = Synthesis | ||||
|         fields = ('type', 'file',) | ||||
|  | ||||
|  | ||||
| class NoteForm(forms.ModelForm): | ||||
|     class Meta: | ||||
|         model = Note | ||||
|         fields = ('defender_writing', 'defender_oral', 'opponent_writing', | ||||
|                   'opponent_oral', 'reporter_writing', 'reporter_oral', ) | ||||
|   | ||||
							
								
								
									
										33
									
								
								apps/participation/migrations/0011_note.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								apps/participation/migrations/0011_note.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| # Generated by Django 3.0.11 on 2021-01-14 16:59 | ||||
|  | ||||
| from django.db import migrations, models | ||||
| import django.db.models.deletion | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|  | ||||
|     dependencies = [ | ||||
|         ('registration', '0001_initial'), | ||||
|         ('participation', '0010_passage_solution_number'), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.CreateModel( | ||||
|             name='Note', | ||||
|             fields=[ | ||||
|                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||||
|                 ('defender_writing', models.PositiveSmallIntegerField(choices=[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16), (17, 17), (18, 18), (19, 19), (20, 20)], default=0, verbose_name='defender writing note')), | ||||
|                 ('defender_oral', models.PositiveSmallIntegerField(choices=[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16)], default=0, verbose_name='defender oral note')), | ||||
|                 ('opponent_writing', models.PositiveSmallIntegerField(choices=[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)], default=0, verbose_name='opponent writing note')), | ||||
|                 ('opponent_oral', models.PositiveSmallIntegerField(choices=[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=0, verbose_name='opponent oral note')), | ||||
|                 ('reporter_writing', models.PositiveSmallIntegerField(choices=[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)], default=0, verbose_name='reporter writing note')), | ||||
|                 ('reporter_oral', models.PositiveSmallIntegerField(choices=[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=0, verbose_name='reporter oral note')), | ||||
|                 ('jury', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='registration.VolunteerRegistration', verbose_name='jury')), | ||||
|                 ('passage', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='participation.Passage', verbose_name='passage')), | ||||
|             ], | ||||
|             options={ | ||||
|                 'verbose_name': 'note', | ||||
|                 'verbose_name_plural': 'notes', | ||||
|             }, | ||||
|         ), | ||||
|     ] | ||||
| @@ -311,6 +311,9 @@ class Pool(models.Model): | ||||
|     def solutions(self): | ||||
|         return Solution.objects.filter(participation__in=self.participations, final_solution=self.tournament.final) | ||||
|  | ||||
|     def average(self, participation): | ||||
|         return sum(passage.average(participation) for passage in self.passages.all()) | ||||
|  | ||||
|     def get_absolute_url(self): | ||||
|         return reverse_lazy("participation:pool_detail", args=(self.pk,)) | ||||
|  | ||||
| @@ -375,6 +378,50 @@ class Passage(models.Model): | ||||
|             problem=self.solution_number, | ||||
|             final_solution=self.pool.tournament.final) | ||||
|  | ||||
|     def avg(self, iterator) -> int: | ||||
|         items = [i for i in iterator if i] | ||||
|         return sum(items) / len(items) if items else 0 | ||||
|  | ||||
|     @property | ||||
|     def average_defender_writing(self) -> int: | ||||
|         return self.avg(note.defender_writing for note in self.notes.all()) | ||||
|  | ||||
|     @property | ||||
|     def average_defender_oral(self) -> int: | ||||
|         return self.avg(note.defender_oral for note in self.notes.all()) | ||||
|  | ||||
|     @property | ||||
|     def average_defender(self) -> int: | ||||
|         return self.average_defender_writing + 2 * self.average_defender_oral | ||||
|  | ||||
|     @property | ||||
|     def average_opponent_writing(self) -> int: | ||||
|         return self.avg(note.opponent_writing for note in self.notes.all()) | ||||
|  | ||||
|     @property | ||||
|     def average_opponent_oral(self) -> int: | ||||
|         return self.avg(note.opponent_oral for note in self.notes.all()) | ||||
|  | ||||
|     @property | ||||
|     def average_opponent(self) -> int: | ||||
|         return self.average_opponent_writing + 2 * self.average_opponent_oral | ||||
|  | ||||
|     @property | ||||
|     def average_reporter_writing(self) -> int: | ||||
|         return self.avg(note.reporter_writing for note in self.notes.all()) | ||||
|  | ||||
|     @property | ||||
|     def average_reporter_oral(self) -> int: | ||||
|         return self.avg(note.reporter_oral for note in self.notes.all()) | ||||
|  | ||||
|     @property | ||||
|     def average_reporter(self) -> int: | ||||
|         return self.average_reporter_writing + self.average_reporter_oral | ||||
|  | ||||
|     def average(self, participation): | ||||
|         return self.average_defender if participation == self.defender else self.average_opponent \ | ||||
|             if participation == self.opponent else self.average_reporter if participation == self.reporter else 0 | ||||
|  | ||||
|     def get_absolute_url(self): | ||||
|         return reverse_lazy("participation:passage_detail", args=(self.pk,)) | ||||
|  | ||||
| @@ -482,3 +529,69 @@ class Synthesis(models.Model): | ||||
|         verbose_name = _("synthesis") | ||||
|         verbose_name_plural = _("syntheses") | ||||
|         unique_together = (('participation', 'passage', 'type', ), ) | ||||
|  | ||||
|  | ||||
| class Note(models.Model): | ||||
|     jury = models.ForeignKey( | ||||
|         VolunteerRegistration, | ||||
|         on_delete=models.CASCADE, | ||||
|         verbose_name=_("jury"), | ||||
|         related_name="notes", | ||||
|     ) | ||||
|  | ||||
|     passage = models.ForeignKey( | ||||
|         Passage, | ||||
|         on_delete=models.CASCADE, | ||||
|         verbose_name=_("passage"), | ||||
|         related_name="notes", | ||||
|     ) | ||||
|  | ||||
|     defender_writing = models.PositiveSmallIntegerField( | ||||
|         verbose_name=_("defender writing note"), | ||||
|         choices=[(i, i) for i in range(0, 21)], | ||||
|         default=0, | ||||
|     ) | ||||
|  | ||||
|     defender_oral = models.PositiveSmallIntegerField( | ||||
|         verbose_name=_("defender oral note"), | ||||
|         choices=[(i, i) for i in range(0, 17)], | ||||
|         default=0, | ||||
|     ) | ||||
|  | ||||
|     opponent_writing = models.PositiveSmallIntegerField( | ||||
|         verbose_name=_("opponent writing note"), | ||||
|         choices=[(i, i) for i in range(0, 10)], | ||||
|         default=0, | ||||
|     ) | ||||
|  | ||||
|     opponent_oral = models.PositiveSmallIntegerField( | ||||
|         verbose_name=_("opponent oral note"), | ||||
|         choices=[(i, i) for i in range(0, 11)], | ||||
|         default=0, | ||||
|     ) | ||||
|  | ||||
|     reporter_writing = models.PositiveSmallIntegerField( | ||||
|         verbose_name=_("reporter writing note"), | ||||
|         choices=[(i, i) for i in range(0, 10)], | ||||
|         default=0, | ||||
|     ) | ||||
|  | ||||
|     reporter_oral = models.PositiveSmallIntegerField( | ||||
|         verbose_name=_("reporter oral note"), | ||||
|         choices=[(i, i) for i in range(0, 11)], | ||||
|         default=0, | ||||
|     ) | ||||
|  | ||||
|     def get_absolute_url(self): | ||||
|         return reverse_lazy("participation:passage_detail", args=(self.passage.pk,)) | ||||
|  | ||||
|     def __str__(self): | ||||
|         return _("Notes of {jury} for {passage}").format(jury=self.jury, passage=self.passage) | ||||
|  | ||||
|     def __bool__(self): | ||||
|         return any((self.defender_writing, self.defender_oral, self.opponent_writing, self.opponent_oral, | ||||
|                    self.reporter_writing, self.reporter_oral)) | ||||
|  | ||||
|     class Meta: | ||||
|         verbose_name = _("note") | ||||
|         verbose_name_plural = _("notes") | ||||
|   | ||||
| @@ -1,7 +1,8 @@ | ||||
| # Copyright (C) 2020 by Animath | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
| from typing import Union | ||||
|  | ||||
| from participation.models import Participation, Team | ||||
| from participation.models import Note, Participation, Passage, Pool, Team | ||||
| from tfjm.lists import get_sympa_client | ||||
|  | ||||
|  | ||||
| @@ -33,3 +34,13 @@ def update_mailing_list(instance: Team, **_): | ||||
|             for coach in instance.coachs.all(): | ||||
|                 get_sympa_client().subscribe(coach.user.email, f"equipe-{instance.trigram.lower()}", False, | ||||
|                                              f"{coach.user.first_name} {coach.user.last_name}") | ||||
|  | ||||
|  | ||||
| def create_notes(instance: Union[Passage, Pool], **_): | ||||
|     if isinstance(instance, Pool): | ||||
|         for passage in instance.passages.all(): | ||||
|             create_notes(passage) | ||||
|         return | ||||
|  | ||||
|     for jury in instance.pool.juries.all(): | ||||
|         Note.objects.get_or_create(jury=jury, passage=instance) | ||||
|   | ||||
| @@ -6,7 +6,7 @@ from django.utils.text import format_lazy | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| import django_tables2 as tables | ||||
|  | ||||
| from .models import Pool, Team, Tournament | ||||
| from .models import Note, Pool, Team, Tournament | ||||
|  | ||||
|  | ||||
| # noinspection PyTypeChecker | ||||
| @@ -19,7 +19,7 @@ class TeamTable(tables.Table): | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table condensed table-striped', | ||||
|             'class': 'table table-condensed table-striped', | ||||
|         } | ||||
|         model = Team | ||||
|         fields = ('name', 'trigram',) | ||||
| @@ -51,7 +51,7 @@ class ParticipationTable(tables.Table): | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table condensed table-striped', | ||||
|             'class': 'table table-condensed table-striped', | ||||
|         } | ||||
|         model = Team | ||||
|         fields = ('name', 'trigram', 'valid',) | ||||
| @@ -70,7 +70,7 @@ class TournamentTable(tables.Table): | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table condensed table-striped', | ||||
|             'class': 'table table-condensed table-striped', | ||||
|         } | ||||
|         model = Tournament | ||||
|         fields = ('name', 'date',) | ||||
| @@ -91,8 +91,27 @@ class PoolTable(tables.Table): | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table condensed table-striped', | ||||
|             'class': 'table table-condensed table-striped', | ||||
|         } | ||||
|         model = Pool | ||||
|         fields = ('teams', 'round', 'tournament',) | ||||
|         template_name = 'django_tables2/bootstrap4.html' | ||||
|  | ||||
|  | ||||
| class NoteTable(tables.Table): | ||||
|     jury = tables.Column( | ||||
|         attrs={ | ||||
|             "td": { | ||||
|                 "class": "text-nowrap", | ||||
|             } | ||||
|         } | ||||
|     ) | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table-condensed table-striped text-center', | ||||
|         } | ||||
|         model = Note | ||||
|         fields = ('jury', 'defender_writing', 'defender_oral', 'opponent_writing', 'opponent_oral', | ||||
|                   'reporter_writing', 'reporter_oral',) | ||||
|         template_name = 'django_tables2/bootstrap4.html' | ||||
|   | ||||
							
								
								
									
										13
									
								
								apps/participation/templates/participation/note_form.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								apps/participation/templates/participation/note_form.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| {% extends "base.html" %} | ||||
|  | ||||
| {% load crispy_forms_filters i18n %} | ||||
|  | ||||
| {% block content %} | ||||
|     <form method="post"> | ||||
|         <div id="form-content"> | ||||
|             {% csrf_token %} | ||||
|             {{ form|crispy }} | ||||
|         </div> | ||||
|         <button class="btn btn-primary" type="submit">{% trans "Update" %}</button> | ||||
|     </form> | ||||
| {% endblock content %} | ||||
| @@ -1,6 +1,6 @@ | ||||
| {% extends "base.html" %} | ||||
|  | ||||
| {% load i18n %} | ||||
| {% load django_tables2 i18n %} | ||||
|  | ||||
| {% block content %} | ||||
| {% trans "any" as any %} | ||||
| @@ -40,6 +40,7 @@ | ||||
|         </div> | ||||
|         {% if user.registration.is_admin %} | ||||
|             <div class="card-footer text-center"> | ||||
|                 <button class="btn btn-info" data-toggle="modal" data-target="#updateNotesModal">{% trans "Update notes" %}</button> | ||||
|                 <button class="btn btn-primary" data-toggle="modal" data-target="#updatePassageModal">{% trans "Update" %}</button> | ||||
|             </div> | ||||
|         {% elif user.registration.participates %} | ||||
| @@ -49,11 +50,61 @@ | ||||
|         {% endif %} | ||||
|     </div> | ||||
|  | ||||
|     {% if notes %} | ||||
|         <hr> | ||||
|  | ||||
|         <h2>{% trans "Notes detail" %}</h2> | ||||
|  | ||||
|         {% render_table notes %} | ||||
|  | ||||
|         <div class="card bg-light shadow"> | ||||
|             <div class="card-body"> | ||||
|                 <dl class="row"> | ||||
|                     <dt class="col-sm-8">{% trans "Average points for the defender writing:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_defender_writing }}/20</dd> | ||||
|  | ||||
|                     <dt class="col-sm-8">{% trans "Average points for the defender oral:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_defender_oral }}/16</dd> | ||||
|  | ||||
|                     <dt class="col-sm-8">{% trans "Average points for the opponent writing:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_opponent_writing }}/9</dd> | ||||
|  | ||||
|                     <dt class="col-sm-8">{% trans "Average points for the opponent oral:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_opponent_oral }}/10</dd> | ||||
|  | ||||
|                     <dt class="col-sm-8">{% trans "Average points for the reporter writing:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_reporter_writing }}/9</dd> | ||||
|  | ||||
|                     <dt class="col-sm-8">{% trans "Average points for the reporter oral:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_reporter_oral }}/10</dd> | ||||
|                 </dl> | ||||
|  | ||||
|                 <hr> | ||||
|  | ||||
|                 <dl class="row"> | ||||
|                     <dt class="col-sm-8">{% trans "Defender points:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_defender }}/52</dd> | ||||
|  | ||||
|                     <dt class="col-sm-8">{% trans "Opponent points:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_opponent }}/29</dd> | ||||
|  | ||||
|                     <dt class="col-sm-8">{% trans "Reporter points:" %}</dt> | ||||
|                     <dd class="col-sm-4">{{ passage.average_reporter }}/19</dd> | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     {% endif %} | ||||
|  | ||||
|     {% if user.registration.is_admin %} | ||||
|         {% trans "Update passage" as modal_title %} | ||||
|         {% trans "Update" as modal_button %} | ||||
|         {% url "participation:passage_update" pk=passage.pk as modal_action %} | ||||
|         {% include "base_modal.html" with modal_id="updatePassage" %} | ||||
|  | ||||
|         {% trans "Update notes" as modal_title %} | ||||
|         {% trans "Update" as modal_button %} | ||||
|         {% url "participation:update_notes" pk=my_note.pk as modal_action %} | ||||
|         {% include "base_modal.html" with modal_id="updateNotes" %} | ||||
|     {% elif user.registration.participates %} | ||||
|         {% trans "Upload synthesis" as modal_title %} | ||||
|         {% trans "Upload" as modal_button %} | ||||
| @@ -71,6 +122,12 @@ | ||||
|                     if (!modalBody.html().trim()) | ||||
|                         modalBody.load("{% url "participation:passage_update" pk=passage.pk %} #form-content") | ||||
|                 }); | ||||
|  | ||||
|                 $('button[data-target="#updateNotesModal"]').click(function() { | ||||
|                     let modalBody = $("#updateNotesModal div.modal-body"); | ||||
|                     if (!modalBody.html().trim()) | ||||
|                         modalBody.load("{% url "participation:update_notes" pk=my_note.pk %} #form-content") | ||||
|                 }); | ||||
|             {% elif user.registration.participates %} | ||||
|                 $('button[data-target="#uploadSynthesisModal"]').click(function() { | ||||
|                     let modalBody = $("#uploadSynthesisModal div.modal-body"); | ||||
|   | ||||
| @@ -5,7 +5,7 @@ from django.urls import path | ||||
| from django.views.generic import TemplateView | ||||
|  | ||||
| from .views import CreateTeamView, JoinTeamView, \ | ||||
|     MyParticipationDetailView, MyTeamDetailView, ParticipationDetailView, \ | ||||
|     MyParticipationDetailView, MyTeamDetailView, NoteUpdateView, ParticipationDetailView, \ | ||||
|     PassageCreateView, PassageDetailView, PassageUpdateView, PoolCreateView, PoolDetailView, \ | ||||
|     PoolUpdateView, PoolUpdateTeamsView, TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamListView, \ | ||||
|     TeamUpdateView, TournamentCreateView, TournamentDetailView, TournamentListView, TournamentUpdateView, \ | ||||
| @@ -38,5 +38,6 @@ urlpatterns = [ | ||||
|     path("pools/passages/<int:pk>/", PassageDetailView.as_view(), name="passage_detail"), | ||||
|     path("pools/passages/<int:pk>/update/", PassageUpdateView.as_view(), name="passage_update"), | ||||
|     path("pools/passages/<int:pk>/solution/", SynthesisUploadView.as_view(), name="upload_synthesis"), | ||||
|     path("pools/passages/notes/<int:pk>/", NoteUpdateView.as_view(), name="update_notes"), | ||||
|     path("chat/", TemplateView.as_view(template_name="participation/chat.html"), name="chat") | ||||
| ] | ||||
|   | ||||
| @@ -23,10 +23,10 @@ from tfjm.lists import get_sympa_client | ||||
| from tfjm.matrix import Matrix | ||||
| from tfjm.views import AdminMixin | ||||
|  | ||||
| from .forms import JoinTeamForm, ParticipationForm, PassageForm, PoolForm, PoolTeamsForm, RequestValidationForm, \ | ||||
|     TeamForm, TournamentForm, ValidateParticipationForm, SolutionForm, SynthesisForm | ||||
| from .models import Participation, Passage, Pool, Team, Tournament, Solution, Synthesis | ||||
| from .tables import TeamTable, TournamentTable, ParticipationTable, PoolTable | ||||
| from .forms import JoinTeamForm, NoteForm, ParticipationForm, PassageForm, PoolForm, PoolTeamsForm, \ | ||||
|     RequestValidationForm, TeamForm, TournamentForm, ValidateParticipationForm, SolutionForm, SynthesisForm | ||||
| from .models import Note, Participation, Passage, Pool, Team, Tournament, Solution, Synthesis | ||||
| from .tables import TeamTable, TournamentTable, ParticipationTable, PoolTable, NoteTable | ||||
|  | ||||
|  | ||||
| class CreateTeamView(LoginRequiredMixin, CreateView): | ||||
| @@ -513,6 +513,13 @@ class PassageCreateView(AdminMixin, CreateView): | ||||
| class PassageDetailView(LoginRequiredMixin, DetailView): | ||||
|     model = Passage | ||||
|  | ||||
|     def get_context_data(self, **kwargs): | ||||
|         context = super().get_context_data(**kwargs) | ||||
|         if self.request.user.registration in self.object.pool.juries.all(): | ||||
|             context["my_note"] = Note.objects.get(passage=self.object, jury=self.request.user.registration) | ||||
|             context["notes"] = NoteTable([note for note in self.object.notes.all() if note]) | ||||
|         return context | ||||
|  | ||||
|  | ||||
| class PassageUpdateView(AdminMixin, UpdateView): | ||||
|     model = Passage | ||||
| @@ -551,3 +558,8 @@ class SynthesisUploadView(LoginRequiredMixin, FormView): | ||||
|  | ||||
|     def get_success_url(self): | ||||
|         return reverse_lazy("participation:passage_detail", args=(self.passage.pk,)) | ||||
|  | ||||
|  | ||||
| class NoteUpdateView(LoginRequiredMixin, UpdateView): | ||||
|     model = Note | ||||
|     form_class = NoteForm | ||||
|   | ||||
| @@ -20,7 +20,7 @@ class RegistrationTable(tables.Table): | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table condensed table-striped', | ||||
|             'class': 'table table-condensed table-striped', | ||||
|         } | ||||
|         model = Registration | ||||
|         fields = ('last_name', 'user__first_name', 'user__email', 'type',) | ||||
|   | ||||
| @@ -7,7 +7,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: TFJM\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2021-01-01 17:06+0100\n" | ||||
| "POT-Creation-Date: 2021-01-14 18:57+0100\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: Yohann D'ANELLO <yohann.danello@animath.fr>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @@ -99,205 +99,336 @@ msgstr "changelogs" | ||||
| msgid "Changelog of type \"{action}\" for model {model} at {timestamp}" | ||||
| msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}" | ||||
|  | ||||
| #: apps/participation/admin.py:19 apps/participation/models.py:258 | ||||
| #: apps/participation/admin.py:19 apps/participation/models.py:261 | ||||
| #: apps/participation/tables.py:44 | ||||
| msgid "valid" | ||||
| msgstr "valide" | ||||
|  | ||||
| #: apps/participation/forms.py:23 apps/participation/models.py:33 | ||||
| #: apps/participation/forms.py:22 apps/participation/models.py:36 | ||||
| msgid "The trigram must be composed of three uppercase letters." | ||||
| msgstr "Le trigramme doit être composé de trois lettres majuscules." | ||||
|  | ||||
| #: apps/participation/forms.py:38 | ||||
| #: apps/participation/forms.py:37 | ||||
| msgid "No team was found with this access code." | ||||
| msgstr "Aucune équipe n'a été trouvée avec ce code d'accès." | ||||
|  | ||||
| #: apps/participation/forms.py:72 | ||||
| #: apps/participation/forms.py:71 | ||||
| msgid "I engage myself to participate to the whole \"Correspondances\"." | ||||
| msgstr "Je m'engage à participer à l'intégralité du TFJM²." | ||||
|  | ||||
| #: apps/participation/forms.py:87 | ||||
| #: apps/participation/forms.py:86 | ||||
| msgid "Message to address to the team:" | ||||
| msgstr "Message à adresser à l'équipe :" | ||||
|  | ||||
| #: apps/participation/models.py:26 apps/participation/models.py:123 | ||||
| #: apps/participation/tables.py:16 apps/participation/tables.py:33 | ||||
| #: apps/participation/forms.py:155 | ||||
| msgid "The defender, the opponent and the reporter must be different." | ||||
| msgstr "Le défenseur, l'opposant et le rapporteur doivent être différents." | ||||
|  | ||||
| #: apps/participation/forms.py:159 | ||||
| msgid "This defender did not work on this problem." | ||||
| msgstr "Ce défenseur ne travaille pas sur ce problème." | ||||
|  | ||||
| #: apps/participation/models.py:29 apps/participation/models.py:126 | ||||
| #: apps/participation/tables.py:17 apps/participation/tables.py:34 | ||||
| msgid "name" | ||||
| msgstr "nom" | ||||
|  | ||||
| #: apps/participation/models.py:32 apps/participation/tables.py:38 | ||||
| #: apps/participation/models.py:35 apps/participation/tables.py:39 | ||||
| msgid "trigram" | ||||
| msgstr "trigramme" | ||||
|  | ||||
| #: apps/participation/models.py:40 | ||||
| #: apps/participation/models.py:43 | ||||
| msgid "access code" | ||||
| msgstr "code d'accès" | ||||
|  | ||||
| #: apps/participation/models.py:41 | ||||
| #: apps/participation/models.py:44 | ||||
| msgid "The access code let other people to join the team." | ||||
| msgstr "Le code d'accès permet aux autres participants de rejoindre l'équipe." | ||||
|  | ||||
| #: apps/participation/models.py:110 | ||||
| #: apps/participation/models.py:113 | ||||
| #, python-brace-format | ||||
| msgid "Team {name} ({trigram})" | ||||
| msgstr "Équipe {name} ({trigram})" | ||||
|  | ||||
| #: apps/participation/models.py:113 apps/participation/models.py:243 | ||||
| #: apps/participation/models.py:116 apps/participation/models.py:246 | ||||
| #: apps/registration/models.py:119 | ||||
| msgid "team" | ||||
| msgstr "équipe" | ||||
|  | ||||
| #: apps/participation/models.py:114 | ||||
| #: apps/participation/models.py:117 apps/participation/tables.py:84 | ||||
| msgid "teams" | ||||
| msgstr "équipes" | ||||
|  | ||||
| #: apps/participation/models.py:128 | ||||
| #: apps/participation/models.py:131 | ||||
| msgid "start" | ||||
| msgstr "début" | ||||
|  | ||||
| #: apps/participation/models.py:133 | ||||
| #: apps/participation/models.py:136 | ||||
| msgid "end" | ||||
| msgstr "fin" | ||||
|  | ||||
| #: apps/participation/models.py:138 | ||||
| #: apps/participation/models.py:141 apps/participation/models.py:340 | ||||
| #: apps/participation/templates/participation/tournament_detail.html:18 | ||||
| msgid "place" | ||||
| msgstr "lieu" | ||||
|  | ||||
| #: apps/participation/models.py:142 | ||||
| #: apps/participation/models.py:145 | ||||
| msgid "max team count" | ||||
| msgstr "nombre maximal d'équipes" | ||||
|  | ||||
| #: apps/participation/models.py:147 | ||||
| #: apps/participation/models.py:150 | ||||
| #: apps/participation/templates/participation/tournament_detail.html:21 | ||||
| msgid "price" | ||||
| msgstr "prix" | ||||
|  | ||||
| #: apps/participation/models.py:152 | ||||
| #: apps/participation/models.py:155 | ||||
| msgid "limit date for registrations" | ||||
| msgstr "date limite d'inscription" | ||||
|  | ||||
| #: apps/participation/models.py:157 | ||||
| #: apps/participation/models.py:160 | ||||
| msgid "limit date to upload solutions" | ||||
| msgstr "date limite pour envoyer les solutions" | ||||
|  | ||||
| #: apps/participation/models.py:162 | ||||
| #: apps/participation/models.py:165 | ||||
| msgid "random draw for solutions" | ||||
| msgstr "tirage au sort des solutions" | ||||
|  | ||||
| #: apps/participation/models.py:167 | ||||
| #: apps/participation/models.py:170 | ||||
| msgid "limit date to upload the syntheses for the first phase" | ||||
| msgstr "date limite pour envoyer les notes de synthèses pour la première phase" | ||||
|  | ||||
| #: apps/participation/models.py:172 | ||||
| #: apps/participation/models.py:175 | ||||
| msgid "date when the solutions for the second round become available" | ||||
| msgstr "date à laquelle les solutions pour le second tour sont accessibles" | ||||
|  | ||||
| #: apps/participation/models.py:177 | ||||
| #: apps/participation/models.py:180 | ||||
| msgid "limit date to upload the syntheses for the second phase" | ||||
| msgstr "date limite d'envoi des notes de synthèse pour la seconde phase" | ||||
|  | ||||
| #: apps/participation/models.py:182 | ||||
| #: apps/participation/models.py:185 | ||||
| #: apps/participation/templates/participation/tournament_detail.html:45 | ||||
| msgid "description" | ||||
| msgstr "description" | ||||
|  | ||||
| #: apps/participation/models.py:188 | ||||
| #: apps/participation/models.py:191 | ||||
| #: apps/participation/templates/participation/tournament_detail.html:12 | ||||
| msgid "organizers" | ||||
| msgstr "organisateurs" | ||||
|  | ||||
| #: apps/participation/models.py:193 | ||||
| #: apps/participation/models.py:196 | ||||
| msgid "final" | ||||
| msgstr "finale" | ||||
|  | ||||
| #: apps/participation/models.py:228 apps/participation/models.py:252 | ||||
| #: apps/participation/models.py:278 | ||||
| #: apps/participation/models.py:231 apps/participation/models.py:255 | ||||
| #: apps/participation/models.py:287 | ||||
| msgid "tournament" | ||||
| msgstr "tournoi" | ||||
|  | ||||
| #: apps/participation/models.py:229 | ||||
| #: apps/participation/models.py:232 | ||||
| msgid "tournaments" | ||||
| msgstr "tournois" | ||||
|  | ||||
| #: apps/participation/models.py:259 | ||||
| #: apps/participation/models.py:262 | ||||
| msgid "The participation got the validation of the organizers." | ||||
| msgstr "La participation a été validée par les organisateurs." | ||||
|  | ||||
| #: apps/participation/models.py:266 | ||||
| #: apps/participation/models.py:267 | ||||
| msgid "selected for final" | ||||
| msgstr "sélectionnée pour la finale" | ||||
|  | ||||
| #: apps/participation/models.py:268 | ||||
| msgid "The team is selected for the final tournament." | ||||
| msgstr "L'équipe est sélectionnée pour la finale." | ||||
|  | ||||
| #: apps/participation/models.py:275 | ||||
| #, python-brace-format | ||||
| msgid "Participation of the team {name} ({trigram})" | ||||
| msgstr "Participation de l'équipe {name} ({trigram})" | ||||
|  | ||||
| #: apps/participation/models.py:269 apps/participation/models.py:313 | ||||
| #: apps/participation/models.py:347 | ||||
| #: apps/participation/models.py:278 apps/participation/models.py:462 | ||||
| #: apps/participation/models.py:500 | ||||
| msgid "participation" | ||||
| msgstr "participation" | ||||
|  | ||||
| #: apps/participation/models.py:270 apps/participation/models.py:288 | ||||
| #: apps/participation/models.py:279 apps/participation/models.py:301 | ||||
| msgid "participations" | ||||
| msgstr "participations" | ||||
|  | ||||
| #: apps/participation/models.py:282 | ||||
| #: apps/participation/models.py:291 | ||||
| msgid "round" | ||||
| msgstr "tour" | ||||
|  | ||||
| #: apps/participation/models.py:294 | ||||
| #: apps/participation/models.py:293 apps/participation/models.py:294 | ||||
| #, python-brace-format | ||||
| msgid "Round {round}" | ||||
| msgstr "Tour {round}" | ||||
|  | ||||
| #: apps/participation/models.py:307 | ||||
| msgid "juries" | ||||
| msgstr "jurys" | ||||
|  | ||||
| #: apps/participation/models.py:305 apps/participation/models.py:354 | ||||
| #: apps/participation/models.py:321 | ||||
| #, python-brace-format | ||||
| msgid "Pool {round} for tournament {tournament} with teams {teams}" | ||||
| msgstr "Poule {round} du tournoi {tournament} avec les équipes {teams}" | ||||
|  | ||||
| #: apps/participation/models.py:327 apps/participation/models.py:335 | ||||
| msgid "pool" | ||||
| msgstr "poule" | ||||
|  | ||||
| #: apps/participation/models.py:306 | ||||
| #: apps/participation/models.py:328 | ||||
| msgid "pools" | ||||
| msgstr "poules" | ||||
|  | ||||
| #: apps/participation/models.py:318 | ||||
| msgid "problem" | ||||
| msgstr "numéro de problème" | ||||
| #: apps/participation/models.py:342 | ||||
| msgid "Where the solution is presented?" | ||||
| msgstr "Où est-ce que les solutions sont défendues ?" | ||||
|  | ||||
| #: apps/participation/models.py:322 | ||||
| msgid "solution for the final tournament" | ||||
| msgstr "solution pour la finale" | ||||
| #: apps/participation/models.py:347 | ||||
| msgid "defended solution" | ||||
| msgstr "solution défendue" | ||||
|  | ||||
| #: apps/participation/models.py:327 apps/participation/models.py:365 | ||||
| msgid "file" | ||||
| msgstr "fichier" | ||||
| #: apps/participation/models.py:349 apps/participation/models.py:469 | ||||
| #, python-brace-format | ||||
| msgid "Problem #{problem}" | ||||
| msgstr "Problème n°{problem}" | ||||
|  | ||||
| #: apps/participation/models.py:338 | ||||
| msgid "solution" | ||||
| msgstr "solution" | ||||
| #: apps/participation/models.py:356 | ||||
| msgid "defender" | ||||
| msgstr "défenseur" | ||||
|  | ||||
| #: apps/participation/models.py:339 | ||||
| msgid "solutions" | ||||
| msgstr "solutions" | ||||
|  | ||||
| #: apps/participation/models.py:359 | ||||
| #: apps/participation/models.py:363 apps/participation/models.py:512 | ||||
| msgid "opponent" | ||||
| msgstr "opposant" | ||||
|  | ||||
| #: apps/participation/models.py:360 | ||||
| #: apps/participation/models.py:370 apps/participation/models.py:513 | ||||
| msgid "reporter" | ||||
| msgstr "rapporteur" | ||||
|  | ||||
| #: apps/participation/models.py:376 | ||||
| #: apps/participation/models.py:430 apps/participation/models.py:433 | ||||
| #: apps/participation/models.py:436 | ||||
| #, python-brace-format | ||||
| msgid "Team {trigram} is not registered in the pool." | ||||
| msgstr "L'équipe {trigram} n'est pas inscrite dans la poule." | ||||
|  | ||||
| #: apps/participation/models.py:441 | ||||
| #, python-brace-format | ||||
| msgid "Passage of {defender} for problem {problem}" | ||||
| msgstr "Passage de {defender} pour le problème {problem}" | ||||
|  | ||||
| #: apps/participation/models.py:445 apps/participation/models.py:507 | ||||
| #: apps/participation/models.py:545 | ||||
| msgid "passage" | ||||
| msgstr "passage" | ||||
|  | ||||
| #: apps/participation/models.py:446 | ||||
| msgid "passages" | ||||
| msgstr "passages" | ||||
|  | ||||
| #: apps/participation/models.py:467 | ||||
| msgid "problem" | ||||
| msgstr "numéro de problème" | ||||
|  | ||||
| #: apps/participation/models.py:474 | ||||
| msgid "solution for the final tournament" | ||||
| msgstr "solution pour la finale" | ||||
|  | ||||
| #: apps/participation/models.py:479 apps/participation/models.py:518 | ||||
| msgid "file" | ||||
| msgstr "fichier" | ||||
|  | ||||
| #: apps/participation/models.py:487 | ||||
| #, python-brace-format | ||||
| msgid "Solution of team {team} for problem {problem}" | ||||
| msgstr "Solution de l'équipe {team} pour le problème {problem}" | ||||
|  | ||||
| #: apps/participation/models.py:491 | ||||
| msgid "solution" | ||||
| msgstr "solution" | ||||
|  | ||||
| #: apps/participation/models.py:492 | ||||
| msgid "solutions" | ||||
| msgstr "solutions" | ||||
|  | ||||
| #: apps/participation/models.py:526 | ||||
| #, python-brace-format | ||||
| msgid "Synthesis for the {type} of the {passage}" | ||||
| msgstr "Synthèse pour {type} du {passage}" | ||||
|  | ||||
| #: apps/participation/models.py:529 | ||||
| msgid "synthesis" | ||||
| msgstr "note de synthèse" | ||||
|  | ||||
| #: apps/participation/models.py:377 | ||||
| #: apps/participation/models.py:530 | ||||
| msgid "syntheses" | ||||
| msgstr "notes de synthèse" | ||||
|  | ||||
| #: apps/participation/tables.py:54 | ||||
| #: apps/participation/models.py:538 | ||||
| msgid "jury" | ||||
| msgstr "jury" | ||||
|  | ||||
| #: apps/participation/models.py:550 | ||||
| msgid "defender writing note" | ||||
| msgstr "note d'écrit du défenseur" | ||||
|  | ||||
| #: apps/participation/models.py:556 | ||||
| msgid "defender oral note" | ||||
| msgstr "note d'oral du défenseur" | ||||
|  | ||||
| #: apps/participation/models.py:562 | ||||
| msgid "opponent writing note" | ||||
| msgstr "note d'écrit de l'opposant" | ||||
|  | ||||
| #: apps/participation/models.py:568 | ||||
| msgid "opponent oral note" | ||||
| msgstr "note d'oral de l'opposant" | ||||
|  | ||||
| #: apps/participation/models.py:574 | ||||
| msgid "reporter writing note" | ||||
| msgstr "not d'écrit du rapporteur" | ||||
|  | ||||
| #: apps/participation/models.py:580 | ||||
| msgid "reporter oral note" | ||||
| msgstr "note d'oral du rapporteur" | ||||
|  | ||||
| #: apps/participation/models.py:589 | ||||
| #, python-brace-format | ||||
| msgid "Notes of {jury} for {passage}" | ||||
| msgstr "Notes de {jury} pour le {passage}" | ||||
|  | ||||
| #: apps/participation/models.py:596 | ||||
| msgid "note" | ||||
| msgstr "note" | ||||
|  | ||||
| #: apps/participation/models.py:597 | ||||
| msgid "notes" | ||||
| msgstr "notes" | ||||
|  | ||||
| #: apps/participation/tables.py:50 | ||||
| msgid "Validated" | ||||
| msgstr "Validée" | ||||
|  | ||||
| #: apps/participation/tables.py:50 | ||||
| msgid "Validation pending" | ||||
| msgstr "Validation en attente" | ||||
|  | ||||
| #: apps/participation/tables.py:50 | ||||
| msgid "Not validated" | ||||
| msgstr "Non validée" | ||||
|  | ||||
| #: apps/participation/tables.py:64 | ||||
| msgid "date" | ||||
| msgstr "date" | ||||
|  | ||||
| #: apps/participation/tables.py:57 | ||||
| #: apps/participation/tables.py:67 | ||||
| #, python-brace-format | ||||
| msgid "From {start} to {end}" | ||||
| msgstr "Du {start} au {end}" | ||||
|  | ||||
| #: apps/participation/tables.py:90 | ||||
| msgid "No defined team" | ||||
| msgstr "Pas d'équipe définie" | ||||
|  | ||||
| #: apps/participation/templates/participation/chat.html:7 | ||||
| msgid "The chat is located on the dedicated Matrix server:" | ||||
| msgstr "Le chat est situé sur le serveur Matrix dédié au TFJM² :" | ||||
| @@ -343,7 +474,25 @@ msgstr "Créer" | ||||
| msgid "Join" | ||||
| msgstr "Rejoindre" | ||||
|  | ||||
| #: apps/participation/templates/participation/note_form.html:11 | ||||
| #: apps/participation/templates/participation/passage_detail.html:44 | ||||
| #: apps/participation/templates/participation/passage_detail.html:100 | ||||
| #: apps/participation/templates/participation/passage_detail.html:105 | ||||
| #: apps/participation/templates/participation/pool_detail.html:45 | ||||
| #: apps/participation/templates/participation/pool_detail.html:57 | ||||
| #: apps/participation/templates/participation/pool_detail.html:62 | ||||
| #: apps/participation/templates/participation/team_detail.html:84 | ||||
| #: apps/participation/templates/participation/team_detail.html:143 | ||||
| #: apps/participation/templates/participation/tournament_form.html:12 | ||||
| #: apps/participation/templates/participation/update_team.html:12 | ||||
| #: apps/registration/templates/registration/update_user.html:16 | ||||
| #: apps/registration/templates/registration/user_detail.html:106 | ||||
| #: apps/registration/templates/registration/user_detail.html:115 | ||||
| msgid "Update" | ||||
| msgstr "Modifier" | ||||
|  | ||||
| #: apps/participation/templates/participation/participation_detail.html:6 | ||||
| #: apps/participation/templates/participation/passage_detail.html:6 | ||||
| #: apps/participation/templates/participation/team_detail.html:30 | ||||
| #: apps/participation/templates/participation/team_detail.html:39 | ||||
| #: apps/participation/templates/participation/team_detail.html:44 | ||||
| @@ -361,6 +510,169 @@ msgstr "Participation de l'équipe" | ||||
| msgid "Team:" | ||||
| msgstr "Équipe :" | ||||
|  | ||||
| #: apps/participation/templates/participation/participation_detail.html:16 | ||||
| #: apps/participation/templates/participation/pool_detail.html:12 | ||||
| #: apps/participation/templates/participation/team_detail.html:43 | ||||
| msgid "Tournament:" | ||||
| msgstr "Tournoi :" | ||||
|  | ||||
| #: apps/participation/templates/participation/participation_detail.html:19 | ||||
| msgid "Solutions:" | ||||
| msgstr "solutions :" | ||||
|  | ||||
| #: apps/participation/templates/participation/participation_detail.html:24 | ||||
| msgid "No solution was uploaded yet." | ||||
| msgstr "Aucune solution n'a encore été envoyée." | ||||
|  | ||||
| #: apps/participation/templates/participation/participation_detail.html:29 | ||||
| msgid "Pools:" | ||||
| msgstr "Poules :" | ||||
|  | ||||
| #: apps/participation/templates/participation/participation_detail.html:39 | ||||
| #: apps/participation/templates/participation/participation_detail.html:43 | ||||
| msgid "Upload solution" | ||||
| msgstr "Envoyer une solution" | ||||
|  | ||||
| #: apps/participation/templates/participation/participation_detail.html:44 | ||||
| #: apps/participation/templates/participation/passage_detail.html:110 | ||||
| #: apps/participation/templates/participation/upload_solution.html:11 | ||||
| #: apps/participation/templates/participation/upload_synthesis.html:11 | ||||
| #: apps/registration/templates/registration/upload_health_sheet.html:17 | ||||
| #: apps/registration/templates/registration/upload_parental_authorization.html:17 | ||||
| #: apps/registration/templates/registration/upload_photo_authorization.html:18 | ||||
| #: apps/registration/templates/registration/user_detail.html:120 | ||||
| #: apps/registration/templates/registration/user_detail.html:125 | ||||
| #: apps/registration/templates/registration/user_detail.html:130 | ||||
| msgid "Upload" | ||||
| msgstr "Téléverser" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:13 | ||||
| msgid "Pool:" | ||||
| msgstr "Poule :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:16 | ||||
| msgid "Defender:" | ||||
| msgstr "Défenseur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:19 | ||||
| msgid "Opponent:" | ||||
| msgstr "Opposant :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:22 | ||||
| msgid "Reporter:" | ||||
| msgstr "Rapporteur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:25 | ||||
| msgid "Defended solution:" | ||||
| msgstr "Solution défendue" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:28 | ||||
| msgid "Place:" | ||||
| msgstr "Lieu :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:31 | ||||
| msgid "Syntheses:" | ||||
| msgstr "Notes de synthèse :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:36 | ||||
| msgid "No synthesis was uploaded yet." | ||||
| msgstr "Aucune note de synthèse n'a encore été envoyée." | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:43 | ||||
| #: apps/participation/templates/participation/passage_detail.html:104 | ||||
| msgid "Update notes" | ||||
| msgstr "Modifier les notes" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:48 | ||||
| #: apps/participation/templates/participation/passage_detail.html:109 | ||||
| msgid "Upload synthesis" | ||||
| msgstr "Envoyer une note de synthèse" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:56 | ||||
| msgid "Notes detail" | ||||
| msgstr "Détails des notes" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:63 | ||||
| msgid "Average points for the defender writing:" | ||||
| msgstr "Moyenne de l'écrit du défenseur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:66 | ||||
| msgid "Average points for the defender oral:" | ||||
| msgstr "Moyenne de l'oral du défenseur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:69 | ||||
| msgid "Average points for the opponent writing:" | ||||
| msgstr "Moyenne de l'écrit de l'opposant :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:72 | ||||
| msgid "Average points for the opponent oral:" | ||||
| msgstr "Moyenne de l'oral de l'opposant :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:75 | ||||
| msgid "Average points for the reporter writing:" | ||||
| msgstr "Moyenne de l'écrit du rapporteur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:78 | ||||
| msgid "Average points for the reporter oral:" | ||||
| msgstr "Moyenne de l'oral du rapporteur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:85 | ||||
| msgid "Defender points:" | ||||
| msgstr "Points du défenseur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:88 | ||||
| msgid "Opponent points:" | ||||
| msgstr "Points de l'opposant :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:91 | ||||
| msgid "Reporter points:" | ||||
| msgstr "Points du rapporteur :" | ||||
|  | ||||
| #: apps/participation/templates/participation/passage_detail.html:99 | ||||
| #: apps/participation/templates/participation/passage_form.html:11 | ||||
| msgid "Update passage" | ||||
| msgstr "Modifier le passage" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:15 | ||||
| msgid "Round:" | ||||
| msgstr "Tour :" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:18 | ||||
| msgid "Teams:" | ||||
| msgstr "Équipes :" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:25 | ||||
| msgid "Juries:" | ||||
| msgstr "Jurys :" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:28 | ||||
| msgid "Passages:" | ||||
| msgstr "Passages :" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:34 | ||||
| msgid "Defended solutions:" | ||||
| msgstr "Solutions défendues :" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:44 | ||||
| #: apps/participation/templates/participation/pool_detail.html:51 | ||||
| msgid "Add passage" | ||||
| msgstr "Ajouter un passage" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:46 | ||||
| #: apps/participation/templates/participation/pool_detail.html:61 | ||||
| msgid "Update teams" | ||||
| msgstr "Modifier les équipes" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:52 | ||||
| #: apps/participation/templates/participation/tournament_detail.html:76 | ||||
| msgid "Add" | ||||
| msgstr "Ajouter" | ||||
|  | ||||
| #: apps/participation/templates/participation/pool_detail.html:56 | ||||
| #: apps/participation/templates/participation/pool_form.html:11 | ||||
| msgid "Update pool" | ||||
| msgstr "Modifier la poule" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:13 | ||||
| msgid "Name:" | ||||
| msgstr "Nom :" | ||||
| @@ -386,39 +698,35 @@ msgstr "Encadrants :" | ||||
| msgid "Participants:" | ||||
| msgstr "Participants :" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:43 | ||||
| msgid "Chosen problem:" | ||||
| msgstr "Problème choisi :" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:47 | ||||
| msgid "Authorizations:" | ||||
| msgstr "Autorisations :" | ||||
| msgid "Photo authorizations:" | ||||
| msgstr "Autorisations de droit à l'image :" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:53 | ||||
| #: apps/participation/templates/participation/team_detail.html:64 | ||||
| #: apps/participation/templates/participation/team_detail.html:76 | ||||
| msgid "Not uploaded yet" | ||||
| msgstr "Pas encore envoyée" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:60 | ||||
| #: apps/participation/templates/participation/team_detail.html:119 | ||||
| #: apps/participation/templates/participation/tournament_form.html:12 | ||||
| #: apps/participation/templates/participation/update_team.html:12 | ||||
| #: apps/registration/templates/registration/update_user.html:16 | ||||
| #: apps/registration/templates/registration/user_detail.html:106 | ||||
| #: apps/registration/templates/registration/user_detail.html:115 | ||||
| msgid "Update" | ||||
| msgstr "Modifier" | ||||
| #: apps/participation/templates/participation/team_detail.html:58 | ||||
| msgid "Health sheets:" | ||||
| msgstr "Fiches sanitaires :" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:62 | ||||
| #: apps/participation/templates/participation/team_detail.html:124 | ||||
| #: apps/participation/templates/participation/team_detail.html:69 | ||||
| msgid "Parental authorizations:" | ||||
| msgstr "Autorisations parentales :" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:86 | ||||
| #: apps/participation/templates/participation/team_detail.html:148 | ||||
| #: apps/participation/templates/participation/team_leave.html:11 | ||||
| msgid "Leave" | ||||
| msgstr "Quitter" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:72 | ||||
| #: apps/participation/templates/participation/team_detail.html:96 | ||||
| msgid "Access to team participation" | ||||
| msgstr "Accéder à la participation de l'équipe" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:79 | ||||
| #: apps/participation/templates/participation/team_detail.html:103 | ||||
| msgid "" | ||||
| "Your team has at least 4 members and a coach and all authorizations were " | ||||
| "given: the team can be validated." | ||||
| @@ -426,11 +734,11 @@ msgstr "" | ||||
| "Votre équipe contient au moins 4 personnes et un encadrant et toutes les " | ||||
| "autorisations ont été données : l'équipe peut être validée." | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:84 | ||||
| #: apps/participation/templates/participation/team_detail.html:108 | ||||
| msgid "Submit my team to validation" | ||||
| msgstr "Soumettre mon équipe à validation" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:90 | ||||
| #: apps/participation/templates/participation/team_detail.html:114 | ||||
| msgid "" | ||||
| "Your team must be composed of 4 members and a coach and each member must " | ||||
| "upload their authorizations and confirm its email address." | ||||
| @@ -438,15 +746,15 @@ msgstr "" | ||||
| "Votre équipe doit être composée de 4 membres et un encadrant et chaque " | ||||
| "membre doit envoyer ses autorisations et confirmé son adresse e-mail." | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:95 | ||||
| #: apps/participation/templates/participation/team_detail.html:119 | ||||
| msgid "This team didn't ask for validation yet." | ||||
| msgstr "L'équipe n'a pas encore demandé à être validée." | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:101 | ||||
| #: apps/participation/templates/participation/team_detail.html:125 | ||||
| msgid "Your validation is pending." | ||||
| msgstr "Votre validation est en attente." | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:105 | ||||
| #: apps/participation/templates/participation/team_detail.html:129 | ||||
| msgid "" | ||||
| "The team requested to be validated. You may now control the authorizations " | ||||
| "and confirm that they can participate." | ||||
| @@ -454,19 +762,19 @@ msgstr "" | ||||
| "L'équipe a demandé à être validée. Vous pouvez désormais contrôler les " | ||||
| "différentes autorisations et confirmer qu'elle peut participer." | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:111 | ||||
| #: apps/participation/templates/participation/team_detail.html:135 | ||||
| msgid "Validate" | ||||
| msgstr "Valider" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:112 | ||||
| #: apps/participation/templates/participation/team_detail.html:136 | ||||
| msgid "Invalidate" | ||||
| msgstr "Invalider" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:118 | ||||
| #: apps/participation/templates/participation/team_detail.html:142 | ||||
| msgid "Update team" | ||||
| msgstr "Modifier l'équipe" | ||||
|  | ||||
| #: apps/participation/templates/participation/team_detail.html:123 | ||||
| #: apps/participation/templates/participation/team_detail.html:147 | ||||
| #: apps/participation/views.py:332 | ||||
| msgid "Leave team" | ||||
| msgstr "Quitter l'équipe" | ||||
| @@ -534,6 +842,18 @@ msgstr "Modifier le tournoi" | ||||
| msgid "Teams" | ||||
| msgstr "Équipes" | ||||
|  | ||||
| #: apps/participation/templates/participation/tournament_detail.html:66 | ||||
| msgid "Pools" | ||||
| msgstr "Poules" | ||||
|  | ||||
| #: apps/participation/templates/participation/tournament_detail.html:72 | ||||
| msgid "Add new pool" | ||||
| msgstr "Ajouter une nouvelle poule" | ||||
|  | ||||
| #: apps/participation/templates/participation/tournament_detail.html:75 | ||||
| msgid "Add pool" | ||||
| msgstr "Ajouter une poule" | ||||
|  | ||||
| #: apps/participation/templates/participation/tournament_list.html:6 | ||||
| #: tfjm/templates/base.html:218 | ||||
| msgid "All tournaments" | ||||
| @@ -591,8 +911,8 @@ msgid "" | ||||
| "authorizations, people or the chosen problem is not set." | ||||
| msgstr "" | ||||
| "L'équipe ne peut pas être validée : il manque soit les confirmations " | ||||
| "d'adresse e-mail, soit une autorisation, soit des personnes soit " | ||||
| "le problème n'a pas été choisi." | ||||
| "d'adresse e-mail, soit une autorisation, soit des personnes soit le problème " | ||||
| "n'a pas été choisi." | ||||
|  | ||||
| #: apps/participation/views.py:227 | ||||
| msgid "You are not an administrator." | ||||
| @@ -611,7 +931,7 @@ msgstr "Vous devez spécifier si vous validez l'inscription ou non." | ||||
| msgid "Update team {trigram}" | ||||
| msgstr "Mise à jour de l'équipe {trigram}" | ||||
|  | ||||
| #: apps/participation/views.py:318 apps/registration/views.py:296 | ||||
| #: apps/participation/views.py:318 apps/registration/views.py:298 | ||||
| #, python-brace-format | ||||
| msgid "Photo authorization of {student}.{ext}" | ||||
| msgstr "Autorisation de droit à l'image de {student}.{ext}" | ||||
| @@ -933,8 +1253,8 @@ msgstr "Réinitialiser mon mot de passe" | ||||
|  | ||||
| #: apps/registration/templates/registration/signup.html:5 | ||||
| #: apps/registration/templates/registration/signup.html:12 | ||||
| #: apps/registration/templates/registration/signup.html:24 | ||||
| #: apps/registration/views.py:35 | ||||
| #: apps/registration/templates/registration/signup.html:19 | ||||
| #: apps/registration/views.py:37 | ||||
| msgid "Sign up" | ||||
| msgstr "Inscription" | ||||
|  | ||||
| @@ -956,15 +1276,6 @@ msgstr "Modèle de fiche sanitaire :" | ||||
| msgid "Download" | ||||
| msgstr "Télécharger" | ||||
|  | ||||
| #: apps/registration/templates/registration/upload_health_sheet.html:17 | ||||
| #: apps/registration/templates/registration/upload_parental_authorization.html:17 | ||||
| #: apps/registration/templates/registration/upload_photo_authorization.html:18 | ||||
| #: apps/registration/templates/registration/user_detail.html:120 | ||||
| #: apps/registration/templates/registration/user_detail.html:125 | ||||
| #: apps/registration/templates/registration/user_detail.html:130 | ||||
| msgid "Upload" | ||||
| msgstr "Téléverser" | ||||
|  | ||||
| #: apps/registration/templates/registration/upload_parental_authorization.html:11 | ||||
| msgid "Authorization template:" | ||||
| msgstr "Modèles d'autorisation :" | ||||
| @@ -1068,56 +1379,56 @@ msgid "Update user" | ||||
| msgstr "Modifier l'utilisateur" | ||||
|  | ||||
| #: apps/registration/templates/registration/user_detail.html:119 | ||||
| #: apps/registration/views.py:225 | ||||
| #: apps/registration/views.py:227 | ||||
| msgid "Upload photo authorization" | ||||
| msgstr "Téléverser l'autorisation de droit à l'image" | ||||
|  | ||||
| #: apps/registration/templates/registration/user_detail.html:124 | ||||
| #: apps/registration/views.py:245 | ||||
| #: apps/registration/views.py:247 | ||||
| msgid "Upload health sheet" | ||||
| msgstr "Téléverser la fiche sanitaire" | ||||
|  | ||||
| #: apps/registration/templates/registration/user_detail.html:129 | ||||
| #: apps/registration/views.py:265 | ||||
| #: apps/registration/views.py:267 | ||||
| msgid "Upload parental authorization" | ||||
| msgstr "Téléverser l'autorisation parentale" | ||||
|  | ||||
| #: apps/registration/views.py:78 | ||||
| #: apps/registration/views.py:80 | ||||
| msgid "Email validation" | ||||
| msgstr "Validation de l'adresse mail" | ||||
|  | ||||
| #: apps/registration/views.py:80 | ||||
| #: apps/registration/views.py:82 | ||||
| msgid "Validate email" | ||||
| msgstr "Valider l'adresse mail" | ||||
|  | ||||
| #: apps/registration/views.py:119 | ||||
| #: apps/registration/views.py:121 | ||||
| msgid "Email validation unsuccessful" | ||||
| msgstr "Échec de la validation de l'adresse mail" | ||||
|  | ||||
| #: apps/registration/views.py:130 | ||||
| #: apps/registration/views.py:132 | ||||
| msgid "Email validation email sent" | ||||
| msgstr "Mail de confirmation de l'adresse mail envoyé" | ||||
|  | ||||
| #: apps/registration/views.py:138 | ||||
| #: apps/registration/views.py:140 | ||||
| msgid "Resend email validation link" | ||||
| msgstr "Renvoyé le lien de validation de l'adresse mail" | ||||
|  | ||||
| #: apps/registration/views.py:165 | ||||
| #: apps/registration/views.py:167 | ||||
| #, python-brace-format | ||||
| msgid "Detail of user {user}" | ||||
| msgstr "Détails de l'utilisateur {user}" | ||||
|  | ||||
| #: apps/registration/views.py:189 | ||||
| #: apps/registration/views.py:191 | ||||
| #, python-brace-format | ||||
| msgid "Update user {user}" | ||||
| msgstr "Mise à jour de l'utilisateur {user}" | ||||
|  | ||||
| #: apps/registration/views.py:318 | ||||
| #: apps/registration/views.py:320 | ||||
| #, python-brace-format | ||||
| msgid "Health sheet of {student}.{ext}" | ||||
| msgstr "Fiche sanitaire de {student}.{ext}" | ||||
|  | ||||
| #: apps/registration/views.py:340 | ||||
| #: apps/registration/views.py:342 | ||||
| #, python-brace-format | ||||
| msgid "Parental authorization of {student}.{ext}" | ||||
| msgstr "Autorisation parentale de {student}.{ext}" | ||||
| @@ -1137,7 +1448,8 @@ msgstr "Requête invalide" | ||||
| #: tfjm/templates/400.html:7 | ||||
| msgid "" | ||||
| "Sorry, your request was bad. Don't know what could be wrong. An email has " | ||||
| "been sent to webmasters with the details of the error. You can now think about other solutions." | ||||
| "been sent to webmasters with the details of the error. You can now think " | ||||
| "about other solutions." | ||||
| msgstr "" | ||||
| "Désolé, votre requête est invalide. Aucune idée de ce qui a pu se passer. Un " | ||||
| "email a été envoyé aux administrateurs avec les détails de l'erreur. Vous " | ||||
| @@ -1179,7 +1491,8 @@ msgid "" | ||||
| msgstr "" | ||||
| "Désolé, une erreur est survenue lors du traitement de votre requête. Aucune " | ||||
| "idée de ce qui a pu se passer. Un email a été envoyé aux administrateurs " | ||||
| "avec les détails de l'erreur. Vous pouvez désormais retourner chercher d'autres solutions.." | ||||
| "avec les détails de l'erreur. Vous pouvez désormais retourner chercher " | ||||
| "d'autres solutions.." | ||||
|  | ||||
| #: tfjm/templates/base.html:56 | ||||
| msgid "Home" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user