mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-02-13 22:21:18 +00: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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user