From cc5df9b171561d8205dd2753a2511952283a1ece Mon Sep 17 00:00:00 2001 From: Sli Date: Tue, 27 Aug 2024 17:05:37 +0200 Subject: [PATCH] Better form for user submiting images, fix potential attack vector on bad file being resized and treated as an image --- core/templates/core/user_edit.jinja | 1 + core/views/forms.py | 37 ++-- locale/fr/LC_MESSAGES/django.po | 312 ++++++++++++++-------------- 3 files changed, 179 insertions(+), 171 deletions(-) diff --git a/core/templates/core/user_edit.jinja b/core/templates/core/user_edit.jinja index 69df1778..37acfbe7 100644 --- a/core/templates/core/user_edit.jinja +++ b/core/templates/core/user_edit.jinja @@ -61,6 +61,7 @@

{{ form[field_name].label }}

+ {{ form[field_name].errors }} {%- else -%} {% trans %}To edit your profile picture, ask a member of the AE{% endtrans %} {%- endif -%} diff --git a/core/views/forms.py b/core/views/forms.py index 9f565529..baf6b20e 100644 --- a/core/views/forms.py +++ b/core/views/forms.py @@ -201,10 +201,7 @@ class RegisteringForm(UserCreationForm): class UserProfileForm(forms.ModelForm): - """Form handling the user profile, managing the files - This form is actually pretty bad and was made in the rush before the migration. It should be refactored. - TODO: refactor this form. - """ + """Form handling the user profile, managing the files""" class Meta: model = User @@ -237,25 +234,35 @@ class UserProfileForm(forms.ModelForm): ] widgets = { "date_of_birth": SelectDate, - "profile_pict": forms.ClearableFileInput, - "avatar_pict": forms.ClearableFileInput, - "scrub_pict": forms.ClearableFileInput, "phone": RegionalPhoneNumberWidget, "parent_phone": RegionalPhoneNumberWidget, "quote": forms.Textarea, } - labels = { - "profile_pict": _( - "Profile: you need to be visible on the picture, in order to be recognized (e.g. by the barmen)" - ), - "avatar_pict": _("Avatar: used on the forum"), - "scrub_pict": _("Scrub: let other know how your scrub looks like!"), - } def generate_name(self, field_name, f): field_name = field_name[:-4] return field_name + str(self.instance.id) + "." + f.content_type.split("/")[-1] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Image fields are injected here to override the file field provided by the model + # This would be better if we could have a SithImage sort of model input instead of a generic SithFile + self.fields["profile_pict"] = forms.ImageField( + required=False, + label=_( + "Profile: you need to be visible on the picture, in order to be recognized (e.g. by the barmen)" + ), + ) + self.fields["avatar_pict"] = forms.ImageField( + required=False, + label=_("Avatar: used on the forum"), + ) + self.fields["scrub_pict"] = forms.ImageField( + required=False, + label=_("Scrub: let other know how your scrub looks like!"), + ) + def process(self, files): avatar = self.instance.avatar_pict profile = self.instance.profile_pict @@ -305,7 +312,7 @@ class UserProfileForm(forms.ModelForm): % { "file_name": f, "msg": _( - "Bad image format, only jpeg, png, and gif are accepted" + "Bad image format, only jpeg, png, webp and gif are accepted" ), }, ) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 313807bd..e27b63b8 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-21 15:30+0200\n" +"POT-Creation-Date: 2024-08-27 17:02+0200\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Skia \n" "Language-Team: AE info \n" @@ -219,7 +219,7 @@ msgstr "Compte" msgid "Company" msgstr "Entreprise" -#: accounting/models.py:312 core/models.py:311 sith/settings.py:404 +#: accounting/models.py:312 core/models.py:311 sith/settings.py:413 #: stock/templates/stock/shopping_list_items.jinja:37 msgid "Other" msgstr "Autre" @@ -370,17 +370,17 @@ msgstr "Compte en banque : " #: core/templates/core/user_account_detail.jinja:66 #: core/templates/core/user_clubs.jinja:34 #: core/templates/core/user_clubs.jinja:63 -#: core/templates/core/user_edit.jinja:53 +#: core/templates/core/user_edit.jinja:57 #: core/templates/core/user_preferences.jinja:48 #: counter/templates/counter/last_ops.jinja:35 #: counter/templates/counter/last_ops.jinja:65 #: election/templates/election/election_detail.jinja:187 #: forum/templates/forum/macros.jinja:21 forum/templates/forum/macros.jinja:134 #: launderette/templates/launderette/launderette_admin.jinja:16 -#: launderette/views.py:217 pedagogy/templates/pedagogy/guide.jinja:95 -#: pedagogy/templates/pedagogy/guide.jinja:110 +#: launderette/views.py:217 pedagogy/templates/pedagogy/guide.jinja:96 +#: pedagogy/templates/pedagogy/guide.jinja:111 #: pedagogy/templates/pedagogy/uv_detail.jinja:185 -#: sas/templates/sas/album.jinja:32 sas/templates/sas/moderation.jinja:18 +#: sas/templates/sas/album.jinja:33 sas/templates/sas/moderation.jinja:18 #: sas/templates/sas/picture.jinja:48 #: stock/templates/stock/stock_shopping_list.jinja:43 #: stock/templates/stock/stock_shopping_list.jinja:69 @@ -433,10 +433,10 @@ msgstr "Nouveau compte club" #: forum/templates/forum/macros.jinja:20 forum/templates/forum/macros.jinja:62 #: forum/templates/forum/macros.jinja:128 #: launderette/templates/launderette/launderette_list.jinja:16 -#: pedagogy/templates/pedagogy/guide.jinja:94 -#: pedagogy/templates/pedagogy/guide.jinja:109 +#: pedagogy/templates/pedagogy/guide.jinja:95 +#: pedagogy/templates/pedagogy/guide.jinja:110 #: pedagogy/templates/pedagogy/uv_detail.jinja:184 -#: sas/templates/sas/album.jinja:31 trombi/templates/trombi/detail.jinja:9 +#: sas/templates/sas/album.jinja:32 trombi/templates/trombi/detail.jinja:9 #: trombi/templates/trombi/edit_profile.jinja:34 msgid "Edit" msgstr "Éditer" @@ -526,7 +526,7 @@ msgid "Effective amount" msgstr "Montant effectif" #: accounting/templates/accounting/club_account_details.jinja:36 -#: sith/settings.py:450 +#: sith/settings.py:459 msgid "Closed" msgstr "Fermé" @@ -1162,7 +1162,7 @@ msgid "There are no members in this club." msgstr "Il n'y a pas de membres dans ce club." #: club/templates/club/club_members.jinja:80 -#: core/templates/core/file_detail.jinja:19 core/views/forms.py:332 +#: core/templates/core/file_detail.jinja:19 core/views/forms.py:339 #: launderette/views.py:217 trombi/templates/trombi/detail.jinja:19 msgid "Add" msgstr "Ajouter" @@ -1587,7 +1587,7 @@ msgstr "Type" #: com/templates/com/weekmail.jinja:19 com/templates/com/weekmail.jinja:48 #: forum/templates/forum/forum.jinja:28 forum/templates/forum/forum.jinja:47 #: forum/templates/forum/main.jinja:30 forum/views.py:246 -#: pedagogy/templates/pedagogy/guide.jinja:88 +#: pedagogy/templates/pedagogy/guide.jinja:89 msgid "Title" msgstr "Titre" @@ -2387,7 +2387,7 @@ msgstr "403, Non autorisé" msgid "404, Not Found" msgstr "404. Non trouvé" -#: core/templates/core/500.jinja:12 +#: core/templates/core/500.jinja:11 msgid "500, Server Error" msgstr "500, Erreur Serveur" @@ -2479,7 +2479,7 @@ msgstr "Photos" #: eboutic/templates/eboutic/eboutic_main.jinja:22 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:16 #: eboutic/templates/eboutic/eboutic_payment_result.jinja:4 -#: sith/settings.py:403 sith/settings.py:411 +#: sith/settings.py:412 sith/settings.py:420 msgid "Eboutic" msgstr "Eboutic" @@ -2621,20 +2621,20 @@ msgstr "Propriétés" msgid "Owner: " msgstr "Propriétaire : " -#: core/templates/core/file_detail.jinja:26 sas/templates/sas/album.jinja:46 +#: core/templates/core/file_detail.jinja:26 sas/templates/sas/album.jinja:47 #: sas/templates/sas/main.jinja:49 msgid "Clear clipboard" msgstr "Vider le presse-papier" -#: core/templates/core/file_detail.jinja:27 sas/templates/sas/album.jinja:33 +#: core/templates/core/file_detail.jinja:27 sas/templates/sas/album.jinja:34 msgid "Cut" msgstr "Couper" -#: core/templates/core/file_detail.jinja:28 sas/templates/sas/album.jinja:34 +#: core/templates/core/file_detail.jinja:28 sas/templates/sas/album.jinja:35 msgid "Paste" msgstr "Coller" -#: core/templates/core/file_detail.jinja:31 sas/templates/sas/album.jinja:40 +#: core/templates/core/file_detail.jinja:31 sas/templates/sas/album.jinja:41 #: sas/templates/sas/main.jinja:43 msgid "Clipboard: " msgstr "Presse-papier : " @@ -2696,7 +2696,7 @@ msgid "Edit group" msgstr "Éditer le groupe" #: core/templates/core/group_edit.jinja:9 -#: core/templates/core/user_edit.jinja:235 +#: core/templates/core/user_edit.jinja:268 #: core/templates/core/user_group.jinja:13 #: pedagogy/templates/pedagogy/uv_edit.jinja:36 msgid "Update" @@ -2771,23 +2771,23 @@ msgstr "Créneau" msgid "Tokens" msgstr "Jetons" -#: core/templates/core/macros.jinja:123 core/templates/core/macros.jinja:125 +#: core/templates/core/macros.jinja:163 core/templates/core/macros.jinja:165 msgid "Previous" msgstr "Précédent" -#: core/templates/core/macros.jinja:129 +#: core/templates/core/macros.jinja:169 msgid "current" msgstr "actuel" -#: core/templates/core/macros.jinja:135 core/templates/core/macros.jinja:137 +#: core/templates/core/macros.jinja:175 core/templates/core/macros.jinja:177 msgid "Next" msgstr "Suivant" -#: core/templates/core/macros.jinja:153 +#: core/templates/core/macros.jinja:193 msgid "Select All" msgstr "Tout sélectionner" -#: core/templates/core/macros.jinja:154 +#: core/templates/core/macros.jinja:194 msgid "Unselect All" msgstr "Tout désélectionner" @@ -3194,31 +3194,31 @@ msgstr "Activer la caméra" msgid "Take a picture" msgstr "Prendre une photo" -#: core/templates/core/user_edit.jinja:60 +#: core/templates/core/user_edit.jinja:64 msgid "To edit your profile picture, ask a member of the AE" msgstr "Pour changer votre photo de profil, demandez à un membre de l'AE" -#: core/templates/core/user_edit.jinja:142 +#: core/templates/core/user_edit.jinja:173 msgid "captured" msgstr "capturé" -#: core/templates/core/user_edit.jinja:163 +#: core/templates/core/user_edit.jinja:196 msgid "Edit user profile" msgstr "Éditer le profil de l'utilisateur" -#: core/templates/core/user_edit.jinja:225 +#: core/templates/core/user_edit.jinja:258 msgid "Change my password" msgstr "Changer mon mot de passe" -#: core/templates/core/user_edit.jinja:230 +#: core/templates/core/user_edit.jinja:263 msgid "Change user password" msgstr "Changer le mot de passe" -#: core/templates/core/user_edit.jinja:240 +#: core/templates/core/user_edit.jinja:273 msgid "Username:" msgstr "Nom d'utilisateur : " -#: core/templates/core/user_edit.jinja:243 +#: core/templates/core/user_edit.jinja:276 msgid "Account number:" msgstr "Numéro de compte : " @@ -3308,12 +3308,12 @@ msgstr "Photos de %(user_name)s" msgid "Download all my pictures" msgstr "Télécharger toutes mes photos" -#: core/templates/core/user_pictures.jinja:49 sas/templates/sas/album.jinja:74 +#: core/templates/core/user_pictures.jinja:49 sas/templates/sas/album.jinja:75 #: sas/templates/sas/macros.jinja:16 msgid "To be moderated" msgstr "A modérer" -#: core/templates/core/user_pictures.jinja:130 +#: core/templates/core/user_pictures.jinja:136 msgid "pictures" msgstr "photos" @@ -3508,12 +3508,12 @@ msgid "Moderate pictures" msgstr "Modérer les photos" #: core/templates/core/user_tools.jinja:173 -#: pedagogy/templates/pedagogy/guide.jinja:21 +#: pedagogy/templates/pedagogy/guide.jinja:22 msgid "Create UV" msgstr "Créer UV" #: core/templates/core/user_tools.jinja:174 -#: pedagogy/templates/pedagogy/guide.jinja:24 +#: pedagogy/templates/pedagogy/guide.jinja:25 #: trombi/templates/trombi/detail.jinja:10 msgid "Moderate comments" msgstr "Modérer les commentaires" @@ -3538,7 +3538,7 @@ msgstr "Autres outils" msgid "Trombi tools" msgstr "Outils Trombi" -#: core/templatetags/renderer.py:84 +#: core/templatetags/renderer.py:89 #, python-format msgid "%(nb_days)d day, %(remainder)s" msgid_plural "%(nb_days)d days, %(remainder)s" @@ -3554,7 +3554,7 @@ msgstr "Ajouter un nouveau dossier" msgid "Error creating folder %(folder_name)s: %(msg)s" msgstr "Erreur de création du dossier %(folder_name)s : %(msg)s" -#: core/views/files.py:154 core/views/forms.py:297 core/views/forms.py:304 +#: core/views/files.py:154 core/views/forms.py:304 core/views/forms.py:311 #: sas/views.py:81 #, python-format msgid "Error uploading file %(file_name)s: %(msg)s" @@ -3652,7 +3652,7 @@ msgstr "Choisir un utilisateur" msgid "Username, email, or account number" msgstr "Nom d'utilisateur, email, ou numéro de compte AE" -#: core/views/forms.py:249 +#: core/views/forms.py:254 msgid "" "Profile: you need to be visible on the picture, in order to be recognized (e." "g. by the barmen)" @@ -3660,36 +3660,36 @@ msgstr "" "Photo de profil: vous devez être visible sur la photo afin d'être reconnu " "(par exemple par les barmen)" -#: core/views/forms.py:251 +#: core/views/forms.py:259 msgid "Avatar: used on the forum" msgstr "Avatar : utilisé sur le forum" -#: core/views/forms.py:252 +#: core/views/forms.py:263 msgid "Scrub: let other know how your scrub looks like!" msgstr "Blouse : montrez aux autres à quoi ressemble votre blouse !" -#: core/views/forms.py:308 -msgid "Bad image format, only jpeg, png, and gif are accepted" -msgstr "Mauvais format d'image, seuls les jpeg, png, et gif sont acceptés" +#: core/views/forms.py:315 +msgid "Bad image format, only jpeg, png, webp and gif are accepted" +msgstr "Mauvais format d'image, seuls les jpeg, png, webp et gif sont acceptés" -#: core/views/forms.py:329 +#: core/views/forms.py:336 msgid "Godfather / Godmother" msgstr "Parrain / Marraine" -#: core/views/forms.py:330 +#: core/views/forms.py:337 msgid "Godchild" msgstr "Fillot / Fillote" -#: core/views/forms.py:335 counter/forms.py:67 trombi/views.py:149 +#: core/views/forms.py:342 counter/forms.py:67 trombi/views.py:149 msgid "Select user" msgstr "Choisir un utilisateur" -#: core/views/forms.py:348 core/views/forms.py:366 election/models.py:22 +#: core/views/forms.py:355 core/views/forms.py:373 election/models.py:22 #: election/views.py:147 msgid "edit groups" msgstr "groupe d'édition" -#: core/views/forms.py:351 core/views/forms.py:369 election/models.py:29 +#: core/views/forms.py:358 core/views/forms.py:376 election/models.py:29 #: election/views.py:150 msgid "view groups" msgstr "groupe de vue" @@ -3710,7 +3710,7 @@ msgstr "Nous n'avons pas réussi à vérifier que cette adresse mail existe." msgid "Family" msgstr "Famille" -#: core/views/user.py:207 sas/templates/sas/album.jinja:63 +#: core/views/user.py:207 sas/templates/sas/album.jinja:64 #: trombi/templates/trombi/export.jinja:25 #: trombi/templates/trombi/user_profile.jinja:11 msgid "Pictures" @@ -3889,8 +3889,8 @@ msgstr "quantité" msgid "Sith account" msgstr "Compte utilisateur" -#: counter/models.py:683 sith/settings.py:396 sith/settings.py:401 -#: sith/settings.py:421 +#: counter/models.py:683 sith/settings.py:405 sith/settings.py:410 +#: sith/settings.py:430 msgid "Credit card" msgstr "Carte bancaire" @@ -4926,12 +4926,12 @@ msgid "Washing and drying" msgstr "Lavage et séchage" #: launderette/templates/launderette/launderette_book.jinja:27 -#: sith/settings.py:635 +#: sith/settings.py:644 msgid "Washing" msgstr "Lavage" #: launderette/templates/launderette/launderette_book.jinja:31 -#: sith/settings.py:635 +#: sith/settings.py:644 msgid "Drying" msgstr "Séchage" @@ -5127,30 +5127,30 @@ msgstr "signalant" msgid "reason" msgstr "raison" -#: pedagogy/templates/pedagogy/guide.jinja:4 +#: pedagogy/templates/pedagogy/guide.jinja:5 msgid "UV Guide" msgstr "Guide des UVs" -#: pedagogy/templates/pedagogy/guide.jinja:55 +#: pedagogy/templates/pedagogy/guide.jinja:56 #, python-format msgid "%(display_name)s" msgstr "%(display_name)s" -#: pedagogy/templates/pedagogy/guide.jinja:69 +#: pedagogy/templates/pedagogy/guide.jinja:70 #, python-format msgid "%(credit_type)s" msgstr "%(credit_type)s" -#: pedagogy/templates/pedagogy/guide.jinja:87 +#: pedagogy/templates/pedagogy/guide.jinja:88 #: pedagogy/templates/pedagogy/moderation.jinja:12 msgid "UV" msgstr "UE" -#: pedagogy/templates/pedagogy/guide.jinja:89 +#: pedagogy/templates/pedagogy/guide.jinja:90 msgid "Department" msgstr "Département" -#: pedagogy/templates/pedagogy/guide.jinja:90 +#: pedagogy/templates/pedagogy/guide.jinja:91 msgid "Credit type" msgstr "Type de crédit" @@ -5335,20 +5335,20 @@ msgstr "Utilisateur à sélectionner" msgid "picture" msgstr "photo" -#: sas/templates/sas/album.jinja:9 sas/templates/sas/main.jinja:8 +#: sas/templates/sas/album.jinja:10 sas/templates/sas/main.jinja:8 #: sas/templates/sas/main.jinja:17 sas/templates/sas/picture.jinja:8 msgid "SAS" msgstr "SAS" -#: sas/templates/sas/album.jinja:52 sas/templates/sas/moderation.jinja:10 +#: sas/templates/sas/album.jinja:53 sas/templates/sas/moderation.jinja:10 msgid "Albums" msgstr "Albums" -#: sas/templates/sas/album.jinja:117 +#: sas/templates/sas/album.jinja:97 msgid "Upload" msgstr "Envoyer" -#: sas/templates/sas/album.jinja:124 +#: sas/templates/sas/album.jinja:104 msgid "Template generation time: " msgstr "Temps de génération du template : " @@ -5401,380 +5401,380 @@ msgstr "Erreur de création de l'album %(album)s : %(msg)s" msgid "Add user" msgstr "Ajouter une personne" -#: sith/settings.py:247 sith/settings.py:458 +#: sith/settings.py:247 sith/settings.py:467 msgid "English" msgstr "Anglais" -#: sith/settings.py:247 sith/settings.py:457 +#: sith/settings.py:247 sith/settings.py:466 msgid "French" msgstr "Français" -#: sith/settings.py:377 +#: sith/settings.py:386 msgid "TC" msgstr "TC" -#: sith/settings.py:378 +#: sith/settings.py:387 msgid "IMSI" msgstr "IMSI" -#: sith/settings.py:379 +#: sith/settings.py:388 msgid "IMAP" msgstr "IMAP" -#: sith/settings.py:380 +#: sith/settings.py:389 msgid "INFO" msgstr "INFO" -#: sith/settings.py:381 +#: sith/settings.py:390 msgid "GI" msgstr "GI" -#: sith/settings.py:382 sith/settings.py:468 +#: sith/settings.py:391 sith/settings.py:477 msgid "E" msgstr "E" -#: sith/settings.py:383 +#: sith/settings.py:392 msgid "EE" msgstr "EE" -#: sith/settings.py:384 +#: sith/settings.py:393 msgid "GESC" msgstr "GESC" -#: sith/settings.py:385 +#: sith/settings.py:394 msgid "GMC" msgstr "GMC" -#: sith/settings.py:386 +#: sith/settings.py:395 msgid "MC" msgstr "MC" -#: sith/settings.py:387 +#: sith/settings.py:396 msgid "EDIM" msgstr "EDIM" -#: sith/settings.py:388 +#: sith/settings.py:397 msgid "Humanities" msgstr "Humanités" -#: sith/settings.py:389 +#: sith/settings.py:398 msgid "N/A" msgstr "N/A" -#: sith/settings.py:393 sith/settings.py:400 sith/settings.py:419 +#: sith/settings.py:402 sith/settings.py:409 sith/settings.py:428 msgid "Check" msgstr "Chèque" -#: sith/settings.py:394 sith/settings.py:402 sith/settings.py:420 +#: sith/settings.py:403 sith/settings.py:411 sith/settings.py:429 msgid "Cash" msgstr "Espèces" -#: sith/settings.py:395 +#: sith/settings.py:404 msgid "Transfert" msgstr "Virement" -#: sith/settings.py:408 +#: sith/settings.py:417 msgid "Belfort" msgstr "Belfort" -#: sith/settings.py:409 +#: sith/settings.py:418 msgid "Sevenans" msgstr "Sevenans" -#: sith/settings.py:410 +#: sith/settings.py:419 msgid "Montbéliard" msgstr "Montbéliard" -#: sith/settings.py:438 +#: sith/settings.py:447 msgid "Free" msgstr "Libre" -#: sith/settings.py:439 +#: sith/settings.py:448 msgid "CS" msgstr "CS" -#: sith/settings.py:440 +#: sith/settings.py:449 msgid "TM" msgstr "TM" -#: sith/settings.py:441 +#: sith/settings.py:450 msgid "OM" msgstr "OM" -#: sith/settings.py:442 +#: sith/settings.py:451 msgid "QC" msgstr "QC" -#: sith/settings.py:443 +#: sith/settings.py:452 msgid "EC" msgstr "EC" -#: sith/settings.py:444 +#: sith/settings.py:453 msgid "RN" msgstr "RN" -#: sith/settings.py:445 +#: sith/settings.py:454 msgid "ST" msgstr "ST" -#: sith/settings.py:446 +#: sith/settings.py:455 msgid "EXT" msgstr "EXT" -#: sith/settings.py:451 +#: sith/settings.py:460 msgid "Autumn" msgstr "Automne" -#: sith/settings.py:452 +#: sith/settings.py:461 msgid "Spring" msgstr "Printemps" -#: sith/settings.py:453 +#: sith/settings.py:462 msgid "Autumn and spring" msgstr "Automne et printemps" -#: sith/settings.py:459 +#: sith/settings.py:468 msgid "German" msgstr "Allemand" -#: sith/settings.py:460 +#: sith/settings.py:469 msgid "Spanish" msgstr "Espagnol" -#: sith/settings.py:464 +#: sith/settings.py:473 msgid "A" msgstr "A" -#: sith/settings.py:465 +#: sith/settings.py:474 msgid "B" msgstr "B" -#: sith/settings.py:466 +#: sith/settings.py:475 msgid "C" msgstr "C" -#: sith/settings.py:467 +#: sith/settings.py:476 msgid "D" msgstr "D" -#: sith/settings.py:469 +#: sith/settings.py:478 msgid "FX" msgstr "FX" -#: sith/settings.py:470 +#: sith/settings.py:479 msgid "F" msgstr "F" -#: sith/settings.py:471 +#: sith/settings.py:480 msgid "Abs" msgstr "Abs" -#: sith/settings.py:475 +#: sith/settings.py:484 msgid "Selling deletion" msgstr "Suppression de vente" -#: sith/settings.py:476 +#: sith/settings.py:485 msgid "Refilling deletion" msgstr "Suppression de rechargement" -#: sith/settings.py:513 +#: sith/settings.py:522 msgid "One semester" msgstr "Un semestre, 20 €" -#: sith/settings.py:514 +#: sith/settings.py:523 msgid "Two semesters" msgstr "Deux semestres, 35 €" -#: sith/settings.py:516 +#: sith/settings.py:525 msgid "Common core cursus" msgstr "Cursus tronc commun, 60 €" -#: sith/settings.py:520 +#: sith/settings.py:529 msgid "Branch cursus" msgstr "Cursus branche, 60 €" -#: sith/settings.py:521 +#: sith/settings.py:530 msgid "Alternating cursus" msgstr "Cursus alternant, 30 €" -#: sith/settings.py:522 +#: sith/settings.py:531 msgid "Honorary member" msgstr "Membre honoraire, 0 €" -#: sith/settings.py:523 +#: sith/settings.py:532 msgid "Assidu member" msgstr "Membre d'Assidu, 0 €" -#: sith/settings.py:524 +#: sith/settings.py:533 msgid "Amicale/DOCEO member" msgstr "Membre de l'Amicale/DOCEO, 0 €" -#: sith/settings.py:525 +#: sith/settings.py:534 msgid "UT network member" msgstr "Cotisant du réseau UT, 0 €" -#: sith/settings.py:526 +#: sith/settings.py:535 msgid "CROUS member" msgstr "Membres du CROUS, 0 €" -#: sith/settings.py:527 +#: sith/settings.py:536 msgid "Sbarro/ESTA member" msgstr "Membre de Sbarro ou de l'ESTA, 20 €" -#: sith/settings.py:529 +#: sith/settings.py:538 msgid "One semester Welcome Week" msgstr "Un semestre Welcome Week" -#: sith/settings.py:533 +#: sith/settings.py:542 msgid "One month for free" msgstr "Un mois gratuit" -#: sith/settings.py:534 +#: sith/settings.py:543 msgid "Two months for free" msgstr "Deux mois gratuits" -#: sith/settings.py:535 +#: sith/settings.py:544 msgid "Eurok's volunteer" msgstr "Bénévole Eurockéennes" -#: sith/settings.py:537 +#: sith/settings.py:546 msgid "Six weeks for free" msgstr "6 semaines gratuites" -#: sith/settings.py:541 +#: sith/settings.py:550 msgid "One day" msgstr "Un jour" -#: sith/settings.py:542 +#: sith/settings.py:551 msgid "GA staff member" msgstr "Membre staff GA (2 semaines), 1 €" -#: sith/settings.py:545 +#: sith/settings.py:554 msgid "One semester (-20%)" msgstr "Un semestre (-20%), 12 €" -#: sith/settings.py:550 +#: sith/settings.py:559 msgid "Two semesters (-20%)" msgstr "Deux semestres (-20%), 22 €" -#: sith/settings.py:555 +#: sith/settings.py:564 msgid "Common core cursus (-20%)" msgstr "Cursus tronc commun (-20%), 36 €" -#: sith/settings.py:560 +#: sith/settings.py:569 msgid "Branch cursus (-20%)" msgstr "Cursus branche (-20%), 36 €" -#: sith/settings.py:565 +#: sith/settings.py:574 msgid "Alternating cursus (-20%)" msgstr "Cursus alternant (-20%), 24 €" -#: sith/settings.py:571 +#: sith/settings.py:580 msgid "One year for free(CA offer)" msgstr "Une année offerte (Offre CA)" -#: sith/settings.py:591 +#: sith/settings.py:600 msgid "President" msgstr "Président⸱e" -#: sith/settings.py:592 +#: sith/settings.py:601 msgid "Vice-President" msgstr "Vice-Président⸱e" -#: sith/settings.py:593 +#: sith/settings.py:602 msgid "Treasurer" msgstr "Trésorier⸱e" -#: sith/settings.py:594 +#: sith/settings.py:603 msgid "Communication supervisor" msgstr "Responsable communication" -#: sith/settings.py:595 +#: sith/settings.py:604 msgid "Secretary" msgstr "Secrétaire" -#: sith/settings.py:596 +#: sith/settings.py:605 msgid "IT supervisor" msgstr "Responsable info" -#: sith/settings.py:597 +#: sith/settings.py:606 msgid "Board member" msgstr "Membre du bureau" -#: sith/settings.py:598 +#: sith/settings.py:607 msgid "Active member" msgstr "Membre actif⸱ve" -#: sith/settings.py:599 +#: sith/settings.py:608 msgid "Curious" msgstr "Curieux⸱euse" -#: sith/settings.py:639 +#: sith/settings.py:648 msgid "A new poster needs to be moderated" msgstr "Une nouvelle affiche a besoin d'être modérée" -#: sith/settings.py:640 +#: sith/settings.py:649 msgid "A new mailing list needs to be moderated" msgstr "Une nouvelle mailing list a besoin d'être modérée" -#: sith/settings.py:643 +#: sith/settings.py:652 msgid "A new pedagogy comment has been signaled for moderation" msgstr "" "Un nouveau commentaire de la pédagogie a été signalé pour la modération" -#: sith/settings.py:645 +#: sith/settings.py:654 #, python-format msgid "There are %s fresh news to be moderated" msgstr "Il y a %s nouvelles toutes fraîches à modérer" -#: sith/settings.py:646 +#: sith/settings.py:655 msgid "New files to be moderated" msgstr "Nouveaux fichiers à modérer" -#: sith/settings.py:647 +#: sith/settings.py:656 #, python-format msgid "There are %s pictures to be moderated in the SAS" msgstr "Il y a %s photos à modérer dans le SAS" -#: sith/settings.py:648 +#: sith/settings.py:657 msgid "You've been identified on some pictures" msgstr "Vous avez été identifié sur des photos" -#: sith/settings.py:649 +#: sith/settings.py:658 #, python-format msgid "You just refilled of %s €" msgstr "Vous avez rechargé votre compte de %s€" -#: sith/settings.py:650 +#: sith/settings.py:659 #, python-format msgid "You just bought %s" msgstr "Vous avez acheté %s" -#: sith/settings.py:651 +#: sith/settings.py:660 msgid "You have a notification" msgstr "Vous avez une notification" -#: sith/settings.py:663 +#: sith/settings.py:672 msgid "Success!" msgstr "Succès !" -#: sith/settings.py:664 +#: sith/settings.py:673 msgid "Fail!" msgstr "Échec !" -#: sith/settings.py:665 +#: sith/settings.py:674 msgid "You successfully posted an article in the Weekmail" msgstr "Article posté avec succès dans le Weekmail" -#: sith/settings.py:666 +#: sith/settings.py:675 msgid "You successfully edited an article in the Weekmail" msgstr "Article édité avec succès dans le Weekmail" -#: sith/settings.py:667 +#: sith/settings.py:676 msgid "You successfully sent the Weekmail" msgstr "Weekmail envoyé avec succès" -#: sith/settings.py:675 +#: sith/settings.py:684 msgid "AE tee-shirt" msgstr "Tee-shirt AE"