diff --git a/apps/participation/migrations/0001_initial.py b/apps/participation/migrations/0001_initial.py index 5f13c35..8e526ee 100644 --- a/apps/participation/migrations/0001_initial.py +++ b/apps/participation/migrations/0001_initial.py @@ -1,5 +1,7 @@ # Generated by Django 3.0.11 on 2020-12-30 12:02 +from datetime import date + import django.core.validators from django.db import migrations, models import django.utils.timezone @@ -78,8 +80,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, unique=True, verbose_name='name')), - ('date_start', models.DateField(default=django.utils.timezone.now, verbose_name='start')), - ('date_end', models.DateField(default=django.utils.timezone.now, verbose_name='end')), + ('date_start', models.DateField(default=date.today, verbose_name='start')), + ('date_end', models.DateField(default=date.today, verbose_name='end')), ('inscription_limit', models.DateTimeField(default=django.utils.timezone.now, verbose_name='limit date for registrations')), ('solution_limit', models.DateTimeField(default=django.utils.timezone.now, verbose_name='limit date to upload solutions')), ('syntheses_first_phase_limit', models.DateTimeField(default=django.utils.timezone.now, verbose_name='limit date to upload the syntheses for the first phase')), diff --git a/apps/participation/models.py b/apps/participation/models.py index 9c547c1..111d4ee 100644 --- a/apps/participation/models.py +++ b/apps/participation/models.py @@ -1,6 +1,7 @@ # Copyright (C) 2020 by Animath # SPDX-License-Identifier: GPL-3.0-or-later +from datetime import date import os from address.models import AddressField @@ -123,12 +124,12 @@ class Tournament(models.Model): date_start = models.DateField( verbose_name=_("start"), - default=timezone.now, + default=date.today, ) date_end = models.DateField( verbose_name=_("end"), - default=timezone.now, + default=date.today, ) place = AddressField( diff --git a/apps/participation/tests.py b/apps/participation/tests.py index 245e5f1..597a2f0 100644 --- a/apps/participation/tests.py +++ b/apps/participation/tests.py @@ -9,7 +9,7 @@ from django.test import TestCase from django.urls import reverse from registration.models import CoachRegistration, StudentRegistration -from .models import Participation, Team +from .models import Participation, Team, Tournament class TestStudentParticipation(TestCase): @@ -67,6 +67,11 @@ class TestStudentParticipation(TestCase): ) CoachRegistration.objects.create(user=self.coach) + self.tournament = Tournament.objects.create( + name="France", + place="Here", + ) + def test_admin_pages(self): """ Load Django-admin pages. @@ -347,6 +352,7 @@ class TestStudentParticipation(TestCase): )) self.assertEqual(resp.status_code, 200) + self.team.participation.tournament = self.tournament self.team.participation.valid = False self.team.participation.save() diff --git a/apps/participation/views.py b/apps/participation/views.py index 61d5ed3..db962cb 100644 --- a/apps/participation/views.py +++ b/apps/participation/views.py @@ -174,10 +174,10 @@ class TeamDetailView(LoginRequiredMixin, FormMixin, ProcessFormView, DetailView) # A team is complete when there are at least 4 members plus a coache that have sent their authorizations, # their health sheet, they confirmed their email address and under-18 people sent their parental authorization. context["can_validate"] = team.students.count() >= 4 and team.coaches.exists() and \ - all(r.email_confirmed for r in team.students.all()) and \ - all(r.photo_authorization for r in team.participants.all()) and \ - all(r.health_sheet for r in team.participants.all()) and \ - all(r.parental_authorization for r in team.students.all() if r.under_18) + all(r.email_confirmed for r in team.students.all()) and \ + all(r.photo_authorization for r in team.participants.all()) and \ + all(r.health_sheet for r in team.participants.all()) and \ + all(r.parental_authorization for r in team.students.all() if r.under_18) return context diff --git a/apps/registration/models.py b/apps/registration/models.py index a385445..42ec201 100644 --- a/apps/registration/models.py +++ b/apps/registration/models.py @@ -340,6 +340,9 @@ class Payment(models.Model): def get_absolute_url(self): return reverse_lazy("registration:user_detail", args=(self.registration.user.id,)) + def __str__(self): + return _("Payment of {registration}").format(registration=self.registration) + class Meta: verbose_name = _("payment") verbose_name_plural = _("payments") diff --git a/apps/registration/signals.py b/apps/registration/signals.py index 15f5367..b8f6a12 100644 --- a/apps/registration/signals.py +++ b/apps/registration/signals.py @@ -3,7 +3,6 @@ from django.contrib.auth.models import User from tfjm.lists import get_sympa_client -from tfjm.matrix import Matrix from .models import AdminRegistration, Payment, Registration diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 1cc4326..446659b 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: TFJM\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-18 17:59+0100\n" +"POT-Creation-Date: 2021-01-18 22:27+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Yohann D'ANELLO \n" "Language-Team: LANGUAGE \n" @@ -99,12 +99,12 @@ 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:297 -#: apps/participation/tables.py:44 apps/registration/models.py:336 +#: apps/participation/admin.py:19 apps/participation/models.py:298 +#: apps/participation/tables.py:44 apps/registration/models.py:335 msgid "valid" msgstr "valide" -#: apps/participation/forms.py:22 apps/participation/models.py:36 +#: apps/participation/forms.py:22 apps/participation/models.py:37 msgid "The trigram must be composed of three uppercase letters." msgstr "Le trigramme doit être composé de trois lettres majuscules." @@ -128,279 +128,279 @@ msgstr "Le défenseur, l'opposant et le rapporteur doivent être différents." 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:120 +#: apps/participation/models.py:30 apps/participation/models.py:121 #: apps/participation/tables.py:17 apps/participation/tables.py:34 msgid "name" msgstr "nom" -#: apps/participation/models.py:35 apps/participation/tables.py:39 +#: apps/participation/models.py:36 apps/participation/tables.py:39 msgid "trigram" msgstr "trigramme" -#: apps/participation/models.py:43 +#: apps/participation/models.py:44 msgid "access code" msgstr "code d'accès" -#: apps/participation/models.py:44 +#: apps/participation/models.py:45 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:107 +#: apps/participation/models.py:108 #, python-brace-format msgid "Team {name} ({trigram})" msgstr "Équipe {name} ({trigram})" -#: apps/participation/models.py:110 apps/participation/models.py:282 +#: apps/participation/models.py:111 apps/participation/models.py:283 #: apps/registration/models.py:123 msgid "team" msgstr "équipe" -#: apps/participation/models.py:111 apps/participation/tables.py:84 +#: apps/participation/models.py:112 apps/participation/tables.py:84 msgid "teams" msgstr "équipes" -#: apps/participation/models.py:125 +#: apps/participation/models.py:126 msgid "start" msgstr "début" -#: apps/participation/models.py:130 +#: apps/participation/models.py:131 msgid "end" msgstr "fin" -#: apps/participation/models.py:135 apps/participation/models.py:376 +#: apps/participation/models.py:136 apps/participation/models.py:377 #: apps/participation/templates/participation/tournament_detail.html:18 msgid "place" msgstr "lieu" -#: apps/participation/models.py:139 +#: apps/participation/models.py:140 msgid "max team count" msgstr "nombre maximal d'équipes" -#: apps/participation/models.py:144 +#: apps/participation/models.py:145 #: apps/participation/templates/participation/tournament_detail.html:21 msgid "price" msgstr "prix" -#: apps/participation/models.py:149 +#: apps/participation/models.py:150 msgid "limit date for registrations" msgstr "date limite d'inscription" -#: apps/participation/models.py:154 +#: apps/participation/models.py:155 msgid "limit date to upload solutions" msgstr "date limite pour envoyer les solutions" -#: apps/participation/models.py:159 +#: apps/participation/models.py:160 msgid "random draw for solutions" msgstr "tirage au sort des solutions" -#: apps/participation/models.py:164 +#: apps/participation/models.py:165 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:169 +#: apps/participation/models.py:170 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:174 +#: apps/participation/models.py:175 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:179 +#: apps/participation/models.py:180 #: apps/participation/templates/participation/tournament_detail.html:45 msgid "description" msgstr "description" -#: apps/participation/models.py:185 +#: apps/participation/models.py:186 #: apps/participation/templates/participation/tournament_detail.html:12 msgid "organizers" msgstr "organisateurs" -#: apps/participation/models.py:190 +#: apps/participation/models.py:191 msgid "final" msgstr "finale" -#: apps/participation/models.py:267 apps/participation/models.py:291 -#: apps/participation/models.py:323 +#: apps/participation/models.py:268 apps/participation/models.py:292 +#: apps/participation/models.py:324 msgid "tournament" msgstr "tournoi" -#: apps/participation/models.py:268 +#: apps/participation/models.py:269 msgid "tournaments" msgstr "tournois" -#: apps/participation/models.py:298 +#: apps/participation/models.py:299 msgid "The participation got the validation of the organizers." msgstr "La participation a été validée par les organisateurs." -#: apps/participation/models.py:303 +#: apps/participation/models.py:304 msgid "selected for final" msgstr "sélectionnée pour la finale" -#: apps/participation/models.py:304 +#: apps/participation/models.py:305 msgid "The team is selected for the final tournament." msgstr "L'équipe est sélectionnée pour la finale." -#: apps/participation/models.py:311 +#: apps/participation/models.py:312 #, python-brace-format msgid "Participation of the team {name} ({trigram})" msgstr "Participation de l'équipe {name} ({trigram})" -#: apps/participation/models.py:314 apps/participation/models.py:498 -#: apps/participation/models.py:536 +#: apps/participation/models.py:315 apps/participation/models.py:499 +#: apps/participation/models.py:537 msgid "participation" msgstr "participation" -#: apps/participation/models.py:315 apps/participation/models.py:337 +#: apps/participation/models.py:316 apps/participation/models.py:338 msgid "participations" msgstr "participations" -#: apps/participation/models.py:327 +#: apps/participation/models.py:328 msgid "round" msgstr "tour" -#: apps/participation/models.py:329 apps/participation/models.py:330 +#: apps/participation/models.py:330 apps/participation/models.py:331 #, python-brace-format msgid "Round {round}" msgstr "Tour {round}" -#: apps/participation/models.py:343 +#: apps/participation/models.py:344 msgid "juries" msgstr "jurys" -#: apps/participation/models.py:357 +#: apps/participation/models.py:358 #, 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:363 apps/participation/models.py:371 +#: apps/participation/models.py:364 apps/participation/models.py:372 msgid "pool" msgstr "poule" -#: apps/participation/models.py:364 +#: apps/participation/models.py:365 msgid "pools" msgstr "poules" -#: apps/participation/models.py:378 +#: apps/participation/models.py:379 msgid "Where the solution is presented?" msgstr "Où est-ce que les solutions sont défendues ?" -#: apps/participation/models.py:383 +#: apps/participation/models.py:384 msgid "defended solution" msgstr "solution défendue" -#: apps/participation/models.py:385 apps/participation/models.py:505 +#: apps/participation/models.py:386 apps/participation/models.py:506 #, python-brace-format msgid "Problem #{problem}" msgstr "Problème n°{problem}" -#: apps/participation/models.py:392 apps/participation/tables.py:105 +#: apps/participation/models.py:393 apps/participation/tables.py:105 msgid "defender" msgstr "défenseur" -#: apps/participation/models.py:399 apps/participation/models.py:548 +#: apps/participation/models.py:400 apps/participation/models.py:549 msgid "opponent" msgstr "opposant" -#: apps/participation/models.py:406 apps/participation/models.py:549 +#: apps/participation/models.py:407 apps/participation/models.py:550 msgid "reporter" msgstr "rapporteur" -#: apps/participation/models.py:466 apps/participation/models.py:469 -#: apps/participation/models.py:472 +#: apps/participation/models.py:467 apps/participation/models.py:470 +#: apps/participation/models.py:473 #, 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:477 +#: apps/participation/models.py:478 #, python-brace-format msgid "Passage of {defender} for problem {problem}" msgstr "Passage de {defender} pour le problème {problem}" -#: apps/participation/models.py:481 apps/participation/models.py:543 -#: apps/participation/models.py:581 +#: apps/participation/models.py:482 apps/participation/models.py:544 +#: apps/participation/models.py:582 msgid "passage" msgstr "passage" -#: apps/participation/models.py:482 +#: apps/participation/models.py:483 msgid "passages" msgstr "passages" -#: apps/participation/models.py:503 +#: apps/participation/models.py:504 msgid "problem" msgstr "numéro de problème" -#: apps/participation/models.py:510 +#: apps/participation/models.py:511 msgid "solution for the final tournament" msgstr "solution pour la finale" -#: apps/participation/models.py:515 apps/participation/models.py:554 +#: apps/participation/models.py:516 apps/participation/models.py:555 msgid "file" msgstr "fichier" -#: apps/participation/models.py:523 +#: apps/participation/models.py:524 #, 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:527 +#: apps/participation/models.py:528 msgid "solution" msgstr "solution" -#: apps/participation/models.py:528 +#: apps/participation/models.py:529 msgid "solutions" msgstr "solutions" -#: apps/participation/models.py:562 +#: apps/participation/models.py:563 #, python-brace-format msgid "Synthesis for the {type} of the {passage}" msgstr "Synthèse pour {type} du {passage}" -#: apps/participation/models.py:565 +#: apps/participation/models.py:566 msgid "synthesis" msgstr "note de synthèse" -#: apps/participation/models.py:566 +#: apps/participation/models.py:567 msgid "syntheses" msgstr "notes de synthèse" -#: apps/participation/models.py:574 +#: apps/participation/models.py:575 msgid "jury" msgstr "jury" -#: apps/participation/models.py:586 +#: apps/participation/models.py:587 msgid "defender writing note" msgstr "note d'écrit du défenseur" -#: apps/participation/models.py:592 +#: apps/participation/models.py:593 msgid "defender oral note" msgstr "note d'oral du défenseur" -#: apps/participation/models.py:598 +#: apps/participation/models.py:599 msgid "opponent writing note" msgstr "note d'écrit de l'opposant" -#: apps/participation/models.py:604 +#: apps/participation/models.py:605 msgid "opponent oral note" msgstr "note d'oral de l'opposant" -#: apps/participation/models.py:610 +#: apps/participation/models.py:611 msgid "reporter writing note" msgstr "not d'écrit du rapporteur" -#: apps/participation/models.py:616 +#: apps/participation/models.py:617 msgid "reporter oral note" msgstr "note d'oral du rapporteur" -#: apps/participation/models.py:625 +#: apps/participation/models.py:626 #, python-brace-format msgid "Notes of {jury} for {passage}" msgstr "Notes de {jury} pour le {passage}" -#: apps/participation/models.py:632 +#: apps/participation/models.py:633 msgid "note" msgstr "note" -#: apps/participation/models.py:633 +#: apps/participation/models.py:634 msgid "notes" msgstr "notes" @@ -485,9 +485,11 @@ msgstr "Rejoindre" #: apps/participation/templates/participation/team_detail.html:148 #: apps/participation/templates/participation/tournament_form.html:12 #: apps/participation/templates/participation/update_team.html:12 +#: apps/registration/templates/registration/payment_form.html:11 #: apps/registration/templates/registration/update_user.html:16 -#: apps/registration/templates/registration/user_detail.html:127 -#: apps/registration/templates/registration/user_detail.html:136 +#: apps/registration/templates/registration/user_detail.html:140 +#: apps/registration/templates/registration/user_detail.html:149 +#: apps/registration/templates/registration/user_detail.html:177 msgid "Update" msgstr "Modifier" @@ -541,9 +543,10 @@ msgstr "Envoyer une solution" #: 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:141 -#: apps/registration/templates/registration/user_detail.html:146 -#: apps/registration/templates/registration/user_detail.html:151 +#: apps/registration/templates/registration/user_detail.html:155 +#: apps/registration/templates/registration/user_detail.html:160 +#: apps/registration/templates/registration/user_detail.html:165 +#: apps/registration/templates/registration/user_detail.html:170 msgid "Upload" msgstr "Téléverser" @@ -781,7 +784,7 @@ msgid "Update team" msgstr "Modifier l'équipe" #: apps/participation/templates/participation/team_detail.html:152 -#: apps/participation/views.py:351 +#: apps/participation/views.py:359 msgid "Leave team" msgstr "Quitter l'équipe" @@ -887,12 +890,12 @@ msgstr "Vous êtes déjà dans une équipe." msgid "Join team" msgstr "Rejoindre une équipe" -#: apps/participation/views.py:146 apps/participation/views.py:357 -#: apps/participation/views.py:390 +#: apps/participation/views.py:146 apps/participation/views.py:365 +#: apps/participation/views.py:398 msgid "You are not in a team." msgstr "Vous n'êtes pas dans une équipe." -#: apps/participation/views.py:147 apps/participation/views.py:391 +#: apps/participation/views.py:147 apps/participation/views.py:399 msgid "You don't participate, so you don't have any team." msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe." @@ -928,44 +931,44 @@ msgstr "Vous n'êtes pas administrateur." msgid "This team has no pending validation." msgstr "L'équipe n'a pas de validation en attente." -#: apps/participation/views.py:254 +#: apps/participation/views.py:262 msgid "You must specify if you validate the registration or not." msgstr "Vous devez spécifier si vous validez l'inscription ou non." -#: apps/participation/views.py:285 +#: apps/participation/views.py:293 #, python-brace-format msgid "Update team {trigram}" msgstr "Mise à jour de l'équipe {trigram}" -#: apps/participation/views.py:324 +#: apps/participation/views.py:332 #, python-brace-format msgid "Photo authorization of {participant}.{ext}" msgstr "Autorisation de droit à l'image de {participant}.{ext}" -#: apps/participation/views.py:330 +#: apps/participation/views.py:338 #, python-brace-format msgid "Parental authorization of {participant}.{ext}" msgstr "Autorisation parentale de {participant}.{ext}" -#: apps/participation/views.py:337 +#: apps/participation/views.py:345 #, python-brace-format msgid "Health sheet of {participant}.{ext}" msgstr "Fiche sanitaire de {participant}.{ext}" -#: apps/participation/views.py:341 +#: apps/participation/views.py:349 #, python-brace-format msgid "Photo authorizations of team {trigram}.zip" msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip" -#: apps/participation/views.py:359 +#: apps/participation/views.py:367 msgid "The team is already validated or the validation is pending." msgstr "La validation de l'équipe est déjà faite ou en cours." -#: apps/participation/views.py:405 +#: apps/participation/views.py:413 msgid "The team is not validated yet." msgstr "L'équipe n'est pas encore validée." -#: apps/participation/views.py:417 +#: apps/participation/views.py:425 #, python-brace-format msgid "Participation of team {trigram}" msgstr "Participation de l'équipe {trigram}" @@ -995,15 +998,23 @@ msgid "admin" msgstr "admin" #: apps/registration/forms.py:116 apps/registration/forms.py:138 -#: apps/registration/forms.py:160 +#: apps/registration/forms.py:160 apps/registration/forms.py:214 msgid "The uploaded file size must be under 2 Mo." msgstr "Le fichier envoyé doit peser moins de 2 Mo." #: apps/registration/forms.py:118 apps/registration/forms.py:140 -#: apps/registration/forms.py:162 +#: apps/registration/forms.py:162 apps/registration/forms.py:216 msgid "The uploaded file must be a PDF, PNG of JPEG file." msgstr "Le fichier envoyé doit être au format PDF, PNG ou JPEG." +#: apps/registration/forms.py:208 +msgid "Pending" +msgstr "En attente" + +#: apps/registration/forms.py:224 +msgid "You must upload your scholarship attestation." +msgstr "Vous devez envoyer votre attestation de bourse." + #: apps/registration/models.py:35 msgid "Grant Animath to contact me in the future about other actions" msgstr "" @@ -1145,19 +1156,24 @@ msgstr "Notification de bourse" msgid "only if you have a scholarship." msgstr "Nécessaire seulement si vous déclarez être boursier." -#: apps/registration/models.py:329 +#: apps/registration/models.py:328 msgid "additional information" msgstr "informations additionnelles" -#: apps/registration/models.py:330 +#: apps/registration/models.py:329 msgid "To help us to find your payment." msgstr "Pour nous aider à retrouver votre paiement, si nécessaire." -#: apps/registration/models.py:342 +#: apps/registration/models.py:344 +#, python-brace-format +msgid "Payment of {registration}" +msgstr "Paiement de {registration}" + +#: apps/registration/models.py:347 msgid "payment" msgstr "paiement" -#: apps/registration/models.py:343 +#: apps/registration/models.py:348 msgid "payments" msgstr "paiements" @@ -1169,7 +1185,7 @@ msgstr "nom de famille" #: apps/registration/templates/registration/add_organizer.html:12 #: apps/registration/templates/registration/add_organizer.html:19 #: apps/registration/templates/registration/user_list.html:8 -#: apps/registration/views.py:86 +#: apps/registration/views.py:85 msgid "Add organizer" msgstr "Ajouter un organisateur" @@ -1324,7 +1340,7 @@ 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:19 -#: apps/registration/views.py:42 +#: apps/registration/views.py:41 msgid "Sign up" msgstr "Inscription" @@ -1456,78 +1472,87 @@ msgstr "Informations de paiement :" msgid "yes,no,pending" msgstr "oui,non,en attente" -#: apps/registration/templates/registration/user_detail.html:120 +#: apps/registration/templates/registration/user_detail.html:123 +#: apps/registration/templates/registration/user_detail.html:126 msgid "valid:" msgstr "valide :" -#: apps/registration/templates/registration/user_detail.html:129 +#: apps/registration/templates/registration/user_detail.html:130 +#: apps/registration/templates/registration/user_detail.html:176 +#, fuzzy +#| msgid "Update team" +msgid "Update payment" +msgstr "Modifier l'équipe" + +#: apps/registration/templates/registration/user_detail.html:142 msgid "Impersonate" msgstr "Impersonifier" -#: apps/registration/templates/registration/user_detail.html:135 +#: apps/registration/templates/registration/user_detail.html:148 msgid "Update user" msgstr "Modifier l'utilisateur" -#: apps/registration/templates/registration/user_detail.html:140 -#: apps/registration/views.py:313 +#: apps/registration/templates/registration/user_detail.html:154 +#: apps/registration/views.py:312 msgid "Upload photo authorization" msgstr "Téléverser l'autorisation de droit à l'image" -#: apps/registration/templates/registration/user_detail.html:145 -#: apps/registration/views.py:339 +#: apps/registration/templates/registration/user_detail.html:159 +#: apps/registration/views.py:338 msgid "Upload health sheet" msgstr "Téléverser la fiche sanitaire" -#: apps/registration/templates/registration/user_detail.html:150 -#: apps/registration/views.py:365 +#: apps/registration/templates/registration/user_detail.html:164 +#: apps/registration/templates/registration/user_detail.html:169 +#: apps/registration/views.py:364 msgid "Upload parental authorization" msgstr "Téléverser l'autorisation parentale" -#: apps/registration/views.py:125 +#: apps/registration/views.py:124 msgid "New TFJM² organizer account" msgstr "Nouveau compte organisateur pour le TFJM²" -#: apps/registration/views.py:147 +#: apps/registration/views.py:146 msgid "Email validation" msgstr "Validation de l'adresse mail" -#: apps/registration/views.py:149 +#: apps/registration/views.py:148 msgid "Validate email" msgstr "Valider l'adresse mail" -#: apps/registration/views.py:188 +#: apps/registration/views.py:187 msgid "Email validation unsuccessful" msgstr "Échec de la validation de l'adresse mail" -#: apps/registration/views.py:199 +#: apps/registration/views.py:198 msgid "Email validation email sent" msgstr "Mail de confirmation de l'adresse mail envoyé" -#: apps/registration/views.py:207 +#: apps/registration/views.py:206 msgid "Resend email validation link" msgstr "Renvoyé le lien de validation de l'adresse mail" -#: apps/registration/views.py:247 +#: apps/registration/views.py:246 #, python-brace-format msgid "Detail of user {user}" msgstr "Détails de l'utilisateur {user}" -#: apps/registration/views.py:277 +#: apps/registration/views.py:276 #, python-brace-format msgid "Update user {user}" msgstr "Mise à jour de l'utilisateur {user}" -#: apps/registration/views.py:403 +#: apps/registration/views.py:427 #, python-brace-format msgid "Photo authorization of {student}.{ext}" msgstr "Autorisation de droit à l'image de {student}.{ext}" -#: apps/registration/views.py:426 +#: apps/registration/views.py:450 #, python-brace-format msgid "Health sheet of {student}.{ext}" msgstr "Fiche sanitaire de {student}.{ext}" -#: apps/registration/views.py:449 +#: apps/registration/views.py:473 #, python-brace-format msgid "Parental authorization of {student}.{ext}" msgstr "Autorisation parentale de {student}.{ext}"