Commit 2daaf992 authored by Sli's avatar Sli

Add groups, allow to ban users from counters and from buying alcohol

parent 1c97c8a7
Pipeline #302 failed with stage
in 3 minutes and 34 seconds
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0004_user_godfathers'),
]
operations = [
migrations.AddField(
model_name='user',
name='is_banned_alcohol',
field=models.BooleanField(help_text='Designates whether this user is denyed from buying alchool. ', verbose_name='banned from buying alcohol', default=False),
),
]
......@@ -169,13 +169,6 @@ class User(AbstractBaseUser):
parent_address = models.CharField(_("parent address"), max_length=128, blank=True, default="")
is_subscriber_viewable = models.BooleanField(_("is subscriber viewable"), default=True)
godfathers = models.ManyToManyField('User', related_name='godchildren', blank=True)
is_banned_alcohol = models.BooleanField(
_('banned from buying alcohol'),
default=False,
help_text=_(
'Designates whether this user is denyed from buying alchool. '
),
)
objects = UserManager()
......@@ -248,6 +241,14 @@ class User(AbstractBaseUser):
from club.models import Club
return Club.objects.filter(unix_name=settings.SITH_LAUNDERETTE_MANAGER['unix_name']).first().get_membership_for(self)
@property
def is_banned_alcohol(self):
return self.groups.filter(name=settings.SITH_GROUPS['banned-alcohol']['name']).exists()
@property
def is_banned_counter(self):
return self.groups.filter(name=settings.SITH_GROUPS['banned-from-counters']['name']).exists()
def save(self, *args, **kwargs):
create = False
with transaction.atomic():
......
......@@ -127,7 +127,7 @@ class UserProfileForm(forms.ModelForm):
fields = ['first_name', 'last_name', 'nick_name', 'email', 'date_of_birth', 'profile_pict', 'avatar_pict',
'scrub_pict', 'sex', 'second_email', 'address', 'parent_address', 'phone', 'parent_phone',
'tshirt_size', 'role', 'department', 'dpt_option', 'semester', 'quote', 'school', 'promo',
'forum_signature', 'is_subscriber_viewable', 'is_banned_alcohol']
'forum_signature', 'is_subscriber_viewable']
widgets = {
'date_of_birth': SelectDate,
'profile_pict': forms.ClearableFileInput,
......
......@@ -319,7 +319,7 @@ class UserUpdateProfileView(UserTabsMixin, CanEditMixin, UpdateView):
form_class = UserProfileForm
current_tab = "edit"
edit_once = ['profile_pict', 'date_of_birth', 'first_name', 'last_name']
board_only = ['is_banned_alcohol']
board_only = []
def remove_restricted_fields(self, request):
"""
......
......@@ -284,6 +284,9 @@ class CounterClick(CounterTabsMixin, DetailView):
if product.limit_age >= 18 and self.customer.user.is_banned_alcohol:
request.session['not_allowed'] = True
return False
if self.customer.user.is_banned_counter:
request.session['not_allowed'] = True
return False
if self.customer.user.date_of_birth and self.customer.user.get_age() < product.limit_age: # Check if affordable
request.session['too_young'] = True
return False
......
......@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-10-15 19:07+0200\n"
"POT-Creation-Date: 2016-10-16 03:23+0200\n"
"PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia <skia@libskia.so>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n"
......@@ -123,7 +123,7 @@ msgstr "numéro"
msgid "journal"
msgstr "classeur"
#: accounting/models.py:191 core/models.py:486 core/models.py:764
#: accounting/models.py:191 core/models.py:487 core/models.py:765
#: counter/models.py:229 counter/models.py:272 counter/models.py:358
#: eboutic/models.py:15 eboutic/models.py:48
msgid "date"
......@@ -190,7 +190,7 @@ msgstr "Compte"
msgid "Company"
msgstr "Entreprise"
#: accounting/models.py:204 sith/settings.py:279
#: accounting/models.py:204 sith/settings.py:287
msgid "Other"
msgstr "Autre"
......@@ -306,7 +306,7 @@ msgstr "Compte en banque : "
#: club/templates/club/club_sellings.jinja:48
#: core/templates/core/file_detail.jinja:43
#: core/templates/core/group_list.jinja:13 core/templates/core/macros.jinja:66
#: core/templates/core/user_account_detail.jinja:67
#: core/templates/core/user_account_detail.jinja:38
#: core/templates/core/user_edit.jinja:18
#: counter/templates/counter/last_ops.jinja:29
#: counter/templates/counter/last_ops.jinja:59
......@@ -408,7 +408,7 @@ msgstr "Fin"
#: accounting/templates/accounting/club_account_details.jinja:31
#: accounting/templates/accounting/journal_details.jinja:31
#: core/templates/core/user_account_detail.jinja:20
#: core/templates/core/user_account_detail.jinja:53
#: core/templates/core/user_account_detail.jinja:81
#: counter/templates/counter/last_ops.jinja:17
msgid "Amount"
......@@ -448,7 +448,7 @@ msgid "General journal:"
msgstr "Classeur : "
#: accounting/templates/accounting/journal_details.jinja:18
#: core/templates/core/user_account.jinja:36
#: core/templates/core/user_account.jinja:38
#: core/templates/core/user_account_detail.jinja:10
#: counter/templates/counter/counter_click.jinja:32
msgid "Amount: "
......@@ -474,7 +474,7 @@ msgstr "No"
#: accounting/templates/accounting/journal_details.jinja:29
#: club/templates/club/club_sellings.jinja:18
#: core/templates/core/user_account_detail.jinja:17
#: core/templates/core/user_account_detail.jinja:46
#: core/templates/core/user_account_detail.jinja:50
#: core/templates/core/user_account_detail.jinja:79
#: counter/templates/counter/cash_summary_list.jinja:34
#: counter/templates/counter/last_ops.jinja:14
......@@ -484,7 +484,7 @@ msgstr "Date"
#: accounting/templates/accounting/journal_details.jinja:30
#: club/templates/club/club_sellings.jinja:22
#: core/templates/core/user_account_detail.jinja:49
#: core/templates/core/user_account_detail.jinja:20
#: counter/templates/counter/last_ops.jinja:42
msgid "Label"
msgstr "Étiquette"
......@@ -510,7 +510,7 @@ msgid "Done"
msgstr "Effectué"
#: accounting/templates/accounting/journal_details.jinja:37
#: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:705
#: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:711
msgid "Comment"
msgstr "Commentaire"
......@@ -703,14 +703,14 @@ msgstr "Total : "
#: club/templates/club/club_sellings.jinja:19 club/views.py:165
#: core/templates/core/user_account_detail.jinja:18
#: core/templates/core/user_account_detail.jinja:47
#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:75
#: core/templates/core/user_account_detail.jinja:51
#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:78
msgid "Counter"
msgstr "Comptoir"
#: club/templates/club/club_sellings.jinja:20
#: core/templates/core/user_account_detail.jinja:19
#: core/templates/core/user_account_detail.jinja:48
#: core/templates/core/user_account_detail.jinja:52
#: counter/templates/counter/last_ops.jinja:15
#: counter/templates/counter/last_ops.jinja:40
msgid "Barman"
......@@ -724,15 +724,15 @@ msgid "Customer"
msgstr "Client"
#: club/templates/club/club_sellings.jinja:23
#: core/templates/core/user_account_detail.jinja:50
#: core/templates/core/user_account_detail.jinja:21
#: core/templates/core/user_stats.jinja:28
#: counter/templates/counter/last_ops.jinja:43
msgid "Quantity"
msgstr "Quantité"
#: club/templates/club/club_sellings.jinja:24
#: core/templates/core/user_account.jinja:9
#: core/templates/core/user_account_detail.jinja:51
#: core/templates/core/user_account.jinja:10
#: core/templates/core/user_account_detail.jinja:22
#: counter/templates/counter/cash_summary_list.jinja:35
#: counter/templates/counter/last_ops.jinja:44
#: counter/templates/counter/stats.jinja:18
......@@ -740,8 +740,8 @@ msgid "Total"
msgstr "Total"
#: club/templates/club/club_sellings.jinja:25
#: core/templates/core/user_account_detail.jinja:21
#: core/templates/core/user_account_detail.jinja:52
#: core/templates/core/user_account_detail.jinja:23
#: core/templates/core/user_account_detail.jinja:54
#: counter/templates/counter/last_ops.jinja:18
#: counter/templates/counter/last_ops.jinja:45
msgid "Payment method"
......@@ -786,16 +786,16 @@ msgstr "Propriétés"
msgid "Select user"
msgstr "Choisir un utilisateur"
#: club/views.py:163 counter/views.py:903
#: club/views.py:163 counter/views.py:909
msgid "Begin date"
msgstr "Date de début"
#: club/views.py:164 counter/views.py:904
#: club/views.py:164 counter/views.py:910
msgid "End date"
msgstr "Date de fin"
#: club/views.py:178 core/templates/core/user_stats.jinja:27
#: counter/views.py:984
#: counter/views.py:990
msgid "Product"
msgstr "Produit"
......@@ -1074,130 +1074,120 @@ msgstr "adresse des parents"
msgid "is subscriber viewable"
msgstr "profil visible par les cotisants"
#: core/models.py:173
msgid "banned from buying alcohol"
msgstr "Interdit d'achat d'alcool"
#: core/models.py:176
#, fuzzy
#| msgid "Designates whether this user is a superuser. "
msgid "Designates whether this user is denyed from buying alchool. "
msgstr "Est-ce que l'utilisateur est super-utilisateur."
#: core/models.py:292
#: core/models.py:293
msgid "A user with that username already exists"
msgstr "Un utilisateur de ce nom d'utilisateur existe déjà"
#: core/models.py:413 core/templates/core/macros.jinja:17
#: core/models.py:414 core/templates/core/macros.jinja:17
#: core/templates/core/user_detail.jinja:14
#: core/templates/core/user_detail.jinja:16
#: core/templates/core/user_edit.jinja:16
msgid "Profile"
msgstr "Profil"
#: core/models.py:463
#: core/models.py:464
msgid "Visitor"
msgstr "Visiteur"
#: core/models.py:468
#: core/models.py:469
msgid "define if we show a users stats"
msgstr "Definit si l'on montre les statistiques de l'utilisateur"
#: core/models.py:470
#: core/models.py:471
msgid "Show your account statistics to others"
msgstr "Montrez vos statistiques de compte aux autres"
#: core/models.py:477
#: core/models.py:478
msgid "file name"
msgstr "nom du fichier"
#: core/models.py:478 core/models.py:613
#: core/models.py:479 core/models.py:614
msgid "parent"
msgstr "parent"
#: core/models.py:479 core/models.py:489
#: core/models.py:480 core/models.py:490
msgid "file"
msgstr "fichier"
#: core/models.py:480
#: core/models.py:481
msgid "owner"
msgstr "propriétaire"
#: core/models.py:481 core/models.py:619
#: core/models.py:482 core/models.py:620
msgid "edit group"
msgstr "groupe d'édition"
#: core/models.py:482 core/models.py:620
#: core/models.py:483 core/models.py:621
msgid "view group"
msgstr "groupe de vue"
#: core/models.py:483
#: core/models.py:484
msgid "is folder"
msgstr "est un dossier"
#: core/models.py:484
#: core/models.py:485
msgid "mime type"
msgstr "type mime"
#: core/models.py:485
#: core/models.py:486
msgid "size"
msgstr "taille"
#: core/models.py:517
#: core/models.py:518
msgid "Character '/' not authorized in name"
msgstr "Le caractère '/' n'est pas autorisé dans les noms de fichier"
#: core/models.py:520 core/models.py:525
#: core/models.py:521 core/models.py:526
msgid "Loop in folder tree"
msgstr "Boucle dans l'arborescence des dossiers"
#: core/models.py:529
#: core/models.py:530
msgid "You can not make a file be a children of a non folder file"
msgstr ""
"Vous ne pouvez pas mettre un fichier enfant de quelque chose qui n'est pas "
"un dossier"
#: core/models.py:533
#: core/models.py:534
msgid "Duplicate file"
msgstr "Un fichier de ce nom existe déjà"
#: core/models.py:543
#: core/models.py:544
msgid "You must provide a file"
msgstr "Vous devez fournir un fichier"
#: core/models.py:568
#: core/models.py:569
msgid "Folder: "
msgstr "Dossier : "
#: core/models.py:570
#: core/models.py:571
msgid "File: "
msgstr "Fichier : "
#: core/models.py:612 core/models.py:616
#: core/models.py:613 core/models.py:617
msgid "page name"
msgstr "nom de la page"
#: core/models.py:617
#: core/models.py:618
msgid "owner group"
msgstr "groupe propriétaire"
#: core/models.py:648
#: core/models.py:649
msgid "Duplicate page"
msgstr "Une page de ce nom existe déjà"
#: core/models.py:654
#: core/models.py:655
msgid "Loop in page tree"
msgstr "Boucle dans l'arborescence des pages"
#: core/models.py:761
#: core/models.py:762
msgid "revision"
msgstr "révision"
#: core/models.py:762
#: core/models.py:763
msgid "page title"
msgstr "titre de la page"
#: core/models.py:763
#: core/models.py:764
msgid "page content"
msgstr "contenu de la page"
......@@ -1646,47 +1636,47 @@ msgstr "Utilisateurs"
msgid "Clubs"
msgstr "Clubs"
#: core/templates/core/user_account.jinja:7
#: core/templates/core/user_account.jinja:8
msgid "Year"
msgstr "Année"
#: core/templates/core/user_account.jinja:8
#: core/templates/core/user_account.jinja:9
msgid "Month"
msgstr "Mois"
#: core/templates/core/user_account.jinja:30
#: core/templates/core/user_account.jinja:32
#: core/templates/core/user_account_detail.jinja:4
#, python-format
msgid "%(user_name)s's account"
msgstr "Compte de %(user_name)s"
#: core/templates/core/user_account.jinja:35
#: core/templates/core/user_account.jinja:37
#: core/templates/core/user_account_detail.jinja:9
msgid "User account"
msgstr "Compte utilisateur"
#: core/templates/core/user_account.jinja:38
#: core/templates/core/user_account.jinja:42
#: core/templates/core/user_account_detail.jinja:13
msgid "Account buyings"
msgstr "Achat sur compte utilisateur"
#: core/templates/core/user_account.jinja:45
#: core/templates/core/user_account_detail.jinja:46
#: counter/templates/counter/cash_summary_list.jinja:17
#: counter/templates/counter/last_ops.jinja:10
msgid "Refillings"
msgstr "Rechargements"
#: core/templates/core/user_account.jinja:42
#: core/templates/core/user_account_detail.jinja:42
msgid "Account buyings"
msgstr "Achat sur compte utilisateur"
#: core/templates/core/user_account.jinja:46
#: core/templates/core/user_account.jinja:49
#: core/templates/core/user_account_detail.jinja:75
msgid "Eboutic invoices"
msgstr "Facture eboutic"
#: core/templates/core/user_account.jinja:50 counter/views.py:473
#: core/templates/core/user_account.jinja:53 counter/views.py:479
msgid "Etickets"
msgstr ""
#: core/templates/core/user_account.jinja:58
#: core/templates/core/user_account.jinja:64
#: core/templates/core/user_account_detail.jinja:103
msgid "User has no account"
msgstr "L'utilisateur n'a pas de compte"
......@@ -1853,8 +1843,8 @@ msgstr "Fusionner deux utilisateurs"
msgid "Subscriptions"
msgstr "Cotisations"
#: core/templates/core/user_tools.jinja:23 counter/views.py:443
#: counter/views.py:592
#: core/templates/core/user_tools.jinja:23 counter/views.py:449
#: counter/views.py:598
msgid "Counters"
msgstr "Comptoirs"
......@@ -1875,7 +1865,7 @@ msgid "Product types management"
msgstr "Gestion des types de produit"
#: core/templates/core/user_tools.jinja:30
#: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:463
#: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:469
msgid "Cash register summaries"
msgstr "Relevés de caisse"
......@@ -2034,7 +2024,7 @@ msgstr "Bureau"
#: eboutic/templates/eboutic/eboutic_main.jinja:24
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:8
#: eboutic/templates/eboutic/eboutic_payment_result.jinja:4
#: sith/settings.py:278 sith/settings.py:286
#: sith/settings.py:286 sith/settings.py:294
msgid "Eboutic"
msgstr "Eboutic"
......@@ -2075,8 +2065,8 @@ msgstr "quantité"
msgid "Sith account"
msgstr "Compte utilisateur"
#: counter/models.py:274 sith/settings.py:271 sith/settings.py:276
#: sith/settings.py:298
#: counter/models.py:274 sith/settings.py:279 sith/settings.py:284
#: sith/settings.py:306
msgid "Credit card"
msgstr "Carte bancaire"
......@@ -2155,7 +2145,7 @@ msgstr "Liste des relevés de caisse"
msgid "Theoric sums"
msgstr "Sommes théoriques"
#: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:706
#: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:712
msgid "Emptied"
msgstr "Coffre vidé"
......@@ -2278,7 +2268,7 @@ msgstr "Nouveau eticket"
msgid "There is no eticket in this website."
msgstr "Il n'y a pas de eticket sur ce site web."
#: counter/templates/counter/invoices_call.jinja:4 counter/views.py:468
#: counter/templates/counter/invoices_call.jinja:4 counter/views.py:474
msgid "Invoices call"
msgstr "Appels à facture"
......@@ -2354,109 +2344,109 @@ msgstr "Pourcentage"
msgid "User not found"
msgstr "Utilisateur non trouvé"
#: counter/views.py:81
#: counter/views.py:84
msgid "Cash summary"
msgstr "Relevé de caisse"
#: counter/views.py:86
#: counter/views.py:89
msgid "Last operations"
msgstr "Dernières opérations"
#: counter/views.py:120
#: counter/views.py:123
msgid "Bad credentials"
msgstr "Mauvais identifiants"
#: counter/views.py:122
#: counter/views.py:125
msgid "User is not barman"
msgstr "L'utilisateur n'est pas barman."
#: counter/views.py:126
#: counter/views.py:129
msgid "Bad location, someone is already logged in somewhere else"
msgstr "Mauvais comptoir, quelqu'un est déjà connecté ailleurs"
#: counter/views.py:313
#: counter/views.py:319
msgid "END"
msgstr "FIN"
#: counter/views.py:315
#: counter/views.py:321
msgid "CAN"
msgstr "ANN"
#: counter/views.py:345
#: counter/views.py:351
msgid "You have not enough money to buy all the basket"
msgstr "Vous n'avez pas assez d'argent pour acheter le panier"
#: counter/views.py:438
#: counter/views.py:444
msgid "Counter administration"
msgstr "Administration des comptoirs"
#: counter/views.py:448
#: counter/views.py:454
msgid "Products"
msgstr "Produits"
#: counter/views.py:453
#: counter/views.py:459
msgid "Archived products"
msgstr "Produits archivés"
#: counter/views.py:458
#: counter/views.py:464
msgid "Product types"
msgstr "Types de produit"
#: counter/views.py:589
#: counter/views.py:595
msgid "Parent product"
msgstr "Produit parent"
#: counter/views.py:590
#: counter/views.py:596
msgid "Buying groups"
msgstr "Groupes d'achat"
#: counter/views.py:685
#: counter/views.py:691
msgid "10 cents"
msgstr "10 centimes"
#: counter/views.py:686
#: counter/views.py:692
msgid "20 cents"
msgstr "20 centimes"
#: counter/views.py:687
#: counter/views.py:693
msgid "50 cents"
msgstr "50 centimes"
#: counter/views.py:688
#: counter/views.py:694
msgid "1 euro"
msgstr "1 €"
#: counter/views.py:689
#: counter/views.py:695
msgid "2 euros"
msgstr "2 €"
#: counter/views.py:690
#: counter/views.py:696
msgid "5 euros"
msgstr "5 €"
#: counter/views.py:691
#: counter/views.py:697
msgid "10 euros"
msgstr "10 €"
#: counter/views.py:692
#: counter/views.py:698
msgid "20 euros"
msgstr "20 €"
#: counter/views.py:693
#: counter/views.py:699
msgid "50 euros"
msgstr "50 €"
#: counter/views.py:694
#: counter/views.py:700
msgid "100 euros"
msgstr "100 €"
#: counter/views.py:695 counter/views.py:697 counter/views.py:699
#: counter/views.py:701 counter/views.py:703
#: counter/views.py:701 counter/views.py:703 counter/views.py:705
#: counter/views.py:707 counter/views.py:709
msgid "Check amount"
msgstr "Montant du chèque"
#: counter/views.py:696 counter/views.py:698 counter/views.py:700
#: counter/views.py:702 counter/views.py:704
#: counter/views.py:702 counter/views.py:704 counter/views.py:706
#: counter/views.py:708 counter/views.py:710
msgid "Check quantity"
msgstr "Nombre de chèque"
......@@ -2592,12 +2582,12 @@ msgid "Washing and drying"
msgstr "Lavage et séchage"
#: launderette/templates/launderette/launderette_book.jinja:27
#: sith/settings.py:415
#: sith/settings.py:423
msgid "Washing"
msgstr "Lavage"
#: launderette/templates/launderette/launderette_book.jinja:31
#: sith/settings.py:415
#: sith/settings.py:423
msgid "Drying"
msgstr "Séchage"
......@@ -2672,107 +2662,107 @@ msgstr "Anglais"
msgid "French"
msgstr "Français"
#: sith/settings.py:268 sith/settings.py:275 sith/settings.py:296
#: sith/settings.py:276 sith/settings.py:283 sith/settings.py:304
msgid "Check"
msgstr "Chèque"
#: sith/settings.py:269 sith/settings.py:277 sith/settings.py:297
#: sith/settings.py:277 sith/settings.py:285 sith/settings.py:305
msgid "Cash"
msgstr "Espèces"
#: sith/settings.py:270
#: sith/settings.py:278
msgid "Transfert"
msgstr "Virement"
#: sith/settings.py:283
#: sith/settings.py:291
msgid "Belfort"
msgstr "Belfort"
#: sith/settings.py:284
#: sith/settings.py:292
msgid "Sevenans"
msgstr "Sevenans"
#: sith/settings.py:285
#: sith/settings.py:293
msgid "Montbéliard"
msgstr "Montbéliard"
#: sith/settings.py:325
#: sith/settings.py:333
msgid "One semester"
msgstr "Un semestre, 15 €"
#: sith/settings.py:330
#: sith/settings.py:338
msgid "Two semesters"
msgstr "Deux semestres, 28 €"
#: sith/settings.py:335
#: sith/settings.py:343
msgid "Common core cursus"
msgstr "Cursus tronc commun, 45 €"
#: sith/settings.py:340
#: sith/settings.py:348
msgid "Branch cursus"
msgstr "Cursus branche, 45 €"
#: sith/settings.py:345
#: sith/settings.py:353
msgid "Alternating cursus"
msgstr "Cursus alternant, 30 €"
#: sith/settings.py:350
#: sith/settings.py:358
msgid "Honorary member"
msgstr "Membre honoraire, 0 €"
#: sith/settings.py:355
#: sith/settings.py:363
msgid "Assidu member"
msgstr "Membre d'Assidu, 0 €"
#: sith/settings.py:360
#: sith/settings.py:368
msgid "Amicale/DOCEO member"
msgstr "Membre de l'Amicale/DOCEO, 0 €"
#: sith/settings.py:365
#: sith/settings.py:373
msgid "UT network member"
msgstr "Cotisant du réseau UT, 0 €"
#: sith/settings.py:370
#: sith/settings.py:378
msgid "CROUS member"
msgstr "Membres du CROUS, 0 €"
#: sith/settings.py:375
#: sith/settings.py:383
msgid "Sbarro/ESTA member"
msgstr "Membre de Sbarro ou de l'ESTA, 15 €"
#: sith/settings.py:383
#: sith/settings.py:391
msgid "President"
msgstr "Président"
#: sith/settings.py:384
#: sith/settings.py:392
msgid "Vice-President"
msgstr "Vice-Président"
#: sith/settings.py:385
#: sith/settings.py:393
msgid "Treasurer"
msgstr "Trésorier"
#: sith/settings.py:386
#: sith/settings.py:394
msgid "Communication supervisor"
msgstr "Responsable com"