mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-10-31 19:44:30 +01:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			c8780a6d9d
			...
			61703b130d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 61703b130d | ||
|  | a97541064e | ||
|  | ef785a5eb8 | ||
|  | be8904079d | 
| @@ -12,6 +12,8 @@ class ParticipationConfig(AppConfig): | |||||||
|     name = 'participation' |     name = 'participation' | ||||||
|  |  | ||||||
|     def ready(self): |     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") |         pre_save.connect(update_mailing_list, "participation.Team") | ||||||
|         post_save.connect(create_team_participation, "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 import formats | ||||||
| from django.utils.translation import gettext_lazy as _ | 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): | class TeamForm(forms.ModelForm): | ||||||
| @@ -173,3 +173,10 @@ class SynthesisForm(forms.ModelForm): | |||||||
|     class Meta: |     class Meta: | ||||||
|         model = Synthesis |         model = Synthesis | ||||||
|         fields = ('type', 'file',) |         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): |     def solutions(self): | ||||||
|         return Solution.objects.filter(participation__in=self.participations, final_solution=self.tournament.final) |         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): |     def get_absolute_url(self): | ||||||
|         return reverse_lazy("participation:pool_detail", args=(self.pk,)) |         return reverse_lazy("participation:pool_detail", args=(self.pk,)) | ||||||
|  |  | ||||||
| @@ -375,6 +378,50 @@ class Passage(models.Model): | |||||||
|             problem=self.solution_number, |             problem=self.solution_number, | ||||||
|             final_solution=self.pool.tournament.final) |             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): |     def get_absolute_url(self): | ||||||
|         return reverse_lazy("participation:passage_detail", args=(self.pk,)) |         return reverse_lazy("participation:passage_detail", args=(self.pk,)) | ||||||
|  |  | ||||||
| @@ -482,3 +529,69 @@ class Synthesis(models.Model): | |||||||
|         verbose_name = _("synthesis") |         verbose_name = _("synthesis") | ||||||
|         verbose_name_plural = _("syntheses") |         verbose_name_plural = _("syntheses") | ||||||
|         unique_together = (('participation', 'passage', 'type', ), ) |         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 | # Copyright (C) 2020 by Animath | ||||||
| # SPDX-License-Identifier: GPL-3.0-or-later | # 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 | from tfjm.lists import get_sympa_client | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -33,3 +34,13 @@ def update_mailing_list(instance: Team, **_): | |||||||
|             for coach in instance.coachs.all(): |             for coach in instance.coachs.all(): | ||||||
|                 get_sympa_client().subscribe(coach.user.email, f"equipe-{instance.trigram.lower()}", False, |                 get_sympa_client().subscribe(coach.user.email, f"equipe-{instance.trigram.lower()}", False, | ||||||
|                                              f"{coach.user.first_name} {coach.user.last_name}") |                                              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 _ | from django.utils.translation import gettext_lazy as _ | ||||||
| import django_tables2 as tables | import django_tables2 as tables | ||||||
|  |  | ||||||
| from .models import Pool, Team, Tournament | from .models import Note, Pool, Team, Tournament | ||||||
|  |  | ||||||
|  |  | ||||||
| # noinspection PyTypeChecker | # noinspection PyTypeChecker | ||||||
| @@ -19,7 +19,7 @@ class TeamTable(tables.Table): | |||||||
|  |  | ||||||
|     class Meta: |     class Meta: | ||||||
|         attrs = { |         attrs = { | ||||||
|             'class': 'table table condensed table-striped', |             'class': 'table table-condensed table-striped', | ||||||
|         } |         } | ||||||
|         model = Team |         model = Team | ||||||
|         fields = ('name', 'trigram',) |         fields = ('name', 'trigram',) | ||||||
| @@ -51,7 +51,7 @@ class ParticipationTable(tables.Table): | |||||||
|  |  | ||||||
|     class Meta: |     class Meta: | ||||||
|         attrs = { |         attrs = { | ||||||
|             'class': 'table table condensed table-striped', |             'class': 'table table-condensed table-striped', | ||||||
|         } |         } | ||||||
|         model = Team |         model = Team | ||||||
|         fields = ('name', 'trigram', 'valid',) |         fields = ('name', 'trigram', 'valid',) | ||||||
| @@ -70,7 +70,7 @@ class TournamentTable(tables.Table): | |||||||
|  |  | ||||||
|     class Meta: |     class Meta: | ||||||
|         attrs = { |         attrs = { | ||||||
|             'class': 'table table condensed table-striped', |             'class': 'table table-condensed table-striped', | ||||||
|         } |         } | ||||||
|         model = Tournament |         model = Tournament | ||||||
|         fields = ('name', 'date',) |         fields = ('name', 'date',) | ||||||
| @@ -91,8 +91,27 @@ class PoolTable(tables.Table): | |||||||
|  |  | ||||||
|     class Meta: |     class Meta: | ||||||
|         attrs = { |         attrs = { | ||||||
|             'class': 'table table condensed table-striped', |             'class': 'table table-condensed table-striped', | ||||||
|         } |         } | ||||||
|         model = Pool |         model = Pool | ||||||
|         fields = ('teams', 'round', 'tournament',) |         fields = ('teams', 'round', 'tournament',) | ||||||
|         template_name = 'django_tables2/bootstrap4.html' |         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" %} | {% extends "base.html" %} | ||||||
|  |  | ||||||
| {% load i18n %} | {% load django_tables2 i18n %} | ||||||
|  |  | ||||||
| {% block content %} | {% block content %} | ||||||
| {% trans "any" as any %} | {% trans "any" as any %} | ||||||
| @@ -40,6 +40,7 @@ | |||||||
|         </div> |         </div> | ||||||
|         {% if user.registration.is_admin %} |         {% if user.registration.is_admin %} | ||||||
|             <div class="card-footer text-center"> |             <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> |                 <button class="btn btn-primary" data-toggle="modal" data-target="#updatePassageModal">{% trans "Update" %}</button> | ||||||
|             </div> |             </div> | ||||||
|         {% elif user.registration.participates %} |         {% elif user.registration.participates %} | ||||||
| @@ -49,11 +50,61 @@ | |||||||
|         {% endif %} |         {% endif %} | ||||||
|     </div> |     </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 %} |     {% if user.registration.is_admin %} | ||||||
|         {% trans "Update passage" as modal_title %} |         {% trans "Update passage" as modal_title %} | ||||||
|         {% trans "Update" as modal_button %} |         {% trans "Update" as modal_button %} | ||||||
|         {% url "participation:passage_update" pk=passage.pk as modal_action %} |         {% url "participation:passage_update" pk=passage.pk as modal_action %} | ||||||
|         {% include "base_modal.html" with modal_id="updatePassage" %} |         {% 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 %} |     {% elif user.registration.participates %} | ||||||
|         {% trans "Upload synthesis" as modal_title %} |         {% trans "Upload synthesis" as modal_title %} | ||||||
|         {% trans "Upload" as modal_button %} |         {% trans "Upload" as modal_button %} | ||||||
| @@ -71,6 +122,12 @@ | |||||||
|                     if (!modalBody.html().trim()) |                     if (!modalBody.html().trim()) | ||||||
|                         modalBody.load("{% url "participation:passage_update" pk=passage.pk %} #form-content") |                         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 %} |             {% elif user.registration.participates %} | ||||||
|                 $('button[data-target="#uploadSynthesisModal"]').click(function() { |                 $('button[data-target="#uploadSynthesisModal"]').click(function() { | ||||||
|                     let modalBody = $("#uploadSynthesisModal div.modal-body"); |                     let modalBody = $("#uploadSynthesisModal div.modal-body"); | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ from django.urls import path | |||||||
| from django.views.generic import TemplateView | from django.views.generic import TemplateView | ||||||
|  |  | ||||||
| from .views import CreateTeamView, JoinTeamView, \ | from .views import CreateTeamView, JoinTeamView, \ | ||||||
|     MyParticipationDetailView, MyTeamDetailView, ParticipationDetailView, \ |     MyParticipationDetailView, MyTeamDetailView, NoteUpdateView, ParticipationDetailView, \ | ||||||
|     PassageCreateView, PassageDetailView, PassageUpdateView, PoolCreateView, PoolDetailView, \ |     PassageCreateView, PassageDetailView, PassageUpdateView, PoolCreateView, PoolDetailView, \ | ||||||
|     PoolUpdateView, PoolUpdateTeamsView, TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamListView, \ |     PoolUpdateView, PoolUpdateTeamsView, TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamListView, \ | ||||||
|     TeamUpdateView, TournamentCreateView, TournamentDetailView, TournamentListView, TournamentUpdateView, \ |     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>/", PassageDetailView.as_view(), name="passage_detail"), | ||||||
|     path("pools/passages/<int:pk>/update/", PassageUpdateView.as_view(), name="passage_update"), |     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/<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") |     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.matrix import Matrix | ||||||
| from tfjm.views import AdminMixin | from tfjm.views import AdminMixin | ||||||
|  |  | ||||||
| from .forms import JoinTeamForm, ParticipationForm, PassageForm, PoolForm, PoolTeamsForm, RequestValidationForm, \ | from .forms import JoinTeamForm, NoteForm, ParticipationForm, PassageForm, PoolForm, PoolTeamsForm, \ | ||||||
|     TeamForm, TournamentForm, ValidateParticipationForm, SolutionForm, SynthesisForm |     RequestValidationForm, TeamForm, TournamentForm, ValidateParticipationForm, SolutionForm, SynthesisForm | ||||||
| from .models import Participation, Passage, Pool, Team, Tournament, Solution, Synthesis | from .models import Note, Participation, Passage, Pool, Team, Tournament, Solution, Synthesis | ||||||
| from .tables import TeamTable, TournamentTable, ParticipationTable, PoolTable | from .tables import TeamTable, TournamentTable, ParticipationTable, PoolTable, NoteTable | ||||||
|  |  | ||||||
|  |  | ||||||
| class CreateTeamView(LoginRequiredMixin, CreateView): | class CreateTeamView(LoginRequiredMixin, CreateView): | ||||||
| @@ -513,6 +513,13 @@ class PassageCreateView(AdminMixin, CreateView): | |||||||
| class PassageDetailView(LoginRequiredMixin, DetailView): | class PassageDetailView(LoginRequiredMixin, DetailView): | ||||||
|     model = Passage |     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): | class PassageUpdateView(AdminMixin, UpdateView): | ||||||
|     model = Passage |     model = Passage | ||||||
| @@ -551,3 +558,8 @@ class SynthesisUploadView(LoginRequiredMixin, FormView): | |||||||
|  |  | ||||||
|     def get_success_url(self): |     def get_success_url(self): | ||||||
|         return reverse_lazy("participation:passage_detail", args=(self.passage.pk,)) |         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: |     class Meta: | ||||||
|         attrs = { |         attrs = { | ||||||
|             'class': 'table table condensed table-striped', |             'class': 'table table-condensed table-striped', | ||||||
|         } |         } | ||||||
|         model = Registration |         model = Registration | ||||||
|         fields = ('last_name', 'user__first_name', 'user__email', 'type',) |         fields = ('last_name', 'user__first_name', 'user__email', 'type',) | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: TFJM\n" | "Project-Id-Version: TFJM\n" | ||||||
| "Report-Msgid-Bugs-To: \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" | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||||
| "Last-Translator: Yohann D'ANELLO <yohann.danello@animath.fr>\n" | "Last-Translator: Yohann D'ANELLO <yohann.danello@animath.fr>\n" | ||||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | "Language-Team: LANGUAGE <LL@li.org>\n" | ||||||
| @@ -99,205 +99,336 @@ msgstr "changelogs" | |||||||
| msgid "Changelog of type \"{action}\" for model {model} at {timestamp}" | msgid "Changelog of type \"{action}\" for model {model} at {timestamp}" | ||||||
| msgstr "Changelog de type \"{action}\" pour le modèle {model} le {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" | msgid "valid" | ||||||
| msgstr "valide" | 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." | msgid "The trigram must be composed of three uppercase letters." | ||||||
| msgstr "Le trigramme doit être composé de trois lettres majuscules." | 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." | msgid "No team was found with this access code." | ||||||
| msgstr "Aucune équipe n'a été trouvée avec ce code d'accès." | 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\"." | msgid "I engage myself to participate to the whole \"Correspondances\"." | ||||||
| msgstr "Je m'engage à participer à l'intégralité du TFJM²." | 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:" | msgid "Message to address to the team:" | ||||||
| msgstr "Message à adresser à l'équipe :" | msgstr "Message à adresser à l'équipe :" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:26 apps/participation/models.py:123 | #: apps/participation/forms.py:155 | ||||||
| #: apps/participation/tables.py:16 apps/participation/tables.py:33 | 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" | msgid "name" | ||||||
| msgstr "nom" | msgstr "nom" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:32 apps/participation/tables.py:38 | #: apps/participation/models.py:35 apps/participation/tables.py:39 | ||||||
| msgid "trigram" | msgid "trigram" | ||||||
| msgstr "trigramme" | msgstr "trigramme" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:40 | #: apps/participation/models.py:43 | ||||||
| msgid "access code" | msgid "access code" | ||||||
| msgstr "code d'accès" | 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." | 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." | 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 | #, python-brace-format | ||||||
| msgid "Team {name} ({trigram})" | msgid "Team {name} ({trigram})" | ||||||
| msgstr "Équipe {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 | #: apps/registration/models.py:119 | ||||||
| msgid "team" | msgid "team" | ||||||
| msgstr "équipe" | msgstr "équipe" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:114 | #: apps/participation/models.py:117 apps/participation/tables.py:84 | ||||||
| msgid "teams" | msgid "teams" | ||||||
| msgstr "équipes" | msgstr "équipes" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:128 | #: apps/participation/models.py:131 | ||||||
| msgid "start" | msgid "start" | ||||||
| msgstr "début" | msgstr "début" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:133 | #: apps/participation/models.py:136 | ||||||
| msgid "end" | msgid "end" | ||||||
| msgstr "fin" | 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 | #: apps/participation/templates/participation/tournament_detail.html:18 | ||||||
| msgid "place" | msgid "place" | ||||||
| msgstr "lieu" | msgstr "lieu" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:142 | #: apps/participation/models.py:145 | ||||||
| msgid "max team count" | msgid "max team count" | ||||||
| msgstr "nombre maximal d'équipes" | msgstr "nombre maximal d'équipes" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:147 | #: apps/participation/models.py:150 | ||||||
| #: apps/participation/templates/participation/tournament_detail.html:21 | #: apps/participation/templates/participation/tournament_detail.html:21 | ||||||
| msgid "price" | msgid "price" | ||||||
| msgstr "prix" | msgstr "prix" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:152 | #: apps/participation/models.py:155 | ||||||
| msgid "limit date for registrations" | msgid "limit date for registrations" | ||||||
| msgstr "date limite d'inscription" | msgstr "date limite d'inscription" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:157 | #: apps/participation/models.py:160 | ||||||
| msgid "limit date to upload solutions" | msgid "limit date to upload solutions" | ||||||
| msgstr "date limite pour envoyer les solutions" | msgstr "date limite pour envoyer les solutions" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:162 | #: apps/participation/models.py:165 | ||||||
| msgid "random draw for solutions" | msgid "random draw for solutions" | ||||||
| msgstr "tirage au sort des 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" | 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" | 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" | msgid "date when the solutions for the second round become available" | ||||||
| msgstr "date à laquelle les solutions pour le second tour sont accessibles" | 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" | 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" | 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 | #: apps/participation/templates/participation/tournament_detail.html:45 | ||||||
| msgid "description" | msgid "description" | ||||||
| msgstr "description" | msgstr "description" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:188 | #: apps/participation/models.py:191 | ||||||
| #: apps/participation/templates/participation/tournament_detail.html:12 | #: apps/participation/templates/participation/tournament_detail.html:12 | ||||||
| msgid "organizers" | msgid "organizers" | ||||||
| msgstr "organisateurs" | msgstr "organisateurs" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:193 | #: apps/participation/models.py:196 | ||||||
| msgid "final" | msgid "final" | ||||||
| msgstr "finale" | msgstr "finale" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:228 apps/participation/models.py:252 | #: apps/participation/models.py:231 apps/participation/models.py:255 | ||||||
| #: apps/participation/models.py:278 | #: apps/participation/models.py:287 | ||||||
| msgid "tournament" | msgid "tournament" | ||||||
| msgstr "tournoi" | msgstr "tournoi" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:229 | #: apps/participation/models.py:232 | ||||||
| msgid "tournaments" | msgid "tournaments" | ||||||
| msgstr "tournois" | msgstr "tournois" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:259 | #: apps/participation/models.py:262 | ||||||
| msgid "The participation got the validation of the organizers." | msgid "The participation got the validation of the organizers." | ||||||
| msgstr "La participation a été validée par les organisateurs." | 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 | #, python-brace-format | ||||||
| msgid "Participation of the team {name} ({trigram})" | msgid "Participation of the team {name} ({trigram})" | ||||||
| msgstr "Participation de l'équipe {name} ({trigram})" | msgstr "Participation de l'équipe {name} ({trigram})" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:269 apps/participation/models.py:313 | #: apps/participation/models.py:278 apps/participation/models.py:462 | ||||||
| #: apps/participation/models.py:347 | #: apps/participation/models.py:500 | ||||||
| msgid "participation" | msgid "participation" | ||||||
| msgstr "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" | msgid "participations" | ||||||
| msgstr "participations" | msgstr "participations" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:282 | #: apps/participation/models.py:291 | ||||||
| msgid "round" | msgid "round" | ||||||
| msgstr "tour" | 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" | msgid "juries" | ||||||
| msgstr "jurys" | 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" | msgid "pool" | ||||||
| msgstr "poule" | msgstr "poule" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:306 | #: apps/participation/models.py:328 | ||||||
| msgid "pools" | msgid "pools" | ||||||
| msgstr "poules" | msgstr "poules" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:318 | #: apps/participation/models.py:342 | ||||||
| msgid "problem" | msgid "Where the solution is presented?" | ||||||
| msgstr "numéro de problème" | msgstr "Où est-ce que les solutions sont défendues ?" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:322 | #: apps/participation/models.py:347 | ||||||
| msgid "solution for the final tournament" | msgid "defended solution" | ||||||
| msgstr "solution pour la finale" | msgstr "solution défendue" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:327 apps/participation/models.py:365 | #: apps/participation/models.py:349 apps/participation/models.py:469 | ||||||
| msgid "file" | #, python-brace-format | ||||||
| msgstr "fichier" | msgid "Problem #{problem}" | ||||||
|  | msgstr "Problème n°{problem}" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:338 | #: apps/participation/models.py:356 | ||||||
| msgid "solution" | msgid "defender" | ||||||
| msgstr "solution" | msgstr "défenseur" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:339 | #: apps/participation/models.py:363 apps/participation/models.py:512 | ||||||
| msgid "solutions" |  | ||||||
| msgstr "solutions" |  | ||||||
|  |  | ||||||
| #: apps/participation/models.py:359 |  | ||||||
| msgid "opponent" | msgid "opponent" | ||||||
| msgstr "opposant" | msgstr "opposant" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:360 | #: apps/participation/models.py:370 apps/participation/models.py:513 | ||||||
| msgid "reporter" | msgid "reporter" | ||||||
| msgstr "rapporteur" | 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" | msgid "synthesis" | ||||||
| msgstr "note de synthèse" | msgstr "note de synthèse" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:377 | #: apps/participation/models.py:530 | ||||||
| msgid "syntheses" | msgid "syntheses" | ||||||
| msgstr "notes de synthèse" | 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" | msgid "date" | ||||||
| msgstr "date" | msgstr "date" | ||||||
|  |  | ||||||
| #: apps/participation/tables.py:57 | #: apps/participation/tables.py:67 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "From {start} to {end}" | msgid "From {start} to {end}" | ||||||
| msgstr "Du {start} au {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 | #: apps/participation/templates/participation/chat.html:7 | ||||||
| msgid "The chat is located on the dedicated Matrix server:" | msgid "The chat is located on the dedicated Matrix server:" | ||||||
| msgstr "Le chat est situé sur le serveur Matrix dédié au TFJM² :" | msgstr "Le chat est situé sur le serveur Matrix dédié au TFJM² :" | ||||||
| @@ -343,7 +474,25 @@ msgstr "Créer" | |||||||
| msgid "Join" | msgid "Join" | ||||||
| msgstr "Rejoindre" | 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/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:30 | ||||||
| #: apps/participation/templates/participation/team_detail.html:39 | #: apps/participation/templates/participation/team_detail.html:39 | ||||||
| #: apps/participation/templates/participation/team_detail.html:44 | #: apps/participation/templates/participation/team_detail.html:44 | ||||||
| @@ -361,6 +510,169 @@ msgstr "Participation de l'équipe" | |||||||
| msgid "Team:" | msgid "Team:" | ||||||
| msgstr "Équipe :" | 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 | #: apps/participation/templates/participation/team_detail.html:13 | ||||||
| msgid "Name:" | msgid "Name:" | ||||||
| msgstr "Nom :" | msgstr "Nom :" | ||||||
| @@ -386,39 +698,35 @@ msgstr "Encadrants :" | |||||||
| msgid "Participants:" | msgid "Participants:" | ||||||
| msgstr "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 | #: apps/participation/templates/participation/team_detail.html:47 | ||||||
| msgid "Authorizations:" | msgid "Photo authorizations:" | ||||||
| msgstr "Autorisations :" | msgstr "Autorisations de droit à l'image :" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:53 | #: 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" | msgid "Not uploaded yet" | ||||||
| msgstr "Pas encore envoyée" | msgstr "Pas encore envoyée" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:60 | #: apps/participation/templates/participation/team_detail.html:58 | ||||||
| #: apps/participation/templates/participation/team_detail.html:119 | msgid "Health sheets:" | ||||||
| #: apps/participation/templates/participation/tournament_form.html:12 | msgstr "Fiches sanitaires :" | ||||||
| #: 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:62 | #: apps/participation/templates/participation/team_detail.html:69 | ||||||
| #: apps/participation/templates/participation/team_detail.html:124 | 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 | #: apps/participation/templates/participation/team_leave.html:11 | ||||||
| msgid "Leave" | msgid "Leave" | ||||||
| msgstr "Quitter" | msgstr "Quitter" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:72 | #: apps/participation/templates/participation/team_detail.html:96 | ||||||
| msgid "Access to team participation" | msgid "Access to team participation" | ||||||
| msgstr "Accéder à la participation de l'équipe" | 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 "" | msgid "" | ||||||
| "Your team has at least 4 members and a coach and all authorizations were " | "Your team has at least 4 members and a coach and all authorizations were " | ||||||
| "given: the team can be validated." | "given: the team can be validated." | ||||||
| @@ -426,11 +734,11 @@ msgstr "" | |||||||
| "Votre équipe contient au moins 4 personnes et un encadrant et toutes les " | "Votre équipe contient au moins 4 personnes et un encadrant et toutes les " | ||||||
| "autorisations ont été données : l'équipe peut être validée." | "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" | msgid "Submit my team to validation" | ||||||
| msgstr "Soumettre mon équipe à validation" | msgstr "Soumettre mon équipe à validation" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:90 | #: apps/participation/templates/participation/team_detail.html:114 | ||||||
| msgid "" | msgid "" | ||||||
| "Your team must be composed of 4 members and a coach and each member must " | "Your team must be composed of 4 members and a coach and each member must " | ||||||
| "upload their authorizations and confirm its email address." | "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 " | "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." | "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." | msgid "This team didn't ask for validation yet." | ||||||
| msgstr "L'équipe n'a pas encore demandé à être validée." | 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." | msgid "Your validation is pending." | ||||||
| msgstr "Votre validation est en attente." | msgstr "Votre validation est en attente." | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:105 | #: apps/participation/templates/participation/team_detail.html:129 | ||||||
| msgid "" | msgid "" | ||||||
| "The team requested to be validated. You may now control the authorizations " | "The team requested to be validated. You may now control the authorizations " | ||||||
| "and confirm that they can participate." | "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 " | "L'équipe a demandé à être validée. Vous pouvez désormais contrôler les " | ||||||
| "différentes autorisations et confirmer qu'elle peut participer." | "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" | msgid "Validate" | ||||||
| msgstr "Valider" | msgstr "Valider" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:112 | #: apps/participation/templates/participation/team_detail.html:136 | ||||||
| msgid "Invalidate" | msgid "Invalidate" | ||||||
| msgstr "Invalider" | msgstr "Invalider" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:118 | #: apps/participation/templates/participation/team_detail.html:142 | ||||||
| msgid "Update team" | msgid "Update team" | ||||||
| msgstr "Modifier l'équipe" | 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 | #: apps/participation/views.py:332 | ||||||
| msgid "Leave team" | msgid "Leave team" | ||||||
| msgstr "Quitter l'équipe" | msgstr "Quitter l'équipe" | ||||||
| @@ -534,6 +842,18 @@ msgstr "Modifier le tournoi" | |||||||
| msgid "Teams" | msgid "Teams" | ||||||
| msgstr "Équipes" | 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 | #: apps/participation/templates/participation/tournament_list.html:6 | ||||||
| #: tfjm/templates/base.html:218 | #: tfjm/templates/base.html:218 | ||||||
| msgid "All tournaments" | msgid "All tournaments" | ||||||
| @@ -591,8 +911,8 @@ msgid "" | |||||||
| "authorizations, people or the chosen problem is not set." | "authorizations, people or the chosen problem is not set." | ||||||
| msgstr "" | msgstr "" | ||||||
| "L'équipe ne peut pas être validée : il manque soit les confirmations " | "L'équipe ne peut pas être validée : il manque soit les confirmations " | ||||||
| "d'adresse e-mail, soit une autorisation, soit des personnes soit " | "d'adresse e-mail, soit une autorisation, soit des personnes soit le problème " | ||||||
| "le problème n'a pas été choisi." | "n'a pas été choisi." | ||||||
|  |  | ||||||
| #: apps/participation/views.py:227 | #: apps/participation/views.py:227 | ||||||
| msgid "You are not an administrator." | 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}" | msgid "Update team {trigram}" | ||||||
| msgstr "Mise à jour de l'équipe {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 | #, python-brace-format | ||||||
| msgid "Photo authorization of {student}.{ext}" | msgid "Photo authorization of {student}.{ext}" | ||||||
| msgstr "Autorisation de droit à l'image de {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:5 | ||||||
| #: apps/registration/templates/registration/signup.html:12 | #: apps/registration/templates/registration/signup.html:12 | ||||||
| #: apps/registration/templates/registration/signup.html:24 | #: apps/registration/templates/registration/signup.html:19 | ||||||
| #: apps/registration/views.py:35 | #: apps/registration/views.py:37 | ||||||
| msgid "Sign up" | msgid "Sign up" | ||||||
| msgstr "Inscription" | msgstr "Inscription" | ||||||
|  |  | ||||||
| @@ -956,15 +1276,6 @@ msgstr "Modèle de fiche sanitaire :" | |||||||
| msgid "Download" | msgid "Download" | ||||||
| msgstr "Télécharger" | 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 | #: apps/registration/templates/registration/upload_parental_authorization.html:11 | ||||||
| msgid "Authorization template:" | msgid "Authorization template:" | ||||||
| msgstr "Modèles d'autorisation :" | msgstr "Modèles d'autorisation :" | ||||||
| @@ -1068,56 +1379,56 @@ msgid "Update user" | |||||||
| msgstr "Modifier l'utilisateur" | msgstr "Modifier l'utilisateur" | ||||||
|  |  | ||||||
| #: apps/registration/templates/registration/user_detail.html:119 | #: apps/registration/templates/registration/user_detail.html:119 | ||||||
| #: apps/registration/views.py:225 | #: apps/registration/views.py:227 | ||||||
| msgid "Upload photo authorization" | msgid "Upload photo authorization" | ||||||
| msgstr "Téléverser l'autorisation de droit à l'image" | msgstr "Téléverser l'autorisation de droit à l'image" | ||||||
|  |  | ||||||
| #: apps/registration/templates/registration/user_detail.html:124 | #: apps/registration/templates/registration/user_detail.html:124 | ||||||
| #: apps/registration/views.py:245 | #: apps/registration/views.py:247 | ||||||
| msgid "Upload health sheet" | msgid "Upload health sheet" | ||||||
| msgstr "Téléverser la fiche sanitaire" | msgstr "Téléverser la fiche sanitaire" | ||||||
|  |  | ||||||
| #: apps/registration/templates/registration/user_detail.html:129 | #: apps/registration/templates/registration/user_detail.html:129 | ||||||
| #: apps/registration/views.py:265 | #: apps/registration/views.py:267 | ||||||
| msgid "Upload parental authorization" | msgid "Upload parental authorization" | ||||||
| msgstr "Téléverser l'autorisation parentale" | msgstr "Téléverser l'autorisation parentale" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:78 | #: apps/registration/views.py:80 | ||||||
| msgid "Email validation" | msgid "Email validation" | ||||||
| msgstr "Validation de l'adresse mail" | msgstr "Validation de l'adresse mail" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:80 | #: apps/registration/views.py:82 | ||||||
| msgid "Validate email" | msgid "Validate email" | ||||||
| msgstr "Valider l'adresse mail" | msgstr "Valider l'adresse mail" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:119 | #: apps/registration/views.py:121 | ||||||
| msgid "Email validation unsuccessful" | msgid "Email validation unsuccessful" | ||||||
| msgstr "Échec de la validation de l'adresse mail" | msgstr "Échec de la validation de l'adresse mail" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:130 | #: apps/registration/views.py:132 | ||||||
| msgid "Email validation email sent" | msgid "Email validation email sent" | ||||||
| msgstr "Mail de confirmation de l'adresse mail envoyé" | msgstr "Mail de confirmation de l'adresse mail envoyé" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:138 | #: apps/registration/views.py:140 | ||||||
| msgid "Resend email validation link" | msgid "Resend email validation link" | ||||||
| msgstr "Renvoyé le lien de validation de l'adresse mail" | msgstr "Renvoyé le lien de validation de l'adresse mail" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:165 | #: apps/registration/views.py:167 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Detail of user {user}" | msgid "Detail of user {user}" | ||||||
| msgstr "Détails de l'utilisateur {user}" | msgstr "Détails de l'utilisateur {user}" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:189 | #: apps/registration/views.py:191 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Update user {user}" | msgid "Update user {user}" | ||||||
| msgstr "Mise à jour de l'utilisateur {user}" | msgstr "Mise à jour de l'utilisateur {user}" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:318 | #: apps/registration/views.py:320 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Health sheet of {student}.{ext}" | msgid "Health sheet of {student}.{ext}" | ||||||
| msgstr "Fiche sanitaire de {student}.{ext}" | msgstr "Fiche sanitaire de {student}.{ext}" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:340 | #: apps/registration/views.py:342 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Parental authorization of {student}.{ext}" | msgid "Parental authorization of {student}.{ext}" | ||||||
| msgstr "Autorisation parentale de {student}.{ext}" | msgstr "Autorisation parentale de {student}.{ext}" | ||||||
| @@ -1137,7 +1448,8 @@ msgstr "Requête invalide" | |||||||
| #: tfjm/templates/400.html:7 | #: tfjm/templates/400.html:7 | ||||||
| msgid "" | msgid "" | ||||||
| "Sorry, your request was bad. Don't know what could be wrong. An email has " | "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 "" | msgstr "" | ||||||
| "Désolé, votre requête est invalide. Aucune idée de ce qui a pu se passer. Un " | "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 " | "email a été envoyé aux administrateurs avec les détails de l'erreur. Vous " | ||||||
| @@ -1179,7 +1491,8 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Désolé, une erreur est survenue lors du traitement de votre requête. Aucune " | "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 " | "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 | #: tfjm/templates/base.html:56 | ||||||
| msgid "Home" | msgid "Home" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user