mirror of
				https://gitlab.com/animath/si/plateforme-corres2math.git
				synced 2025-10-31 04:19:53 +01:00 
			
		
		
		
	Merge branch 'improvements' into 'master'
Improvements See merge request animath/si/plateforme-corres2math!7
This commit is contained in:
		| @@ -64,7 +64,7 @@ class StudentRegistrationForm(forms.ModelForm): | |||||||
|     """ |     """ | ||||||
|     class Meta: |     class Meta: | ||||||
|         model = StudentRegistration |         model = StudentRegistration | ||||||
|         fields = ('student_class', 'school', 'give_contact_to_animath',) |         fields = ('team', 'student_class', 'school', 'give_contact_to_animath', 'email_confirmed',) | ||||||
|  |  | ||||||
|  |  | ||||||
| class PhotoAuthorizationForm(forms.ModelForm): | class PhotoAuthorizationForm(forms.ModelForm): | ||||||
| @@ -92,7 +92,7 @@ class CoachRegistrationForm(forms.ModelForm): | |||||||
|     """ |     """ | ||||||
|     class Meta: |     class Meta: | ||||||
|         model = CoachRegistration |         model = CoachRegistration | ||||||
|         fields = ('professional_activity', 'give_contact_to_animath',) |         fields = ('team', 'professional_activity', 'give_contact_to_animath', 'email_confirmed',) | ||||||
|  |  | ||||||
|  |  | ||||||
| class AdminRegistrationForm(forms.ModelForm): | class AdminRegistrationForm(forms.ModelForm): | ||||||
| @@ -101,4 +101,4 @@ class AdminRegistrationForm(forms.ModelForm): | |||||||
|     """ |     """ | ||||||
|     class Meta: |     class Meta: | ||||||
|         model = AdminRegistration |         model = AdminRegistration | ||||||
|         fields = ('role', 'give_contact_to_animath',) |         fields = ('role', 'give_contact_to_animath', 'email_confirmed',) | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								apps/registration/templates/registration/user_list.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								apps/registration/templates/registration/user_list.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | {% extends "base.html" %} | ||||||
|  |  | ||||||
|  | {% load django_tables2 %} | ||||||
|  |  | ||||||
|  | {% block content %} | ||||||
|  |     {% render_table table %} | ||||||
|  | {% endblock %} | ||||||
| @@ -31,6 +31,10 @@ class TestIndexPage(TestCase): | |||||||
|         response = self.client.get(reverse("registration:reset_admin")) |         response = self.client.get(reverse("registration:reset_admin")) | ||||||
|         self.assertRedirects(response, reverse("login") + "?next=" + reverse("registration:reset_admin"), 302, 200) |         self.assertRedirects(response, reverse("login") + "?next=" + reverse("registration:reset_admin"), 302, 200) | ||||||
|  |  | ||||||
|  |         User.objects.create() | ||||||
|  |         response = self.client.get(reverse("registration:user_detail", args=(1,))) | ||||||
|  |         self.assertRedirects(response, reverse("login") + "?next=" + reverse("registration:user_detail", args=(1,))) | ||||||
|  |  | ||||||
|  |  | ||||||
| class TestRegistration(TestCase): | class TestRegistration(TestCase): | ||||||
|     def setUp(self) -> None: |     def setUp(self) -> None: | ||||||
| @@ -199,6 +203,13 @@ class TestRegistration(TestCase): | |||||||
|         response = self.client.get(reverse("registration:user_detail", args=(self.user.pk,))) |         response = self.client.get(reverse("registration:user_detail", args=(self.user.pk,))) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|  |  | ||||||
|  |     def test_user_list(self): | ||||||
|  |         """ | ||||||
|  |         Display the list of all users. | ||||||
|  |         """ | ||||||
|  |         response = self.client.get(reverse("registration:user_list")) | ||||||
|  |         self.assertEqual(response.status_code, 200) | ||||||
|  |  | ||||||
|     def test_update_user(self): |     def test_update_user(self): | ||||||
|         """ |         """ | ||||||
|         Update the user information, for each type of user. |         Update the user information, for each type of user. | ||||||
| @@ -222,6 +233,8 @@ class TestRegistration(TestCase): | |||||||
|                 last_name="Name", |                 last_name="Name", | ||||||
|                 email="new_" + user.email, |                 email="new_" + user.email, | ||||||
|                 give_contact_to_animath=True, |                 give_contact_to_animath=True, | ||||||
|  |                 email_confirmed=True, | ||||||
|  |                 team_id="", | ||||||
|             )) |             )) | ||||||
|             self.assertEqual(response.status_code, 200) |             self.assertEqual(response.status_code, 200) | ||||||
|  |  | ||||||
| @@ -230,6 +243,8 @@ class TestRegistration(TestCase): | |||||||
|                 last_name="Name", |                 last_name="Name", | ||||||
|                 email="new_" + user.email, |                 email="new_" + user.email, | ||||||
|                 give_contact_to_animath=True, |                 give_contact_to_animath=True, | ||||||
|  |                 email_confirmed=True, | ||||||
|  |                 team_id="", | ||||||
|             ) |             ) | ||||||
|             response = self.client.post(reverse("registration:update_user", args=(user.pk,)), data=data) |             response = self.client.post(reverse("registration:update_user", args=(user.pk,)), data=data) | ||||||
|             self.assertRedirects(response, reverse("registration:user_detail", args=(user.pk,)), 302, 200) |             self.assertRedirects(response, reverse("registration:user_detail", args=(user.pk,)), 302, 200) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| from django.urls import path | from django.urls import path | ||||||
|  |  | ||||||
| from .views import MyAccountDetailView, ResetAdminView, SignupView, UserDetailView, UserImpersonateView, \ | from .views import MyAccountDetailView, ResetAdminView, SignupView, UserDetailView, UserImpersonateView, \ | ||||||
|     UserResendValidationEmailView, UserUpdateView, UserUploadPhotoAuthorizationView, UserValidateView, \ |     UserListView, UserResendValidationEmailView, UserUpdateView, UserUploadPhotoAuthorizationView, UserValidateView, \ | ||||||
|     UserValidationEmailSentView |     UserValidationEmailSentView | ||||||
|  |  | ||||||
| app_name = "registration" | app_name = "registration" | ||||||
| @@ -18,5 +18,6 @@ urlpatterns = [ | |||||||
|     path("user/<int:pk>/upload-photo-authorization/", UserUploadPhotoAuthorizationView.as_view(), |     path("user/<int:pk>/upload-photo-authorization/", UserUploadPhotoAuthorizationView.as_view(), | ||||||
|          name="upload_user_photo_authorization"), |          name="upload_user_photo_authorization"), | ||||||
|     path("user/<int:pk>/impersonate/", UserImpersonateView.as_view(), name="user_impersonate"), |     path("user/<int:pk>/impersonate/", UserImpersonateView.as_view(), name="user_impersonate"), | ||||||
|  |     path("user/list/", UserListView.as_view(), name="user_list"), | ||||||
|     path("reset-admin/", ResetAdminView.as_view(), name="reset_admin"), |     path("reset-admin/", ResetAdminView.as_view(), name="reset_admin"), | ||||||
| ] | ] | ||||||
|   | |||||||
| @@ -1,6 +1,9 @@ | |||||||
| import os | import os | ||||||
|  |  | ||||||
|  | from django_tables2 import SingleTableView | ||||||
|  |  | ||||||
| from corres2math.tokens import email_validation_token | from corres2math.tokens import email_validation_token | ||||||
|  | from corres2math.views import AdminMixin | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
| from django.contrib.auth.mixins import LoginRequiredMixin | from django.contrib.auth.mixins import LoginRequiredMixin | ||||||
| from django.contrib.auth.models import User | from django.contrib.auth.models import User | ||||||
| @@ -16,7 +19,8 @@ from magic import Magic | |||||||
| from participation.models import Phase | from participation.models import Phase | ||||||
|  |  | ||||||
| from .forms import CoachRegistrationForm, PhotoAuthorizationForm, SignupForm, StudentRegistrationForm, UserForm | from .forms import CoachRegistrationForm, PhotoAuthorizationForm, SignupForm, StudentRegistrationForm, UserForm | ||||||
| from .models import StudentRegistration | from .models import StudentRegistration, Registration | ||||||
|  | from .tables import RegistrationTable | ||||||
|  |  | ||||||
|  |  | ||||||
| class SignupView(CreateView): | class SignupView(CreateView): | ||||||
| @@ -43,6 +47,11 @@ class SignupView(CreateView): | |||||||
|         context["student_registration_form"] = StudentRegistrationForm(self.request.POST or None) |         context["student_registration_form"] = StudentRegistrationForm(self.request.POST or None) | ||||||
|         context["coach_registration_form"] = CoachRegistrationForm(self.request.POST or None) |         context["coach_registration_form"] = CoachRegistrationForm(self.request.POST or None) | ||||||
|  |  | ||||||
|  |         del context["student_registration_form"].fields["team"] | ||||||
|  |         del context["student_registration_form"].fields["email_confirmed"] | ||||||
|  |         del context["coach_registration_form"].fields["team"] | ||||||
|  |         del context["coach_registration_form"].fields["email_confirmed"] | ||||||
|  |  | ||||||
|         return context |         return context | ||||||
|  |  | ||||||
|     @transaction.atomic |     @transaction.atomic | ||||||
| @@ -52,6 +61,8 @@ class SignupView(CreateView): | |||||||
|             registration_form = StudentRegistrationForm(self.request.POST) |             registration_form = StudentRegistrationForm(self.request.POST) | ||||||
|         else: |         else: | ||||||
|             registration_form = CoachRegistrationForm(self.request.POST) |             registration_form = CoachRegistrationForm(self.request.POST) | ||||||
|  |         del registration_form.fields["team"] | ||||||
|  |         del registration_form.fields["email_confirmed"] | ||||||
|  |  | ||||||
|         if not registration_form.is_valid(): |         if not registration_form.is_valid(): | ||||||
|             return self.form_invalid(form) |             return self.form_invalid(form) | ||||||
| @@ -158,6 +169,8 @@ class UserDetailView(LoginRequiredMixin, DetailView): | |||||||
|  |  | ||||||
|     def dispatch(self, request, *args, **kwargs): |     def dispatch(self, request, *args, **kwargs): | ||||||
|         user = request.user |         user = request.user | ||||||
|  |         if not user.is_authenticated: | ||||||
|  |             return self.handle_no_permission() | ||||||
|         # Only an admin or the concerned user can see the information |         # Only an admin or the concerned user can see the information | ||||||
|         if not user.registration.is_admin and user.pk != kwargs["pk"]: |         if not user.registration.is_admin and user.pk != kwargs["pk"]: | ||||||
|             raise PermissionDenied |             raise PermissionDenied | ||||||
| @@ -169,6 +182,15 @@ class UserDetailView(LoginRequiredMixin, DetailView): | |||||||
|         return context |         return context | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class UserListView(AdminMixin, SingleTableView): | ||||||
|  |     """ | ||||||
|  |     Display the list of all registered users. | ||||||
|  |     """ | ||||||
|  |     model = Registration | ||||||
|  |     table_class = RegistrationTable | ||||||
|  |     template_name = "registration/user_list.html" | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserUpdateView(LoginRequiredMixin, UpdateView): | class UserUpdateView(LoginRequiredMixin, UpdateView): | ||||||
|     """ |     """ | ||||||
|     Update the detail about a user and its registration. |     Update the detail about a user and its registration. | ||||||
| @@ -189,6 +211,10 @@ class UserUpdateView(LoginRequiredMixin, UpdateView): | |||||||
|         context["title"] = _("Update user {user}").format(user=str(self.object.registration)) |         context["title"] = _("Update user {user}").format(user=str(self.object.registration)) | ||||||
|         context["registration_form"] = user.registration.form_class(data=self.request.POST or None, |         context["registration_form"] = user.registration.form_class(data=self.request.POST or None, | ||||||
|                                                                     instance=self.object.registration) |                                                                     instance=self.object.registration) | ||||||
|  |         if not user.registration.is_admin: | ||||||
|  |             if "team" in context["registration_form"].fields: | ||||||
|  |                 del context["registration_form"].fields["team"] | ||||||
|  |             del context["registration_form"].fields["email_confirmed"] | ||||||
|         return context |         return context | ||||||
|  |  | ||||||
|     @transaction.atomic |     @transaction.atomic | ||||||
| @@ -196,6 +222,11 @@ class UserUpdateView(LoginRequiredMixin, UpdateView): | |||||||
|         user = form.instance |         user = form.instance | ||||||
|         registration_form = user.registration.form_class(data=self.request.POST or None, |         registration_form = user.registration.form_class(data=self.request.POST or None, | ||||||
|                                                          instance=self.object.registration) |                                                          instance=self.object.registration) | ||||||
|  |         if not user.registration.is_admin: | ||||||
|  |             if "team" in registration_form.fields: | ||||||
|  |                 del registration_form.fields["team"] | ||||||
|  |             del registration_form.fields["email_confirmed"] | ||||||
|  |  | ||||||
|         if not registration_form.is_valid(): |         if not registration_form.is_valid(): | ||||||
|             return self.form_invalid(form) |             return self.form_invalid(form) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -71,6 +71,9 @@ | |||||||
|                     {% endif %} |                     {% endif %} | ||||||
|                 </li> |                 </li> | ||||||
|                 {% if user.is_authenticated and user.registration.is_admin %} |                 {% if user.is_authenticated and user.registration.is_admin %} | ||||||
|  |                     <li class="nav-item active"> | ||||||
|  |                         <a href="{% url "registration:user_list" %}" class="nav-link"><i class="fas fa-user"></i> {% trans "Users" %}</a> | ||||||
|  |                     </li> | ||||||
|                     <li class="nav-item active"> |                     <li class="nav-item active"> | ||||||
|                         <a href="#" class="nav-link" data-toggle="modal" data-target="#teamsModal"><i class="fas fa-users"></i> {% trans "Teams" %}</a> |                         <a href="#" class="nav-link" data-toggle="modal" data-target="#teamsModal"><i class="fas fa-users"></i> {% trans "Teams" %}</a> | ||||||
|                     </li> |                     </li> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: Corres2math\n" | "Project-Id-Version: Corres2math\n" | ||||||
| "Report-Msgid-Bugs-To: \n" | "Report-Msgid-Bugs-To: \n" | ||||||
| "POT-Creation-Date: 2020-12-04 01:42+0100\n" | "POT-Creation-Date: 2020-12-11 14:03+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,13 +99,13 @@ 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:16 apps/participation/models.py:121 | #: apps/participation/admin.py:16 apps/participation/models.py:132 | ||||||
| #: apps/participation/tables.py:35 apps/participation/tables.py:62 | #: apps/participation/tables.py:35 apps/participation/tables.py:62 | ||||||
| msgid "problem number" | msgid "problem number" | ||||||
| msgstr "numéro de problème" | msgstr "numéro de problème" | ||||||
|  |  | ||||||
| #: apps/participation/admin.py:21 apps/participation/models.py:127 | #: apps/participation/admin.py:21 apps/participation/models.py:138 | ||||||
| #: apps/participation/models.py:181 | #: apps/participation/models.py:192 | ||||||
| msgid "valid" | msgid "valid" | ||||||
| msgstr "valide" | msgstr "valide" | ||||||
|  |  | ||||||
| @@ -184,96 +184,96 @@ msgstr "" | |||||||
| "Donner l'autorisation de publier la vidéo sur le site principal pour " | "Donner l'autorisation de publier la vidéo sur le site principal pour " | ||||||
| "promouvoir les Correspondances." | "promouvoir les Correspondances." | ||||||
|  |  | ||||||
| #: apps/participation/models.py:96 | #: apps/participation/models.py:107 | ||||||
| #, 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:99 apps/participation/models.py:114 | #: apps/participation/models.py:110 apps/participation/models.py:125 | ||||||
| #: apps/registration/models.py:106 apps/registration/models.py:155 | #: apps/registration/models.py:106 apps/registration/models.py:155 | ||||||
| msgid "team" | msgid "team" | ||||||
| msgstr "équipe" | msgstr "équipe" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:100 | #: apps/participation/models.py:111 | ||||||
| msgid "teams" | msgid "teams" | ||||||
| msgstr "équipes" | msgstr "équipes" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:118 | #: apps/participation/models.py:129 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Problem #{problem:d}" | msgid "Problem #{problem:d}" | ||||||
| msgstr "Problème n°{problem:d}" | msgstr "Problème n°{problem:d}" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:128 apps/participation/models.py:182 | #: apps/participation/models.py:139 apps/participation/models.py:193 | ||||||
| msgid "The video got the validation of the administrators." | msgid "The video got the validation of the administrators." | ||||||
| msgstr "La vidéo a été validée par les administrateurs." | msgstr "La vidéo a été validée par les administrateurs." | ||||||
|  |  | ||||||
| #: apps/participation/models.py:137 | #: apps/participation/models.py:148 | ||||||
| msgid "solution video" | msgid "solution video" | ||||||
| msgstr "vidéo de solution" | msgstr "vidéo de solution" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:146 | #: apps/participation/models.py:157 | ||||||
| msgid "received participation" | msgid "received participation" | ||||||
| msgstr "participation reçue" | msgstr "participation reçue" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:155 | #: apps/participation/models.py:166 | ||||||
| msgid "synthesis video" | msgid "synthesis video" | ||||||
| msgstr "vidéo de synthèse" | msgstr "vidéo de synthèse" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:162 | #: apps/participation/models.py:173 | ||||||
| #, 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:165 apps/participation/models.py:239 | #: apps/participation/models.py:176 apps/participation/models.py:250 | ||||||
| msgid "participation" | msgid "participation" | ||||||
| msgstr "participation" | msgstr "participation" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:166 | #: apps/participation/models.py:177 | ||||||
| msgid "participations" | msgid "participations" | ||||||
| msgstr "participations" | msgstr "participations" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:174 | #: apps/participation/models.py:185 | ||||||
| msgid "link" | msgid "link" | ||||||
| msgstr "lien" | msgstr "lien" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:175 | #: apps/participation/models.py:186 | ||||||
| msgid "The full video link." | msgid "The full video link." | ||||||
| msgstr "Le lien complet de la vidéo." | msgstr "Le lien complet de la vidéo." | ||||||
|  |  | ||||||
| #: apps/participation/models.py:224 | #: apps/participation/models.py:235 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Video of team {name} ({trigram})" | msgid "Video of team {name} ({trigram})" | ||||||
| msgstr "Vidéo de l'équipe {name} ({trigram})" | msgstr "Vidéo de l'équipe {name} ({trigram})" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:228 | #: apps/participation/models.py:239 | ||||||
| msgid "video" | msgid "video" | ||||||
| msgstr "vidéo" | msgstr "vidéo" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:229 | #: apps/participation/models.py:240 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "vidéos" | msgstr "vidéos" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:244 | #: apps/participation/models.py:255 | ||||||
| msgid "question" | msgid "question" | ||||||
| msgstr "question" | msgstr "question" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:258 | #: apps/participation/models.py:269 | ||||||
| msgid "phase number" | msgid "phase number" | ||||||
| msgstr "phase" | msgstr "phase" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:263 | #: apps/participation/models.py:274 | ||||||
| msgid "phase description" | msgid "phase description" | ||||||
| msgstr "description" | msgstr "description" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:267 | #: apps/participation/models.py:278 | ||||||
| msgid "start date of the given phase" | msgid "start date of the given phase" | ||||||
| msgstr "début de la phase" | msgstr "début de la phase" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:272 | #: apps/participation/models.py:283 | ||||||
| msgid "end date of the given phase" | msgid "end date of the given phase" | ||||||
| msgstr "fin de la phase" | msgstr "fin de la phase" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:290 | #: apps/participation/models.py:299 | ||||||
| msgid "" | msgid "" | ||||||
| "Phase {phase_number:d} starts on {start:%Y-%m-%d %H:%M} and ends on {end:%Y-" | "Phase {phase_number:d} starts on {start:%Y-%m-%d %H:%M} and ends on {end:%Y-" | ||||||
| "%m-%d %H:%M}" | "%m-%d %H:%M}" | ||||||
| @@ -281,11 +281,11 @@ msgstr "" | |||||||
| "Phase {phase_number:d} démarrant le {start:%d/%m/%Y %H:%M} et finissant le " | "Phase {phase_number:d} démarrant le {start:%d/%m/%Y %H:%M} et finissant le " | ||||||
| "{end:%d/%m/%Y %H:%M}" | "{end:%d/%m/%Y %H:%M}" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:294 | #: apps/participation/models.py:303 | ||||||
| msgid "phase" | msgid "phase" | ||||||
| msgstr "phase" | msgstr "phase" | ||||||
|  |  | ||||||
| #: apps/participation/models.py:295 | #: apps/participation/models.py:304 | ||||||
| msgid "phases" | msgid "phases" | ||||||
| msgstr "phases" | msgstr "phases" | ||||||
|  |  | ||||||
| @@ -324,12 +324,12 @@ msgstr "" | |||||||
| "contacter :)" | "contacter :)" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/create_team.html:11 | #: apps/participation/templates/participation/create_team.html:11 | ||||||
| #: corres2math/templates/base.html:237 | #: corres2math/templates/base.html:242 | ||||||
| msgid "Create" | msgid "Create" | ||||||
| msgstr "Créer" | msgstr "Créer" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/join_team.html:11 | #: apps/participation/templates/participation/join_team.html:11 | ||||||
| #: corres2math/templates/base.html:232 | #: corres2math/templates/base.html:237 | ||||||
| msgid "Join" | msgid "Join" | ||||||
| msgstr "Rejoindre" | msgstr "Rejoindre" | ||||||
|  |  | ||||||
| @@ -503,7 +503,7 @@ msgstr "Définir l'équipe qui recevra votre vidéo" | |||||||
|  |  | ||||||
| #: apps/participation/templates/participation/participation_detail.html:181 | #: apps/participation/templates/participation/participation_detail.html:181 | ||||||
| #: apps/participation/templates/participation/participation_detail.html:233 | #: apps/participation/templates/participation/participation_detail.html:233 | ||||||
| #: apps/participation/views.py:494 | #: apps/participation/views.py:499 | ||||||
| msgid "Upload video" | msgid "Upload video" | ||||||
| msgstr "Envoyer la vidéo" | msgstr "Envoyer la vidéo" | ||||||
|  |  | ||||||
| @@ -538,7 +538,7 @@ msgid "Update question" | |||||||
| msgstr "Modifier la question" | msgstr "Modifier la question" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/participation_detail.html:217 | #: apps/participation/templates/participation/participation_detail.html:217 | ||||||
| #: apps/participation/views.py:470 | #: apps/participation/views.py:475 | ||||||
| msgid "Delete question" | msgid "Delete question" | ||||||
| msgstr "Supprimer la question" | msgstr "Supprimer la question" | ||||||
|  |  | ||||||
| @@ -548,8 +548,8 @@ msgid "Display synthesis" | |||||||
| msgstr "Afficher la synthèse" | msgstr "Afficher la synthèse" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/phase_list.html:10 | #: apps/participation/templates/participation/phase_list.html:10 | ||||||
| #: apps/participation/views.py:513 corres2math/templates/base.html:68 | #: apps/participation/views.py:518 corres2math/templates/base.html:68 | ||||||
| #: corres2math/templates/base.html:70 corres2math/templates/base.html:221 | #: corres2math/templates/base.html:70 corres2math/templates/base.html:226 | ||||||
| msgid "Calendar" | msgid "Calendar" | ||||||
| msgstr "Calendrier" | msgstr "Calendrier" | ||||||
|  |  | ||||||
| @@ -661,7 +661,7 @@ msgid "Update team" | |||||||
| msgstr "Modifier l'équipe" | msgstr "Modifier l'équipe" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_detail.html:127 | #: apps/participation/templates/participation/team_detail.html:127 | ||||||
| #: apps/participation/views.py:323 | #: apps/participation/views.py:328 | ||||||
| msgid "Leave team" | msgid "Leave team" | ||||||
| msgstr "Quitter l'équipe" | msgstr "Quitter l'équipe" | ||||||
|  |  | ||||||
| @@ -670,12 +670,12 @@ msgid "Are you sure that you want to leave this team?" | |||||||
| msgstr "Êtes-vous sûr·e de vouloir quitter cette équipe ?" | msgstr "Êtes-vous sûr·e de vouloir quitter cette équipe ?" | ||||||
|  |  | ||||||
| #: apps/participation/templates/participation/team_list.html:6 | #: apps/participation/templates/participation/team_list.html:6 | ||||||
| #: corres2math/templates/base.html:225 | #: corres2math/templates/base.html:230 | ||||||
| msgid "All teams" | msgid "All teams" | ||||||
| msgstr "Toutes les équipes" | msgstr "Toutes les équipes" | ||||||
|  |  | ||||||
| #: apps/participation/views.py:36 corres2math/templates/base.html:81 | #: apps/participation/views.py:36 corres2math/templates/base.html:84 | ||||||
| #: corres2math/templates/base.html:236 | #: corres2math/templates/base.html:241 | ||||||
| msgid "Create team" | msgid "Create team" | ||||||
| msgstr "Créer une équipe" | msgstr "Créer une équipe" | ||||||
|  |  | ||||||
| @@ -687,17 +687,17 @@ msgstr "Vous ne participez pas, vous ne pouvez pas créer d'équipe." | |||||||
| msgid "You are already in a team." | msgid "You are already in a team." | ||||||
| msgstr "Vous êtes déjà dans une équipe." | msgstr "Vous êtes déjà dans une équipe." | ||||||
|  |  | ||||||
| #: apps/participation/views.py:82 corres2math/templates/base.html:86 | #: apps/participation/views.py:82 corres2math/templates/base.html:89 | ||||||
| #: corres2math/templates/base.html:231 | #: corres2math/templates/base.html:236 | ||||||
| msgid "Join team" | msgid "Join team" | ||||||
| msgstr "Rejoindre une équipe" | msgstr "Rejoindre une équipe" | ||||||
|  |  | ||||||
| #: apps/participation/views.py:142 apps/participation/views.py:329 | #: apps/participation/views.py:142 apps/participation/views.py:334 | ||||||
| #: apps/participation/views.py:362 | #: apps/participation/views.py:367 | ||||||
| msgid "You are not in a team." | msgid "You are not in a team." | ||||||
| msgstr "Vous n'êtes pas dans une équipe." | msgstr "Vous n'êtes pas dans une équipe." | ||||||
|  |  | ||||||
| #: apps/participation/views.py:143 apps/participation/views.py:363 | #: apps/participation/views.py:143 apps/participation/views.py:368 | ||||||
| msgid "You don't participate, so you don't have any team." | msgid "You don't participate, so you don't have any team." | ||||||
| msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe." | msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe." | ||||||
|  |  | ||||||
| @@ -733,43 +733,43 @@ msgstr "Vous n'êtes pas administrateur." | |||||||
| msgid "This team has no pending validation." | msgid "This team has no pending validation." | ||||||
| msgstr "L'équipe n'a pas de validation en attente." | msgstr "L'équipe n'a pas de validation en attente." | ||||||
|  |  | ||||||
| #: apps/participation/views.py:244 | #: apps/participation/views.py:249 | ||||||
| msgid "You must specify if you validate the registration or not." | msgid "You must specify if you validate the registration or not." | ||||||
| msgstr "Vous devez spécifier si vous validez l'inscription ou non." | msgstr "Vous devez spécifier si vous validez l'inscription ou non." | ||||||
|  |  | ||||||
| #: apps/participation/views.py:272 | #: apps/participation/views.py:277 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| 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:309 apps/registration/views.py:243 | #: apps/participation/views.py:314 apps/registration/views.py:284 | ||||||
| #, 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}" | ||||||
|  |  | ||||||
| #: apps/participation/views.py:313 | #: apps/participation/views.py:318 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Photo authorizations of team {trigram}.zip" | msgid "Photo authorizations of team {trigram}.zip" | ||||||
| msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip" | msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip" | ||||||
|  |  | ||||||
| #: apps/participation/views.py:331 | #: apps/participation/views.py:336 | ||||||
| msgid "The team is already validated or the validation is pending." | msgid "The team is already validated or the validation is pending." | ||||||
| msgstr "La validation de l'équipe est déjà faite ou en cours." | msgstr "La validation de l'équipe est déjà faite ou en cours." | ||||||
|  |  | ||||||
| #: apps/participation/views.py:375 | #: apps/participation/views.py:380 | ||||||
| msgid "The team is not validated yet." | msgid "The team is not validated yet." | ||||||
| msgstr "L'équipe n'est pas encore validée." | msgstr "L'équipe n'est pas encore validée." | ||||||
|  |  | ||||||
| #: apps/participation/views.py:385 | #: apps/participation/views.py:390 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Participation of team {trigram}" | msgid "Participation of team {trigram}" | ||||||
| msgstr "Participation de l'équipe {trigram}" | msgstr "Participation de l'équipe {trigram}" | ||||||
|  |  | ||||||
| #: apps/participation/views.py:422 | #: apps/participation/views.py:427 | ||||||
| msgid "Create question" | msgid "Create question" | ||||||
| msgstr "Créer une question" | msgstr "Créer une question" | ||||||
|  |  | ||||||
| #: apps/participation/views.py:522 | #: apps/participation/views.py:527 | ||||||
| msgid "Calendar update" | msgid "Calendar update" | ||||||
| msgstr "Mise à jour du calendrier" | msgstr "Mise à jour du calendrier" | ||||||
|  |  | ||||||
| @@ -966,8 +966,8 @@ msgid "Your password has been set. You may go ahead and log in now." | |||||||
| msgstr "Votre mot de passe a été changé. Vous pouvez désormais vous connecter." | msgstr "Votre mot de passe a été changé. Vous pouvez désormais vous connecter." | ||||||
|  |  | ||||||
| #: apps/registration/templates/registration/password_reset_complete.html:10 | #: apps/registration/templates/registration/password_reset_complete.html:10 | ||||||
| #: corres2math/templates/base.html:134 corres2math/templates/base.html:241 | #: corres2math/templates/base.html:139 corres2math/templates/base.html:246 | ||||||
| #: corres2math/templates/base.html:242 | #: corres2math/templates/base.html:247 | ||||||
| #: corres2math/templates/registration/login.html:7 | #: corres2math/templates/registration/login.html:7 | ||||||
| #: corres2math/templates/registration/login.html:8 | #: corres2math/templates/registration/login.html:8 | ||||||
| #: corres2math/templates/registration/login.html:25 | #: corres2math/templates/registration/login.html:25 | ||||||
| @@ -1024,7 +1024,7 @@ 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:8 | #: apps/registration/templates/registration/signup.html:8 | ||||||
| #: apps/registration/templates/registration/signup.html:20 | #: apps/registration/templates/registration/signup.html:20 | ||||||
| #: apps/registration/views.py:29 | #: apps/registration/views.py:33 | ||||||
| msgid "Sign up" | msgid "Sign up" | ||||||
| msgstr "Inscription" | msgstr "Inscription" | ||||||
|  |  | ||||||
| @@ -1101,40 +1101,40 @@ msgid "Update user" | |||||||
| msgstr "Modifier l'utilisateur" | msgstr "Modifier l'utilisateur" | ||||||
|  |  | ||||||
| #: apps/registration/templates/registration/user_detail.html:77 | #: apps/registration/templates/registration/user_detail.html:77 | ||||||
| #: apps/registration/views.py:216 | #: apps/registration/views.py:247 | ||||||
| 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/views.py:37 | #: apps/registration/views.py:41 | ||||||
| msgid "You can't register now." | msgid "You can't register now." | ||||||
| msgstr "Vous ne pouvez pas vous inscrire maintenant." | msgstr "Vous ne pouvez pas vous inscrire maintenant." | ||||||
|  |  | ||||||
| #: apps/registration/views.py:74 | #: apps/registration/views.py:85 | ||||||
| msgid "Email validation" | msgid "Email validation" | ||||||
| msgstr "Validation de l'adresse mail" | msgstr "Validation de l'adresse mail" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:76 | #: apps/registration/views.py:87 | ||||||
| msgid "Validate email" | msgid "Validate email" | ||||||
| msgstr "Valider l'adresse mail" | msgstr "Valider l'adresse mail" | ||||||
|  |  | ||||||
| #: apps/registration/views.py:115 | #: apps/registration/views.py:126 | ||||||
| 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:126 | #: apps/registration/views.py:137 | ||||||
| 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:134 | #: apps/registration/views.py:145 | ||||||
| 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:168 | #: apps/registration/views.py:181 | ||||||
| #, 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:211 | ||||||
| #, 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}" | ||||||
| @@ -1205,46 +1205,50 @@ msgid "Home" | |||||||
| msgstr "Accueil" | msgstr "Accueil" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:75 | #: corres2math/templates/base.html:75 | ||||||
|  | msgid "Users" | ||||||
|  | msgstr "Utilisateurs" | ||||||
|  |  | ||||||
|  | #: corres2math/templates/base.html:78 | ||||||
| msgid "Teams" | msgid "Teams" | ||||||
| msgstr "Équipes" | msgstr "Équipes" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:92 | #: corres2math/templates/base.html:95 | ||||||
| msgid "My team" | msgid "My team" | ||||||
| msgstr "Mon équipe" | msgstr "Mon équipe" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:97 | #: corres2math/templates/base.html:100 | ||||||
| msgid "My participation" | msgid "My participation" | ||||||
| msgstr "Ma participation" | msgstr "Ma participation" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:104 | #: corres2math/templates/base.html:107 | ||||||
| msgid "Chat" | msgid "Chat" | ||||||
| msgstr "Chat" | msgstr "Chat" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:108 | #: corres2math/templates/base.html:111 | ||||||
| msgid "Administration" | msgid "Administration" | ||||||
| msgstr "Administration" | msgstr "Administration" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:116 | #: corres2math/templates/base.html:119 | ||||||
| msgid "Search..." | msgid "Search..." | ||||||
| msgstr "Chercher ..." | msgstr "Chercher ..." | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:125 | #: corres2math/templates/base.html:128 | ||||||
| msgid "Return to admin view" | msgid "Return to admin view" | ||||||
| msgstr "Retourner à l'interface administrateur" | msgstr "Retourner à l'interface administrateur" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:130 | #: corres2math/templates/base.html:134 | ||||||
| msgid "Register" | msgid "Register" | ||||||
| msgstr "S'inscrire" | msgstr "S'inscrire" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:146 | #: corres2math/templates/base.html:151 | ||||||
| msgid "My account" | msgid "My account" | ||||||
| msgstr "Mon compte" | msgstr "Mon compte" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:149 | #: corres2math/templates/base.html:154 | ||||||
| msgid "Log out" | msgid "Log out" | ||||||
| msgstr "Déconnexion" | msgstr "Déconnexion" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:166 | #: corres2math/templates/base.html:171 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "" | msgid "" | ||||||
| "Your email address is not validated. Please click on the link you received " | "Your email address is not validated. Please click on the link you received " | ||||||
| @@ -1255,11 +1259,11 @@ msgstr "" | |||||||
| "avez reçu par mail. Vous pouvez renvoyer un mail en cliquant sur <a href=" | "avez reçu par mail. Vous pouvez renvoyer un mail en cliquant sur <a href=" | ||||||
| "\"%(send_email_url)s\">ce lien</a>." | "\"%(send_email_url)s\">ce lien</a>." | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:190 | #: corres2math/templates/base.html:195 | ||||||
| msgid "Contact us" | msgid "Contact us" | ||||||
| msgstr "Nous contacter" | msgstr "Nous contacter" | ||||||
|  |  | ||||||
| #: corres2math/templates/base.html:228 | #: corres2math/templates/base.html:233 | ||||||
| msgid "Search results" | msgid "Search results" | ||||||
| msgstr "Résultats de la recherche" | msgstr "Résultats de la recherche" | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user