From fae4ee7105250016b25f00844166b394a995d475 Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Mon, 20 Feb 2023 00:23:18 +0100 Subject: [PATCH] Drop AdminRegistration in favour of a new boolean field, closes #19 --- apps/participation/forms.py | 1 - .../commands/fix_matrix_channels.py | 8 +- .../management/commands/fix_sympa_lists.py | 4 +- apps/registration/admin.py | 8 +- apps/registration/api/serializers.py | 9 +- apps/registration/apps.py | 1 - apps/registration/forms.py | 23 +-- .../migrations/0004_volunteer_admin.py | 51 +++++++ apps/registration/models.py | 35 ++--- apps/registration/signals.py | 4 +- apps/registration/tables.py | 2 +- .../templates/registration/user_detail.html | 4 +- apps/registration/tests.py | 6 +- apps/registration/views.py | 23 ++- locale/fr/LC_MESSAGES/django.po | 132 ++++++++++-------- 15 files changed, 164 insertions(+), 147 deletions(-) create mode 100644 apps/registration/migrations/0004_volunteer_admin.py diff --git a/apps/participation/forms.py b/apps/participation/forms.py index 121d49d..b75c1b8 100644 --- a/apps/participation/forms.py +++ b/apps/participation/forms.py @@ -12,7 +12,6 @@ from django.core.exceptions import ValidationError from django.core.validators import FileExtensionValidator from django.utils.translation import gettext_lazy as _ from pypdf import PdfFileReader - from registration.models import VolunteerRegistration from .models import Note, Participation, Passage, Pool, Solution, Synthesis, Team, Tournament diff --git a/apps/participation/management/commands/fix_matrix_channels.py b/apps/participation/management/commands/fix_matrix_channels.py index 9ae30c2..1cf99df 100644 --- a/apps/participation/management/commands/fix_matrix_channels.py +++ b/apps/participation/management/commands/fix_matrix_channels.py @@ -8,7 +8,7 @@ from django.core.management import BaseCommand from django.utils.http import urlencode from django.utils.translation import activate from participation.models import Team, Tournament -from registration.models import AdminRegistration, Registration, VolunteerRegistration +from registration.models import Registration, VolunteerRegistration from tfjm.matrix import Matrix, RoomPreset, RoomVisibility @@ -163,7 +163,7 @@ class Command(BaseCommand): self.stdout.write(f"Invite {volunteer} in #aide-jury-orgas...") # Admins are admins - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): self.stdout.write(f"Invite {admin} in #cno and #dev-bot...") await Matrix.invite("#cno:tfjm.org", f"@{admin.matrix_username}:tfjm.org") await Matrix.invite("#dev-bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org") @@ -264,7 +264,7 @@ class Command(BaseCommand): await Matrix.set_room_avatar(f"#tirage-au-sort-{slug}:tfjm.org", avatar_uri) # Invite admins and give permissions - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): self.stdout.write(f"Invite {admin} in all channels of the tournament {name}...") await Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") await Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") @@ -374,7 +374,7 @@ class Command(BaseCommand): "customwidget", "Tableau", str(pool)) # Invite admins and give permissions - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): await Matrix.invite(f"#poule-{slug}-{pool.id}{suffix}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") await Matrix.invite(f"#poule-{slug}-{pool.id}{suffix}-jurys:tfjm.org", diff --git a/apps/participation/management/commands/fix_sympa_lists.py b/apps/participation/management/commands/fix_sympa_lists.py index 73abb90..4089a08 100644 --- a/apps/participation/management/commands/fix_sympa_lists.py +++ b/apps/participation/management/commands/fix_sympa_lists.py @@ -4,7 +4,7 @@ from django.core.management import BaseCommand from django.db.models import Q from participation.models import Team, Tournament -from registration.models import AdminRegistration, ParticipantRegistration, VolunteerRegistration +from registration.models import ParticipantRegistration, VolunteerRegistration from tfjm.lists import get_sympa_client @@ -71,5 +71,5 @@ class Command(BaseCommand): slug = jury_in.tournament.name.lower().replace(" ", "-") sympa.subscribe(volunteer.user.email, f"jurys-{slug}", True) - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): sympa.subscribe(admin.user.email, "admins", True) diff --git a/apps/registration/admin.py b/apps/registration/admin.py index 04486cb..10ba861 100644 --- a/apps/registration/admin.py +++ b/apps/registration/admin.py @@ -5,12 +5,12 @@ from django.contrib import admin from django.contrib.admin import ModelAdmin from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicParentModelAdmin -from .models import AdminRegistration, CoachRegistration, Payment, Registration, StudentRegistration +from .models import CoachRegistration, Payment, Registration, StudentRegistration, VolunteerRegistration @admin.register(Registration) class RegistrationAdmin(PolymorphicParentModelAdmin): - child_models = (StudentRegistration, CoachRegistration, AdminRegistration,) + child_models = (StudentRegistration, CoachRegistration, VolunteerRegistration,) list_display = ("user", "type", "email_confirmed",) polymorphic_list = True @@ -25,8 +25,8 @@ class CoachRegistrationAdmin(PolymorphicChildModelAdmin): pass -@admin.register(AdminRegistration) -class AdminRegistrationAdmin(PolymorphicChildModelAdmin): +@admin.register(VolunteerRegistration) +class VolunteerRegistrationAdmin(PolymorphicChildModelAdmin): pass diff --git a/apps/registration/api/serializers.py b/apps/registration/api/serializers.py index 8f2c902..0c00600 100644 --- a/apps/registration/api/serializers.py +++ b/apps/registration/api/serializers.py @@ -4,16 +4,10 @@ from rest_framework import serializers from rest_polymorphic.serializers import PolymorphicSerializer -from ..models import AdminRegistration, CoachRegistration, ParticipantRegistration, \ +from ..models import CoachRegistration, ParticipantRegistration, \ StudentRegistration, VolunteerRegistration -class AdminSerializer(serializers.ModelSerializer): - class Meta: - model = AdminRegistration - fields = '__all__' - - class CoachSerializer(serializers.ModelSerializer): class Meta: model = CoachRegistration @@ -40,7 +34,6 @@ class VolunteerSerializer(serializers.ModelSerializer): class RegistrationSerializer(PolymorphicSerializer): model_serializer_mapping = { - AdminRegistration: AdminSerializer, CoachRegistration: CoachSerializer, StudentRegistration: StudentSerializer, VolunteerRegistration: VolunteerSerializer, diff --git a/apps/registration/apps.py b/apps/registration/apps.py index e846ea5..9e5146f 100644 --- a/apps/registration/apps.py +++ b/apps/registration/apps.py @@ -20,4 +20,3 @@ class RegistrationConfig(AppConfig): post_save.connect(create_payment, "registration.Registration") post_save.connect(create_payment, "registration.StudentRegistration") post_save.connect(create_payment, "registration.CoachRegistration") - post_save.connect(create_payment, "registration.AdminRegistration") diff --git a/apps/registration/forms.py b/apps/registration/forms.py index e114842..a79ec76 100644 --- a/apps/registration/forms.py +++ b/apps/registration/forms.py @@ -8,7 +8,7 @@ from django.core.exceptions import ValidationError from django.forms import FileInput from django.utils.translation import gettext_lazy as _ -from .models import AdminRegistration, CoachRegistration, ParticipantRegistration, Payment, \ +from .models import CoachRegistration, ParticipantRegistration, Payment, \ StudentRegistration, VolunteerRegistration @@ -50,14 +50,6 @@ class AddOrganizerForm(forms.ModelForm): """ Signup form to registers volunteers """ - type = forms.ChoiceField( - label=lambda: _("role").capitalize(), - choices=lambda: [ - ("volunteer", _("volunteer").capitalize()), - ("admin", _("admin").capitalize()), - ], - initial="volunteer", - ) def clean_email(self): """ @@ -76,7 +68,7 @@ class AddOrganizerForm(forms.ModelForm): class Meta: model = User - fields = ('first_name', 'last_name', 'email', 'type',) + fields = ('first_name', 'last_name', 'email',) class UserForm(forms.ModelForm): @@ -192,16 +184,7 @@ class VolunteerRegistrationForm(forms.ModelForm): """ class Meta: model = VolunteerRegistration - fields = ('professional_activity', 'give_contact_to_animath', 'email_confirmed',) - - -class AdminRegistrationForm(forms.ModelForm): - """ - Admins can tell everything they want. - """ - class Meta: - model = AdminRegistration - fields = ('role', 'give_contact_to_animath', 'email_confirmed',) + fields = ('professional_activity', 'admin', 'give_contact_to_animath', 'email_confirmed',) class PaymentForm(forms.ModelForm): diff --git a/apps/registration/migrations/0004_volunteer_admin.py b/apps/registration/migrations/0004_volunteer_admin.py new file mode 100644 index 0000000..b26e132 --- /dev/null +++ b/apps/registration/migrations/0004_volunteer_admin.py @@ -0,0 +1,51 @@ +# Generated by Django 3.2.18 on 2023-02-19 22:13 +from django.contrib.contenttypes.models import ContentType +from django.db import migrations, models +from django.db.models import F + + +def merge_admins(apps, schema_editor): + AdminRegistration = apps.get_model('registration', 'AdminRegistration') + VolunteerRegistration = apps.get_model('registration', 'VolunteerRegistration') + db_alias = schema_editor.connection.alias + AdminRegistration.objects.using(db_alias).update(admin=True) + for admin in AdminRegistration.objects.all(): + admin.professional_activity = admin.role + admin.polymorphic_ctype_id = ContentType.objects.get_for_model(VolunteerRegistration).id + admin.save() + + +def separate_admins(apps, schema_editor): + AdminRegistration = apps.get_model('registration', 'AdminRegistration') + VolunteerRegistration = apps.get_model('registration', 'VolunteerRegistration') + for admin in VolunteerRegistration.objects.filter(admin=True).all(): + admin.delete() + AdminRegistration.objects.create(user=admin.user, + professional_activity=admin.professional_activity, + role=admin.professional_activity) + + +class Migration(migrations.Migration): + dependencies = [ + ('participation', '0003_alter_team_trigram'), + ('registration', '0003_alter_participantregistration_zip_code'), + ] + + operations = [ + migrations.AddField( + model_name='volunteerregistration', + name='admin', + field=models.BooleanField( + default=False, + help_text="An administrator has all rights. Please don't give this right to all juries and volunteers.", + verbose_name='administrator'), + ), + migrations.RunPython( + merge_admins, + separate_admins, + elidable=True, + ), + migrations.DeleteModel( + name='AdminRegistration', + ), + ] diff --git a/apps/registration/models.py b/apps/registration/models.py index 8bd9fb4..8c688c2 100644 --- a/apps/registration/models.py +++ b/apps/registration/models.py @@ -22,7 +22,7 @@ class Registration(PolymorphicModel): """ Registrations store extra content that are not asked in the User Model. This is specific to the role of the user, see StudentRegistration, - ClassRegistration or AdminRegistration.. + CoachRegistration or VolunteerRegistration. """ user = models.OneToOneField( "auth.User", @@ -79,7 +79,7 @@ class Registration(PolymorphicModel): @property def is_admin(self): - return isinstance(self, AdminRegistration) or self.user.is_superuser + return isinstance(self, VolunteerRegistration) and self.admin or self.user.is_superuser @property def is_volunteer(self): @@ -287,13 +287,19 @@ class VolunteerRegistration(Registration): verbose_name=_("professional activity"), ) + admin = models.BooleanField( + verbose_name=_("administrator"), + help_text=_("An administrator has all rights. Please don't give this right to all juries and volunteers."), + default=False, + ) + @property def interesting_tournaments(self) -> set: return set(self.organized_tournaments.all()).union(map(lambda pool: pool.tournament, self.jury_in.all())) @property def type(self): - return _('volunteer') + return _('admin') if self.is_admin else _('volunteer') @property def form_class(self): @@ -301,29 +307,6 @@ class VolunteerRegistration(Registration): return VolunteerRegistrationForm -class AdminRegistration(VolunteerRegistration): - """ - Specific registration for admins. - They have a field to justify they status. - """ - role = models.TextField( - verbose_name=_("role of the administrator"), - ) - - @property - def type(self): - return _("admin") - - @property - def form_class(self): - from registration.forms import AdminRegistrationForm - return AdminRegistrationForm - - class Meta: - verbose_name = _("admin registration") - verbose_name_plural = _("admin registrations") - - def get_scholarship_filename(instance, filename): return f"authorization/scholarship/scholarship_{instance.registration.pk}" diff --git a/apps/registration/signals.py b/apps/registration/signals.py index b8f6a12..ed4981d 100644 --- a/apps/registration/signals.py +++ b/apps/registration/signals.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User from tfjm.lists import get_sympa_client -from .models import AdminRegistration, Payment, Registration +from .models import Payment, Registration, VolunteerRegistration def set_username(instance, **_): @@ -40,7 +40,7 @@ def create_admin_registration(instance, **_): ensure that an admin registration is created. """ if instance.is_superuser: - AdminRegistration.objects.get_or_create(user=instance) + VolunteerRegistration.objects.get_or_create(user=instance, admin=True) def create_payment(instance: Registration, **_): diff --git a/apps/registration/tables.py b/apps/registration/tables.py index 31e39c0..770279b 100644 --- a/apps/registration/tables.py +++ b/apps/registration/tables.py @@ -19,7 +19,7 @@ class RegistrationTable(tables.Table): ) def order_type(self, queryset, desc): - types = ["volunteerregistration__adminregistration", "volunteerregistration", "participantregistration"] + types = ["-volunteerregistration__admin", "volunteerregistration", "participantregistration"] return queryset.order_by(*(("-" if desc else "") + t for t in types)), True class Meta: diff --git a/apps/registration/templates/registration/user_detail.html b/apps/registration/templates/registration/user_detail.html index f977dd8..8dc7e5d 100644 --- a/apps/registration/templates/registration/user_detail.html +++ b/apps/registration/templates/registration/user_detail.html @@ -107,8 +107,8 @@
{{ email }}
{% endwith %} {% elif user_object.registration.is_admin %} -
{% trans "Role:" %}
-
{{ user_object.registration.role }}
+
{% trans "Admin:" %}
+
{{ user_object.registration.is_admin|yesno }}
{% elif user_object.registration.coachregistration or user_object.registration.is_volunteer %}
{% trans "Profesional activity:" %}
{{ user_object.registration.professional_activity }}
diff --git a/apps/registration/tests.py b/apps/registration/tests.py index f68ca91..3d1a4b1 100644 --- a/apps/registration/tests.py +++ b/apps/registration/tests.py @@ -15,7 +15,7 @@ from django.utils.http import urlsafe_base64_encode from participation.models import Team from tfjm.tokens import email_validation_token -from .models import AdminRegistration, CoachRegistration, StudentRegistration +from .models import CoachRegistration, StudentRegistration, VolunteerRegistration class TestIndexPage(TestCase): @@ -92,7 +92,7 @@ class TestRegistration(TestCase): + f"registration/registration/{self.user.registration.pk}/change/") self.assertEqual(response.status_code, 200) response = self.client.get(reverse("admin:index") + - f"r/{ContentType.objects.get_for_model(AdminRegistration).id}/" + f"r/{ContentType.objects.get_for_model(VolunteerRegistration).id}/" f"{self.user.registration.pk}/") self.assertRedirects(response, "http://" + Site.objects.get().domain + str(self.user.registration.get_absolute_url()), 302, 200) @@ -271,7 +271,7 @@ class TestRegistration(TestCase): ) self.student.registration.save() - for user, data in [(self.user, dict(role="Bot")), + for user, data in [(self.user, dict(professional_activity="Bot", admin=True)), (self.student, dict(student_class=11, school="Sky", birth_date="2001-01-01", gender="female", address="1 Rue de Rivoli", zip_code=75001, city="Paris", responsible_name="Toto", diff --git a/apps/registration/views.py b/apps/registration/views.py index 7a3424a..f6d89dc 100644 --- a/apps/registration/views.py +++ b/apps/registration/views.py @@ -27,7 +27,7 @@ from participation.models import Passage, Solution, Synthesis, Tournament from tfjm.tokens import email_validation_token from tfjm.views import UserMixin, UserRegistrationMixin, VolunteerMixin -from .forms import AddOrganizerForm, AdminRegistrationForm, CoachRegistrationForm, HealthSheetForm, \ +from .forms import AddOrganizerForm, CoachRegistrationForm, HealthSheetForm, \ ParentalAuthorizationForm, PaymentForm, PhotoAuthorizationForm, SignupForm, StudentRegistrationForm, UserForm, \ VolunteerRegistrationForm from .models import ParticipantRegistration, Payment, Registration, StudentRegistration @@ -91,24 +91,21 @@ class AddOrganizerView(VolunteerMixin, CreateView): context = super().get_context_data() context["volunteer_registration_form"] = VolunteerRegistrationForm(self.request.POST or None) - context["admin_registration_form"] = AdminRegistrationForm(self.request.POST or None) - del context["volunteer_registration_form"].fields["email_confirmed"] - del context["admin_registration_form"].fields["email_confirmed"] - - if not self.request.user.registration.is_admin: - context["form"].fields["type"].widget.attrs['readonly'] = True - del context["admin_registration_form"] return context + def get_form(self, form_class=None): + form = super().get_form(form_class) + + if not self.request.user.registration.is_admin: + del form.fields["admin"] + + return form + @transaction.atomic def form_valid(self, form): - role = form.cleaned_data["type"] - if role == "admin": - registration_form = AdminRegistrationForm(self.request.POST) - else: - registration_form = VolunteerRegistrationForm(self.request.POST) + registration_form = VolunteerRegistrationForm(self.request.POST) del registration_form.fields["email_confirmed"] if not registration_form.is_valid(): diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 90ab862..4fa6039 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: 2023-02-19 19:48+0100\n" +"POT-Creation-Date: 2023-02-20 00:20+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Emmy D'Anello \n" "Language-Team: LANGUAGE \n" @@ -100,7 +100,7 @@ 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:318 -#: apps/participation/tables.py:44 apps/registration/models.py:370 +#: apps/participation/tables.py:44 apps/registration/models.py:353 msgid "valid" msgstr "valide" @@ -121,14 +121,14 @@ 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:83 apps/participation/forms.py:281 -#: apps/registration/forms.py:121 apps/registration/forms.py:143 -#: apps/registration/forms.py:165 apps/registration/forms.py:219 +#: apps/registration/forms.py:113 apps/registration/forms.py:135 +#: apps/registration/forms.py:157 apps/registration/forms.py:202 msgid "The uploaded file size must be under 2 Mo." msgstr "Le fichier envoyé doit peser moins de 2 Mo." -#: apps/participation/forms.py:85 apps/registration/forms.py:123 -#: apps/registration/forms.py:145 apps/registration/forms.py:167 -#: apps/registration/forms.py:221 +#: apps/participation/forms.py:85 apps/registration/forms.py:115 +#: apps/registration/forms.py:137 apps/registration/forms.py:159 +#: apps/registration/forms.py:204 msgid "The uploaded file must be a PDF, PNG of JPEG file." msgstr "Le fichier envoyé doit être au format PDF, PNG ou JPEG." @@ -1186,7 +1186,7 @@ msgstr "Les notes ont bien été envoyées." msgid "You can't upload a synthesis after the deadline." msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite." -#: apps/registration/forms.py:22 apps/registration/forms.py:54 +#: apps/registration/forms.py:22 msgid "role" msgstr "rôle" @@ -1198,23 +1198,15 @@ msgstr "participant⋅e" msgid "coach" msgstr "encadrant⋅e" -#: apps/registration/forms.py:35 apps/registration/forms.py:68 +#: apps/registration/forms.py:35 apps/registration/forms.py:60 msgid "This email address is already used." msgstr "Cette adresse e-mail est déjà utilisée." -#: apps/registration/forms.py:56 apps/registration/models.py:296 -msgid "volunteer" -msgstr "bénévole" - -#: apps/registration/forms.py:57 apps/registration/models.py:315 -msgid "admin" -msgstr "admin" - -#: apps/registration/forms.py:213 +#: apps/registration/forms.py:196 msgid "Pending" msgstr "En attente" -#: apps/registration/forms.py:229 +#: apps/registration/forms.py:212 msgid "You must upload your scholarship attestation." msgstr "Vous devez envoyer votre attestation de bourse." @@ -1231,7 +1223,7 @@ msgstr "email confirmé" msgid "Activate your TFJM² account" msgstr "Activez votre compte du TFJM²" -#: apps/registration/models.py:99 apps/registration/models.py:336 +#: apps/registration/models.py:99 apps/registration/models.py:319 msgid "registration" msgstr "inscription" @@ -1355,68 +1347,76 @@ msgstr "inscription d'encadrant⋅e" msgid "coach registrations" msgstr "inscriptions d'encadrant⋅es" -#: apps/registration/models.py:310 -msgid "role of the administrator" -msgstr "rôle de l'administrateur⋅rice" +#: apps/registration/models.py:291 +msgid "administrator" +msgstr "administrateur⋅rice" + +#: apps/registration/models.py:292 +msgid "" +"An administrator has all rights. Please don't give this right to all juries " +"and volunteers." +msgstr "" +"Un⋅e administrateur⋅rice a tous les droits. Merci de ne pas donner ce droit " +"à toustes les juré⋅es et bénévoles." + +#: apps/registration/models.py:302 +msgid "admin" +msgstr "admin" + +#: apps/registration/models.py:302 +msgid "volunteer" +msgstr "bénévole" #: apps/registration/models.py:323 -msgid "admin registration" -msgstr "inscription d'administrateur⋅rice" - -#: apps/registration/models.py:324 -msgid "admin registrations" -msgstr "inscriptions d'administrateur⋅rices" - -#: apps/registration/models.py:340 msgid "type" msgstr "type" -#: apps/registration/models.py:343 +#: apps/registration/models.py:326 msgid "No payment" msgstr "Pas de paiement" -#: apps/registration/models.py:345 +#: apps/registration/models.py:328 msgid "Scholarship" msgstr "Notification de bourse" -#: apps/registration/models.py:346 +#: apps/registration/models.py:329 msgid "Bank transfer" msgstr "Virement bancaire" -#: apps/registration/models.py:347 +#: apps/registration/models.py:330 msgid "Other (please indicate)" msgstr "Autre (veuillez spécifier)" -#: apps/registration/models.py:348 +#: apps/registration/models.py:331 msgid "The tournament is free" msgstr "Le tournoi est gratuit" -#: apps/registration/models.py:355 +#: apps/registration/models.py:338 msgid "scholarship file" msgstr "Notification de bourse" -#: apps/registration/models.py:356 +#: apps/registration/models.py:339 msgid "only if you have a scholarship." msgstr "Nécessaire seulement si vous déclarez être boursier." -#: apps/registration/models.py:363 +#: apps/registration/models.py:346 msgid "additional information" msgstr "informations additionnelles" -#: apps/registration/models.py:364 +#: apps/registration/models.py:347 msgid "To help us to find your payment." msgstr "Pour nous aider à retrouver votre paiement, si nécessaire." -#: apps/registration/models.py:379 +#: apps/registration/models.py:362 #, python-brace-format msgid "Payment of {registration}" msgstr "Paiement de {registration}" -#: apps/registration/models.py:382 +#: apps/registration/models.py:365 msgid "payment" msgstr "paiement" -#: apps/registration/models.py:383 +#: apps/registration/models.py:366 msgid "payments" msgstr "paiements" @@ -1740,8 +1740,8 @@ msgid "Responsible email address:" msgstr "Adresse e-mail de læ responsable légal⋅e :" #: apps/registration/templates/registration/user_detail.html:110 -msgid "Role:" -msgstr "Rôle :" +msgid "Admin:" +msgstr "Administrateur⋅rice :" #: apps/registration/templates/registration/user_detail.html:113 msgid "Profesional activity:" @@ -1778,71 +1778,71 @@ msgid "Impersonate" msgstr "Impersonifier" #: apps/registration/templates/registration/user_detail.html:164 -#: apps/registration/views.py:315 +#: 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:169 -#: apps/registration/views.py:336 +#: apps/registration/views.py:333 msgid "Upload health sheet" msgstr "Téléverser la fiche sanitaire" #: apps/registration/templates/registration/user_detail.html:174 #: apps/registration/templates/registration/user_detail.html:179 -#: apps/registration/views.py:357 +#: apps/registration/views.py:354 msgid "Upload parental authorization" msgstr "Téléverser l'autorisation parentale" -#: apps/registration/views.py:127 +#: apps/registration/views.py:124 msgid "New TFJM² organizer account" msgstr "Nouveau compte organisateur⋅rice pour le TFJM²" -#: apps/registration/views.py:153 +#: apps/registration/views.py:150 msgid "Email validation" msgstr "Validation de l'adresse mail" -#: apps/registration/views.py:155 +#: apps/registration/views.py:152 msgid "Validate email" msgstr "Valider l'adresse mail" -#: apps/registration/views.py:194 +#: apps/registration/views.py:191 msgid "Email validation unsuccessful" msgstr "Échec de la validation de l'adresse mail" -#: apps/registration/views.py:205 +#: apps/registration/views.py:202 msgid "Email validation email sent" msgstr "Mail de confirmation de l'adresse mail envoyé" -#: apps/registration/views.py:213 +#: apps/registration/views.py:210 msgid "Resend email validation link" msgstr "Renvoyé le lien de validation de l'adresse mail" -#: apps/registration/views.py:255 +#: apps/registration/views.py:252 #, python-brace-format msgid "Detail of user {user}" msgstr "Détails de l'utilisateur⋅rice {user}" -#: apps/registration/views.py:279 +#: apps/registration/views.py:276 #, python-brace-format msgid "Update user {user}" msgstr "Mise à jour de l'utilisateur⋅rice {user}" -#: apps/registration/views.py:463 +#: apps/registration/views.py:460 #, python-brace-format msgid "Photo authorization of {student}.{ext}" msgstr "Autorisation de droit à l'image de {student}.{ext}" -#: apps/registration/views.py:486 +#: apps/registration/views.py:483 #, python-brace-format msgid "Health sheet of {student}.{ext}" msgstr "Fiche sanitaire de {student}.{ext}" -#: apps/registration/views.py:509 +#: apps/registration/views.py:506 #, python-brace-format msgid "Parental authorization of {student}.{ext}" msgstr "Autorisation parentale de {student}.{ext}" -#: apps/registration/views.py:531 +#: apps/registration/views.py:528 #, python-brace-format msgid "Scholarship attestation of {user}.{ext}" msgstr "Notification de bourse de {user}.{ext}" @@ -2011,3 +2011,15 @@ msgstr "Résultats" #: tfjm/templates/search/search.html:25 msgid "No results found." msgstr "Aucun résultat." + +#~ msgid "Role:" +#~ msgstr "Rôle :" + +#~ msgid "role of the administrator" +#~ msgstr "rôle de l'administrateur⋅rice" + +#~ msgid "admin registration" +#~ msgstr "inscription d'administrateur⋅rice" + +#~ msgid "admin registrations" +#~ msgstr "inscriptions d'administrateur⋅rices"