Merge pull request #733 from ae-utbm/nfc

Add nfc widget
This commit is contained in:
thomas girod 2024-07-25 15:56:51 +02:00 committed by GitHub
commit 13d0d2a300
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 381 additions and 320 deletions

View File

@ -0,0 +1,33 @@
<span>
<input type="{{ widget.type }}" name="{{ widget.name }}"{% if widget.value != None %} value="{{ widget.value }}"{% endif %}{% include "django/forms/widgets/attrs.html" %}>
<!-- NFC icon not available in fontawesome 4.7 -->
<button type="button" id="{{ widget.attrs.id }}_button"><i class="fa fa-tag"></i></button>
</span>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
let button = document.getElementById("{{ widget.attrs.id }}_button");
button.addEventListener("click", async () => {
let input = document.getElementById("{{ widget.attrs.id }}");
const ndef = new NDEFReader();
await ndef.scan();
ndef.addEventListener("readingerror", () => {
alert("{{ translations.unsupported }}")
});
ndef.addEventListener("reading", ({ message, serialNumber }) => {
input.value = serialNumber.replaceAll(":", "").toUpperCase();
/* Auto submit form */
b = document.createElement("button");
input.appendChild(b)
b.click()
b.remove()
});
});
/* Disable feature if browser is not supported or if not HTTPS */
if (typeof NDEFReader === "undefined") {
button.remove();
}
});
</script>

View File

@ -66,7 +66,7 @@ class SelectDate(DateInput):
class MarkdownInput(Textarea): class MarkdownInput(Textarea):
template_name = "core/markdown_textarea.jinja" template_name = "core/widgets/markdown_textarea.jinja"
def get_context(self, name, value, attrs): def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs) context = super().get_context(name, value, attrs)
@ -100,6 +100,15 @@ class MarkdownInput(Textarea):
return context return context
class NFCTextInput(TextInput):
template_name = "core/widgets/nfc.jinja"
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
context["translations"] = {"unsupported": _("Unsupported NFC card")}
return context
class SelectFile(TextInput): class SelectFile(TextInput):
def render(self, name, value, attrs=None, renderer=None): def render(self, name, value, attrs=None, renderer=None):
if attrs: if attrs:

View File

@ -3,7 +3,7 @@ from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultip
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from core.views.forms import SelectDate, SelectDateTime from core.views.forms import NFCTextInput, SelectDate, SelectDateTime
from counter.models import ( from counter.models import (
BillingInfo, BillingInfo,
Counter, Counter,
@ -37,6 +37,9 @@ class StudentCardForm(forms.ModelForm):
class Meta: class Meta:
model = StudentCard model = StudentCard
fields = ["uid"] fields = ["uid"]
widgets = {
"uid": NFCTextInput,
}
def clean(self): def clean(self):
cleaned_data = super().clean() cleaned_data = super().clean()
@ -55,7 +58,10 @@ class GetUserForm(forms.Form):
""" """
code = forms.CharField( code = forms.CharField(
label="Code", max_length=StudentCard.UID_SIZE, required=False label="Code",
max_length=StudentCard.UID_SIZE,
required=False,
widget=NFCTextInput,
) )
id = AutoCompleteSelectField( id = AutoCompleteSelectField(
"users", required=False, label=_("Select user"), help_text=None "users", required=False, label=_("Select user"), help_text=None
@ -86,6 +92,14 @@ class GetUserForm(forms.Form):
return cleaned_data return cleaned_data
class NFCCardForm(forms.Form):
student_card_uid = forms.CharField(
max_length=StudentCard.UID_SIZE,
required=False,
widget=NFCTextInput,
)
class RefillForm(forms.ModelForm): class RefillForm(forms.ModelForm):
error_css_class = "error" error_css_class = "error"
required_css_class = "required" required_css_class = "required"

View File

@ -34,7 +34,7 @@
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="action" value="add_student_card"> <input type="hidden" name="action" value="add_student_card">
{% trans %}Add a student card{% endtrans %} {% trans %}Add a student card{% endtrans %}
<input type="text" name="student_card_uid"/> {{ student_card_input.student_card_uid }}
{% if request.session['not_valid_student_card_uid'] %} {% if request.session['not_valid_student_card_uid'] %}
<p><strong>{% trans %}This is not a valid student card UID{% endtrans %}</strong></p> <p><strong>{% trans %}This is not a valid student card UID{% endtrans %}</strong></p>
{% endif %} {% endif %}
@ -42,7 +42,6 @@
</form> </form>
<h6>{% trans %}Registered cards{% endtrans %}</h6> <h6>{% trans %}Registered cards{% endtrans %}</h6>
{% if student_cards %} {% if student_cards %}
<p>{{ student_cards }}</p>
<ul> <ul>
{% for card in student_cards %} {% for card in student_cards %}
<li>{{ card.uid }}</li> <li>{{ card.uid }}</li>

View File

@ -61,6 +61,7 @@ from counter.forms import (
CounterEditForm, CounterEditForm,
EticketForm, EticketForm,
GetUserForm, GetUserForm,
NFCCardForm,
ProductEditForm, ProductEditForm,
RefillForm, RefillForm,
StudentCardForm, StudentCardForm,
@ -679,6 +680,7 @@ class CounterClick(CounterTabsMixin, CanViewMixin, DetailView):
) )
kwargs["customer"] = self.customer kwargs["customer"] = self.customer
kwargs["student_cards"] = self.customer.student_cards.all() kwargs["student_cards"] = self.customer.student_cards.all()
kwargs["student_card_input"] = NFCCardForm()
kwargs["basket_total"] = self.sum_basket(self.request) kwargs["basket_total"] = self.sum_basket(self.request)
kwargs["refill_form"] = self.refill_form or RefillForm() kwargs["refill_form"] = self.refill_form or RefillForm()
kwargs["student_card_max_uid_size"] = StudentCard.UID_SIZE kwargs["student_card_max_uid_size"] = StudentCard.UID_SIZE

View File

@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-24 14:33+0200\n" "POT-Creation-Date: 2024-07-25 07:16+0200\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia <skia@libskia.so>\n" "Last-Translator: Skia <skia@libskia.so>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@ -651,7 +651,7 @@ msgid "Target"
msgstr "Cible" msgstr "Cible"
#: accounting/templates/accounting/journal_details.jinja:38 #: accounting/templates/accounting/journal_details.jinja:38
#: core/views/forms.py:94 #: core/views/forms.py:86
msgid "Code" msgid "Code"
msgstr "Code" msgstr "Code"
@ -665,7 +665,7 @@ msgid "Done"
msgstr "Effectuées" msgstr "Effectuées"
#: accounting/templates/accounting/journal_details.jinja:41 #: accounting/templates/accounting/journal_details.jinja:41
#: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:1002 #: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:1004
#: pedagogy/templates/pedagogy/moderation.jinja:13 #: pedagogy/templates/pedagogy/moderation.jinja:13
#: pedagogy/templates/pedagogy/uv_detail.jinja:138 #: pedagogy/templates/pedagogy/uv_detail.jinja:138
#: trombi/templates/trombi/comment.jinja:4 #: trombi/templates/trombi/comment.jinja:4
@ -902,11 +902,11 @@ msgstr "Opérations sans étiquette"
msgid "Refound this account" msgid "Refound this account"
msgstr "Rembourser ce compte" msgstr "Rembourser ce compte"
#: club/forms.py:55 club/forms.py:181 #: club/forms.py:55 club/forms.py:185
msgid "Users to add" msgid "Users to add"
msgstr "Utilisateurs à ajouter" msgstr "Utilisateurs à ajouter"
#: club/forms.py:56 club/forms.py:182 core/views/group.py:47 #: club/forms.py:56 club/forms.py:186 core/views/group.py:47
msgid "Search users to add (one or more)." msgid "Search users to add (one or more)."
msgstr "Recherche les utilisateurs à ajouter (un ou plus)." msgstr "Recherche les utilisateurs à ajouter (un ou plus)."
@ -934,7 +934,7 @@ msgstr "Action"
msgid "This field is required" msgid "This field is required"
msgstr "Ce champ est obligatoire" msgstr "Ce champ est obligatoire"
#: club/forms.py:118 club/forms.py:241 club/tests.py:712 #: club/forms.py:118 club/forms.py:245 club/tests.py:712
msgid "One of the selected users doesn't exist" msgid "One of the selected users doesn't exist"
msgstr "Un des utilisateurs sélectionné n'existe pas" msgstr "Un des utilisateurs sélectionné n'existe pas"
@ -950,49 +950,49 @@ msgstr "Une action est requise"
msgid "You must specify at least an user or an email address" msgid "You must specify at least an user or an email address"
msgstr "vous devez spécifier au moins un utilisateur ou une adresse email" msgstr "vous devez spécifier au moins un utilisateur ou une adresse email"
#: club/forms.py:152 counter/forms.py:171 #: club/forms.py:153 counter/forms.py:186
msgid "Begin date" msgid "Begin date"
msgstr "Date de début" msgstr "Date de début"
#: club/forms.py:153 com/views.py:80 com/views.py:195 counter/forms.py:172 #: club/forms.py:156 com/views.py:82 com/views.py:201 counter/forms.py:189
#: election/views.py:164 subscription/views.py:38 #: election/views.py:167 subscription/views.py:38
msgid "End date" msgid "End date"
msgstr "Date de fin" msgstr "Date de fin"
#: club/forms.py:156 club/templates/club/club_sellings.jinja:21 #: club/forms.py:160 club/templates/club/club_sellings.jinja:21
#: core/templates/core/user_account_detail.jinja:18 #: core/templates/core/user_account_detail.jinja:18
#: core/templates/core/user_account_detail.jinja:51 #: core/templates/core/user_account_detail.jinja:51
#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:151 #: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:152
msgid "Counter" msgid "Counter"
msgstr "Comptoir" msgstr "Comptoir"
#: club/forms.py:163 counter/views.py:734 #: club/forms.py:167 counter/views.py:736
msgid "Products" msgid "Products"
msgstr "Produits" msgstr "Produits"
#: club/forms.py:168 counter/views.py:739 #: club/forms.py:172 counter/views.py:741
msgid "Archived products" msgid "Archived products"
msgstr "Produits archivés" msgstr "Produits archivés"
#: club/forms.py:223 club/templates/club/club_members.jinja:22 #: club/forms.py:227 club/templates/club/club_members.jinja:22
#: club/templates/club/club_members.jinja:48 #: club/templates/club/club_members.jinja:48
#: core/templates/core/user_clubs.jinja:31 #: core/templates/core/user_clubs.jinja:31
msgid "Mark as old" msgid "Mark as old"
msgstr "Marquer comme ancien" msgstr "Marquer comme ancien"
#: club/forms.py:245 #: club/forms.py:249
msgid "User must be subscriber to take part to a club" msgid "User must be subscriber to take part to a club"
msgstr "L'utilisateur doit être cotisant pour faire partie d'un club" msgstr "L'utilisateur doit être cotisant pour faire partie d'un club"
#: club/forms.py:249 core/views/group.py:64 #: club/forms.py:253 core/views/group.py:64
msgid "You can not add the same user twice" msgid "You can not add the same user twice"
msgstr "Vous ne pouvez pas ajouter deux fois le même utilisateur" msgstr "Vous ne pouvez pas ajouter deux fois le même utilisateur"
#: club/forms.py:268 #: club/forms.py:272
msgid "You should specify a role" msgid "You should specify a role"
msgstr "Vous devez choisir un rôle" msgstr "Vous devez choisir un rôle"
#: club/forms.py:279 sas/views.py:118 sas/views.py:185 sas/views.py:284 #: club/forms.py:283 sas/views.py:118 sas/views.py:185 sas/views.py:284
msgid "You do not have the permission to do that" msgid "You do not have the permission to do that"
msgstr "Vous n'avez pas la permission de faire cela" msgstr "Vous n'avez pas la permission de faire cela"
@ -1145,7 +1145,7 @@ msgid "There are no members in this club."
msgstr "Il n'y a pas de membres dans ce club." msgstr "Il n'y a pas de membres dans ce club."
#: club/templates/club/club_members.jinja:80 #: club/templates/club/club_members.jinja:80
#: core/templates/core/file_detail.jinja:19 core/views/forms.py:333 #: core/templates/core/file_detail.jinja:19 core/views/forms.py:328
#: launderette/views.py:217 trombi/templates/trombi/detail.jinja:19 #: launderette/views.py:217 trombi/templates/trombi/detail.jinja:19
msgid "Add" msgid "Add"
msgstr "Ajouter" msgstr "Ajouter"
@ -1353,7 +1353,7 @@ msgstr "Anciens membres"
msgid "History" msgid "History"
msgstr "Historique" msgstr "Historique"
#: club/views.py:116 core/templates/core/base.jinja:96 core/views/user.py:220 #: club/views.py:116 core/templates/core/base.jinja:95 core/views/user.py:220
#: sas/templates/sas/picture.jinja:100 trombi/views.py:61 #: sas/templates/sas/picture.jinja:100 trombi/views.py:61
msgid "Tools" msgid "Tools"
msgstr "Outils" msgstr "Outils"
@ -1372,7 +1372,7 @@ msgstr "Vente"
msgid "Mailing list" msgid "Mailing list"
msgstr "Listes de diffusion" msgstr "Listes de diffusion"
#: club/views.py:161 com/views.py:130 #: club/views.py:161 com/views.py:133
msgid "Posters list" msgid "Posters list"
msgstr "Liste d'affiches" msgstr "Liste d'affiches"
@ -1487,7 +1487,7 @@ msgstr "temps d'affichage"
msgid "Begin date should be before end date" msgid "Begin date should be before end date"
msgstr "La date de début doit être avant celle de fin" msgstr "La date de début doit être avant celle de fin"
#: com/templates/com/mailing_admin.jinja:4 com/views.py:123 #: com/templates/com/mailing_admin.jinja:4 com/views.py:126
#: core/templates/core/user_tools.jinja:144 #: core/templates/core/user_tools.jinja:144
msgid "Mailing lists administration" msgid "Mailing lists administration"
msgstr "Administration des mailing listes" msgstr "Administration des mailing listes"
@ -1642,7 +1642,7 @@ msgid "Calls to moderate"
msgstr "Appels à modérer" msgstr "Appels à modérer"
#: com/templates/com/news_admin_list.jinja:242 #: com/templates/com/news_admin_list.jinja:242
#: core/templates/core/base.jinja:211 #: core/templates/core/base.jinja:210
msgid "Events" msgid "Events"
msgstr "Événements" msgstr "Événements"
@ -1803,7 +1803,7 @@ msgid "Slideshow"
msgstr "Diaporama" msgstr "Diaporama"
#: com/templates/com/weekmail.jinja:5 com/templates/com/weekmail.jinja:9 #: com/templates/com/weekmail.jinja:5 com/templates/com/weekmail.jinja:9
#: com/views.py:100 core/templates/core/user_tools.jinja:137 #: com/views.py:103 core/templates/core/user_tools.jinja:137
msgid "Weekmail" msgid "Weekmail"
msgstr "Weekmail" msgstr "Weekmail"
@ -1904,56 +1904,56 @@ msgstr "Le mot de la fin"
msgid "Format: 16:9 | Resolution: 1920x1080" msgid "Format: 16:9 | Resolution: 1920x1080"
msgstr "Format : 16:9 | Résolution : 1920x1080" msgstr "Format : 16:9 | Résolution : 1920x1080"
#: com/views.py:76 com/views.py:194 election/views.py:163 #: com/views.py:76 com/views.py:198 election/views.py:164
#: subscription/views.py:35 #: subscription/views.py:35
msgid "Start date" msgid "Start date"
msgstr "Date de début" msgstr "Date de début"
#: com/views.py:95 #: com/views.py:98
msgid "Communication administration" msgid "Communication administration"
msgstr "Administration de la communication" msgstr "Administration de la communication"
#: com/views.py:106 core/templates/core/user_tools.jinja:138 #: com/views.py:109 core/templates/core/user_tools.jinja:138
msgid "Weekmail destinations" msgid "Weekmail destinations"
msgstr "Destinataires du Weekmail" msgstr "Destinataires du Weekmail"
#: com/views.py:110 #: com/views.py:113
msgid "Info message" msgid "Info message"
msgstr "Message d'info" msgstr "Message d'info"
#: com/views.py:116 #: com/views.py:119
msgid "Alert message" msgid "Alert message"
msgstr "Message d'alerte" msgstr "Message d'alerte"
#: com/views.py:137 #: com/views.py:140
msgid "Screens list" msgid "Screens list"
msgstr "Liste d'écrans" msgstr "Liste d'écrans"
#: com/views.py:196 #: com/views.py:203
msgid "Until" msgid "Until"
msgstr "Jusqu'à" msgstr "Jusqu'à"
#: com/views.py:198 #: com/views.py:205
msgid "Automoderation" msgid "Automoderation"
msgstr "Automodération" msgstr "Automodération"
#: com/views.py:205 com/views.py:209 com/views.py:223 #: com/views.py:212 com/views.py:216 com/views.py:230
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est obligatoire." msgstr "Ce champ est obligatoire."
#: com/views.py:219 #: com/views.py:226
msgid "You crazy? You can not finish an event before starting it." msgid "You crazy? You can not finish an event before starting it."
msgstr "T'es fou? Un événement ne peut pas finir avant même de commencer." msgstr "T'es fou? Un événement ne peut pas finir avant même de commencer."
#: com/views.py:443 #: com/views.py:450
msgid "Delete and save to regenerate" msgid "Delete and save to regenerate"
msgstr "Supprimer et sauver pour régénérer" msgstr "Supprimer et sauver pour régénérer"
#: com/views.py:458 #: com/views.py:465
msgid "Weekmail of the " msgid "Weekmail of the "
msgstr "Weekmail du " msgstr "Weekmail du "
#: com/views.py:562 #: com/views.py:569
msgid "" msgid ""
"You must be a board member of the selected club to post in the Weekmail." "You must be a board member of the selected club to post in the Weekmail."
msgstr "" msgstr ""
@ -2390,18 +2390,18 @@ msgstr "500, Erreur Serveur"
msgid "Welcome!" msgid "Welcome!"
msgstr "Bienvenue !" msgstr "Bienvenue !"
#: core/templates/core/base.jinja:54 core/templates/core/login.jinja:8 #: core/templates/core/base.jinja:53 core/templates/core/login.jinja:8
#: core/templates/core/login.jinja:18 core/templates/core/login.jinja:51 #: core/templates/core/login.jinja:18 core/templates/core/login.jinja:51
#: core/templates/core/password_reset_complete.jinja:5 #: core/templates/core/password_reset_complete.jinja:5
msgid "Login" msgid "Login"
msgstr "Connexion" msgstr "Connexion"
#: core/templates/core/base.jinja:55 core/templates/core/register.jinja:7 #: core/templates/core/base.jinja:54 core/templates/core/register.jinja:7
#: core/templates/core/register.jinja:16 core/templates/core/register.jinja:22 #: core/templates/core/register.jinja:16 core/templates/core/register.jinja:22
msgid "Register" msgid "Register"
msgstr "Inscription" msgstr "Inscription"
#: core/templates/core/base.jinja:61 core/templates/core/base.jinja:62 #: core/templates/core/base.jinja:60 core/templates/core/base.jinja:61
#: forum/templates/forum/macros.jinja:171 #: forum/templates/forum/macros.jinja:171
#: forum/templates/forum/macros.jinja:175 #: forum/templates/forum/macros.jinja:175
#: matmat/templates/matmat/search_form.jinja:37 #: matmat/templates/matmat/search_form.jinja:37
@ -2410,52 +2410,52 @@ msgstr "Inscription"
msgid "Search" msgid "Search"
msgstr "Recherche" msgstr "Recherche"
#: core/templates/core/base.jinja:97 #: core/templates/core/base.jinja:96
msgid "Logout" msgid "Logout"
msgstr "Déconnexion" msgstr "Déconnexion"
#: core/templates/core/base.jinja:145 #: core/templates/core/base.jinja:144
msgid "You do not have any unread notification" msgid "You do not have any unread notification"
msgstr "Vous n'avez aucune notification non lue" msgstr "Vous n'avez aucune notification non lue"
#: core/templates/core/base.jinja:150 #: core/templates/core/base.jinja:149
msgid "View more" msgid "View more"
msgstr "Voir plus" msgstr "Voir plus"
#: core/templates/core/base.jinja:153 #: core/templates/core/base.jinja:152
#: forum/templates/forum/last_unread.jinja:17 #: forum/templates/forum/last_unread.jinja:17
msgid "Mark all as read" msgid "Mark all as read"
msgstr "Marquer tout comme lu" msgstr "Marquer tout comme lu"
#: core/templates/core/base.jinja:201 #: core/templates/core/base.jinja:200
msgid "Main" msgid "Main"
msgstr "Accueil" msgstr "Accueil"
#: core/templates/core/base.jinja:203 #: core/templates/core/base.jinja:202
msgid "Associations & Clubs" msgid "Associations & Clubs"
msgstr "Associations & Clubs" msgstr "Associations & Clubs"
#: core/templates/core/base.jinja:205 #: core/templates/core/base.jinja:204
msgid "AE" msgid "AE"
msgstr "L'AE" msgstr "L'AE"
#: core/templates/core/base.jinja:206 #: core/templates/core/base.jinja:205
msgid "AE's clubs" msgid "AE's clubs"
msgstr "Les clubs de L'AE" msgstr "Les clubs de L'AE"
#: core/templates/core/base.jinja:207 #: core/templates/core/base.jinja:206
msgid "Others UTBM's Associations" msgid "Others UTBM's Associations"
msgstr "Les autres associations de l'UTBM" msgstr "Les autres associations de l'UTBM"
#: core/templates/core/base.jinja:213 core/templates/core/user_tools.jinja:180 #: core/templates/core/base.jinja:212 core/templates/core/user_tools.jinja:180
msgid "Elections" msgid "Elections"
msgstr "Élections" msgstr "Élections"
#: core/templates/core/base.jinja:214 #: core/templates/core/base.jinja:213
msgid "Big event" msgid "Big event"
msgstr "Grandes Activités" msgstr "Grandes Activités"
#: core/templates/core/base.jinja:217 #: core/templates/core/base.jinja:216
#: forum/templates/forum/favorite_topics.jinja:14 #: forum/templates/forum/favorite_topics.jinja:14
#: forum/templates/forum/last_unread.jinja:14 #: forum/templates/forum/last_unread.jinja:14
#: forum/templates/forum/macros.jinja:90 forum/templates/forum/main.jinja:6 #: forum/templates/forum/macros.jinja:90 forum/templates/forum/main.jinja:6
@ -2464,11 +2464,11 @@ msgstr "Grandes Activités"
msgid "Forum" msgid "Forum"
msgstr "Forum" msgstr "Forum"
#: core/templates/core/base.jinja:218 #: core/templates/core/base.jinja:217
msgid "Gallery" msgid "Gallery"
msgstr "Photos" msgstr "Photos"
#: core/templates/core/base.jinja:219 counter/models.py:365 #: core/templates/core/base.jinja:218 counter/models.py:365
#: counter/templates/counter/counter_list.jinja:11 #: counter/templates/counter/counter_list.jinja:11
#: eboutic/templates/eboutic/eboutic_main.jinja:4 #: eboutic/templates/eboutic/eboutic_main.jinja:4
#: eboutic/templates/eboutic/eboutic_main.jinja:23 #: eboutic/templates/eboutic/eboutic_main.jinja:23
@ -2478,79 +2478,79 @@ msgstr "Photos"
msgid "Eboutic" msgid "Eboutic"
msgstr "Eboutic" msgstr "Eboutic"
#: core/templates/core/base.jinja:221 #: core/templates/core/base.jinja:220
msgid "Services" msgid "Services"
msgstr "Services" msgstr "Services"
#: core/templates/core/base.jinja:223 #: core/templates/core/base.jinja:222
msgid "Matmatronch" msgid "Matmatronch"
msgstr "Matmatronch" msgstr "Matmatronch"
#: core/templates/core/base.jinja:224 launderette/models.py:38 #: core/templates/core/base.jinja:223 launderette/models.py:38
#: launderette/templates/launderette/launderette_book.jinja:5 #: launderette/templates/launderette/launderette_book.jinja:5
#: launderette/templates/launderette/launderette_book_choose.jinja:4 #: launderette/templates/launderette/launderette_book_choose.jinja:4
#: launderette/templates/launderette/launderette_main.jinja:4 #: launderette/templates/launderette/launderette_main.jinja:4
msgid "Launderette" msgid "Launderette"
msgstr "Laverie" msgstr "Laverie"
#: core/templates/core/base.jinja:225 core/templates/core/file.jinja:20 #: core/templates/core/base.jinja:224 core/templates/core/file.jinja:20
#: core/views/files.py:108 #: core/views/files.py:108
msgid "Files" msgid "Files"
msgstr "Fichiers" msgstr "Fichiers"
#: core/templates/core/base.jinja:226 core/templates/core/user_tools.jinja:171 #: core/templates/core/base.jinja:225 core/templates/core/user_tools.jinja:171
msgid "Pedagogy" msgid "Pedagogy"
msgstr "Pédagogie" msgstr "Pédagogie"
#: core/templates/core/base.jinja:230 #: core/templates/core/base.jinja:229
msgid "My Benefits" msgid "My Benefits"
msgstr "Mes Avantages" msgstr "Mes Avantages"
#: core/templates/core/base.jinja:232 #: core/templates/core/base.jinja:231
msgid "Sponsors" msgid "Sponsors"
msgstr "Partenaires" msgstr "Partenaires"
#: core/templates/core/base.jinja:233 #: core/templates/core/base.jinja:232
msgid "Subscriber benefits" msgid "Subscriber benefits"
msgstr "Les avantages cotisants" msgstr "Les avantages cotisants"
#: core/templates/core/base.jinja:237 #: core/templates/core/base.jinja:236
msgid "Help" msgid "Help"
msgstr "Aide" msgstr "Aide"
#: core/templates/core/base.jinja:239 #: core/templates/core/base.jinja:238
msgid "FAQ" msgid "FAQ"
msgstr "FAQ" msgstr "FAQ"
#: core/templates/core/base.jinja:240 core/templates/core/base.jinja:280 #: core/templates/core/base.jinja:239 core/templates/core/base.jinja:279
msgid "Contacts" msgid "Contacts"
msgstr "Contacts" msgstr "Contacts"
#: core/templates/core/base.jinja:241 #: core/templates/core/base.jinja:240
msgid "Wiki" msgid "Wiki"
msgstr "Wiki" msgstr "Wiki"
#: core/templates/core/base.jinja:281 #: core/templates/core/base.jinja:280
msgid "Legal notices" msgid "Legal notices"
msgstr "Mentions légales" msgstr "Mentions légales"
#: core/templates/core/base.jinja:282 #: core/templates/core/base.jinja:281
msgid "Intellectual property" msgid "Intellectual property"
msgstr "Propriété intellectuelle" msgstr "Propriété intellectuelle"
#: core/templates/core/base.jinja:283 #: core/templates/core/base.jinja:282
msgid "Help & Documentation" msgid "Help & Documentation"
msgstr "Aide & Documentation" msgstr "Aide & Documentation"
#: core/templates/core/base.jinja:284 #: core/templates/core/base.jinja:283
msgid "R&D" msgid "R&D"
msgstr "R&D" msgstr "R&D"
#: core/templates/core/base.jinja:287 #: core/templates/core/base.jinja:286
msgid "Site created by the IT Department of the AE" msgid "Site created by the IT Department of the AE"
msgstr "Site réalisé par le Pôle Informatique de l'AE" msgstr "Site réalisé par le Pôle Informatique de l'AE"
#: core/templates/core/base.jinja:293 #: core/templates/core/base.jinja:292
#, fuzzy #, fuzzy
#| msgid "Site version:" #| msgid "Site version:"
msgid "Sith version:" msgid "Sith version:"
@ -2581,7 +2581,7 @@ msgstr "Confirmation"
#: core/templates/core/delete_confirm.jinja:20 #: core/templates/core/delete_confirm.jinja:20
#: core/templates/core/file_delete_confirm.jinja:14 #: core/templates/core/file_delete_confirm.jinja:14
#: counter/templates/counter/counter_click.jinja:122 #: counter/templates/counter/counter_click.jinja:121
msgid "Cancel" msgid "Cancel"
msgstr "Annuler" msgstr "Annuler"
@ -3074,7 +3074,7 @@ msgid "Eboutic invoices"
msgstr "Facture eboutic" msgstr "Facture eboutic"
#: core/templates/core/user_account.jinja:57 #: core/templates/core/user_account.jinja:57
#: core/templates/core/user_tools.jinja:58 counter/views.py:759 #: core/templates/core/user_tools.jinja:58 counter/views.py:761
msgid "Etickets" msgid "Etickets"
msgstr "Etickets" msgstr "Etickets"
@ -3330,7 +3330,7 @@ msgstr "A modérer"
msgid "Picture Unavailable" msgid "Picture Unavailable"
msgstr "Photo Indisponible" msgstr "Photo Indisponible"
#: core/templates/core/user_pictures.jinja:82 #: core/templates/core/user_pictures.jinja:83
msgid "pictures" msgid "pictures"
msgstr "photos" msgstr "photos"
@ -3400,7 +3400,7 @@ msgstr "Achats"
msgid "Product top 10" msgid "Product top 10"
msgstr "Top 10 produits" msgstr "Top 10 produits"
#: core/templates/core/user_stats.jinja:43 counter/forms.py:182 #: core/templates/core/user_stats.jinja:43 counter/forms.py:200
msgid "Product" msgid "Product"
msgstr "Produit" msgstr "Produit"
@ -3445,8 +3445,8 @@ msgstr "Cotisations"
msgid "Subscription stats" msgid "Subscription stats"
msgstr "Statistiques de cotisation" msgstr "Statistiques de cotisation"
#: core/templates/core/user_tools.jinja:48 counter/forms.py:145 #: core/templates/core/user_tools.jinja:48 counter/forms.py:159
#: counter/views.py:729 #: counter/views.py:731
msgid "Counters" msgid "Counters"
msgstr "Comptoirs" msgstr "Comptoirs"
@ -3463,12 +3463,12 @@ msgid "Product types management"
msgstr "Gestion des types de produit" msgstr "Gestion des types de produit"
#: core/templates/core/user_tools.jinja:56 #: core/templates/core/user_tools.jinja:56
#: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:749 #: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:751
msgid "Cash register summaries" msgid "Cash register summaries"
msgstr "Relevés de caisse" msgstr "Relevés de caisse"
#: core/templates/core/user_tools.jinja:57 #: core/templates/core/user_tools.jinja:57
#: counter/templates/counter/invoices_call.jinja:4 counter/views.py:754 #: counter/templates/counter/invoices_call.jinja:4 counter/views.py:756
msgid "Invoices call" msgid "Invoices call"
msgstr "Appels à facture" msgstr "Appels à facture"
@ -3582,7 +3582,7 @@ msgstr "Ajouter un nouveau dossier"
msgid "Error creating folder %(folder_name)s: %(msg)s" msgid "Error creating folder %(folder_name)s: %(msg)s"
msgstr "Erreur de création du dossier %(folder_name)s : %(msg)s" msgstr "Erreur de création du dossier %(folder_name)s : %(msg)s"
#: core/views/files.py:145 core/views/forms.py:298 core/views/forms.py:305 #: core/views/files.py:145 core/views/forms.py:293 core/views/forms.py:300
#: sas/views.py:82 #: sas/views.py:82
#, python-format #, python-format
msgid "Error uploading file %(file_name)s: %(msg)s" msgid "Error uploading file %(file_name)s: %(msg)s"
@ -3592,91 +3592,95 @@ msgstr "Erreur d'envoi du fichier %(file_name)s : %(msg)s"
msgid "Apply rights recursively" msgid "Apply rights recursively"
msgstr "Appliquer les droits récursivement" msgstr "Appliquer les droits récursivement"
#: core/views/forms.py:87 #: core/views/forms.py:79
msgid "Heading" msgid "Heading"
msgstr "Titre" msgstr "Titre"
#: core/views/forms.py:88 #: core/views/forms.py:80
msgid "Italic" msgid "Italic"
msgstr "Italique" msgstr "Italique"
#: core/views/forms.py:89 #: core/views/forms.py:81
msgid "Bold" msgid "Bold"
msgstr "Gras" msgstr "Gras"
#: core/views/forms.py:90 #: core/views/forms.py:82
msgid "Strikethrough" msgid "Strikethrough"
msgstr "Barré" msgstr "Barré"
#: core/views/forms.py:91 #: core/views/forms.py:83
msgid "Underline" msgid "Underline"
msgstr "Souligné" msgstr "Souligné"
#: core/views/forms.py:92 #: core/views/forms.py:84
msgid "Superscript" msgid "Superscript"
msgstr "Exposant" msgstr "Exposant"
#: core/views/forms.py:93 #: core/views/forms.py:85
msgid "Subscript" msgid "Subscript"
msgstr "Indice" msgstr "Indice"
#: core/views/forms.py:95 #: core/views/forms.py:87
msgid "Quote" msgid "Quote"
msgstr "Citation" msgstr "Citation"
#: core/views/forms.py:96 #: core/views/forms.py:88
msgid "Unordered list" msgid "Unordered list"
msgstr "Liste non ordonnée" msgstr "Liste non ordonnée"
#: core/views/forms.py:97 #: core/views/forms.py:89
msgid "Ordered list" msgid "Ordered list"
msgstr "Liste ordonnée" msgstr "Liste ordonnée"
#: core/views/forms.py:98 #: core/views/forms.py:90
msgid "Insert image" msgid "Insert image"
msgstr "Insérer image" msgstr "Insérer image"
#: core/views/forms.py:99 #: core/views/forms.py:91
msgid "Insert link" msgid "Insert link"
msgstr "Insérer lien" msgstr "Insérer lien"
#: core/views/forms.py:100 #: core/views/forms.py:92
msgid "Insert table" msgid "Insert table"
msgstr "Insérer tableau" msgstr "Insérer tableau"
#: core/views/forms.py:101 #: core/views/forms.py:93
msgid "Clean block" msgid "Clean block"
msgstr "Nettoyer bloc" msgstr "Nettoyer bloc"
#: core/views/forms.py:102 #: core/views/forms.py:94
msgid "Toggle preview" msgid "Toggle preview"
msgstr "Activer la prévisualisation" msgstr "Activer la prévisualisation"
#: core/views/forms.py:103 #: core/views/forms.py:95
msgid "Toggle side by side" msgid "Toggle side by side"
msgstr "Activer la vue côte à côte" msgstr "Activer la vue côte à côte"
#: core/views/forms.py:104 #: core/views/forms.py:96
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "Activer le plein écran" msgstr "Activer le plein écran"
#: core/views/forms.py:105 #: core/views/forms.py:97
msgid "Markdown guide" msgid "Markdown guide"
msgstr "Guide markdown" msgstr "Guide markdown"
#: core/views/forms.py:121 core/views/forms.py:129 #: core/views/forms.py:108
msgid "Unsupported NFC card"
msgstr "Carte NFC non supportée"
#: core/views/forms.py:122 core/views/forms.py:130
msgid "Choose file" msgid "Choose file"
msgstr "Choisir un fichier" msgstr "Choisir un fichier"
#: core/views/forms.py:145 core/views/forms.py:153 #: core/views/forms.py:146 core/views/forms.py:154
msgid "Choose user" msgid "Choose user"
msgstr "Choisir un utilisateur" msgstr "Choisir un utilisateur"
#: core/views/forms.py:185 #: core/views/forms.py:186
msgid "Username, email, or account number" msgid "Username, email, or account number"
msgstr "Nom d'utilisateur, email, ou numéro de compte AE" msgstr "Nom d'utilisateur, email, ou numéro de compte AE"
#: core/views/forms.py:244 #: core/views/forms.py:245
msgid "" msgid ""
"Profile: you need to be visible on the picture, in order to be recognized (e." "Profile: you need to be visible on the picture, in order to be recognized (e."
"g. by the barmen)" "g. by the barmen)"
@ -3684,36 +3688,36 @@ msgstr ""
"Photo de profil: vous devez être visible sur la photo afin d'être reconnu " "Photo de profil: vous devez être visible sur la photo afin d'être reconnu "
"(par exemple par les barmen)" "(par exemple par les barmen)"
#: core/views/forms.py:246 #: core/views/forms.py:247
msgid "Avatar: used on the forum" msgid "Avatar: used on the forum"
msgstr "Avatar : utilisé sur le forum" msgstr "Avatar : utilisé sur le forum"
#: core/views/forms.py:247 #: core/views/forms.py:248
msgid "Scrub: let other know how your scrub looks like!" msgid "Scrub: let other know how your scrub looks like!"
msgstr "Blouse : montrez aux autres à quoi ressemble votre blouse !" msgstr "Blouse : montrez aux autres à quoi ressemble votre blouse !"
#: core/views/forms.py:309 #: core/views/forms.py:304
msgid "Bad image format, only jpeg, png, and gif are accepted" 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" msgstr "Mauvais format d'image, seuls les jpeg, png, et gif sont acceptés"
#: core/views/forms.py:330 #: core/views/forms.py:325
msgid "Godfather / Godmother" msgid "Godfather / Godmother"
msgstr "Parrain / Marraine" msgstr "Parrain / Marraine"
#: core/views/forms.py:331 #: core/views/forms.py:326
msgid "Godchild" msgid "Godchild"
msgstr "Fillot / Fillote" msgstr "Fillot / Fillote"
#: core/views/forms.py:336 counter/forms.py:61 trombi/views.py:149 #: core/views/forms.py:331 counter/forms.py:67 trombi/views.py:149
msgid "Select user" msgid "Select user"
msgstr "Choisir un utilisateur" msgstr "Choisir un utilisateur"
#: core/views/forms.py:349 core/views/forms.py:367 election/models.py:22 #: core/views/forms.py:344 core/views/forms.py:362 election/models.py:22
#: election/views.py:147 #: election/views.py:147
msgid "edit groups" msgid "edit groups"
msgstr "groupe d'édition" msgstr "groupe d'édition"
#: core/views/forms.py:352 core/views/forms.py:370 election/models.py:29 #: core/views/forms.py:347 core/views/forms.py:365 election/models.py:29
#: election/views.py:150 #: election/views.py:150
msgid "view groups" msgid "view groups"
msgstr "groupe de vue" msgstr "groupe de vue"
@ -3753,19 +3757,19 @@ msgstr "L'utilisateur a déjà une photo de profil"
msgid "counter" msgid "counter"
msgstr "comptoir" msgstr "comptoir"
#: counter/forms.py:45 #: counter/forms.py:48
msgid "This UID is invalid" msgid "This UID is invalid"
msgstr "Cet UID est invalide" msgstr "Cet UID est invalide"
#: counter/forms.py:83 #: counter/forms.py:89
msgid "User not found" msgid "User not found"
msgstr "Utilisateur non trouvé" msgstr "Utilisateur non trouvé"
#: counter/forms.py:131 #: counter/forms.py:145
msgid "Parent product" msgid "Parent product"
msgstr "Produit parent" msgstr "Produit parent"
#: counter/forms.py:137 #: counter/forms.py:151
msgid "Buying groups" msgid "Buying groups"
msgstr "Groupes d'achat" msgstr "Groupes d'achat"
@ -3789,7 +3793,7 @@ msgstr "client"
msgid "customers" msgid "customers"
msgstr "clients" msgstr "clients"
#: counter/models.py:72 counter/views.py:311 #: counter/models.py:72 counter/views.py:312
msgid "Not enough money" msgid "Not enough money"
msgstr "Solde insuffisant" msgstr "Solde insuffisant"
@ -4055,7 +4059,7 @@ msgstr "Liste des relevés de caisse"
msgid "Theoric sums" msgid "Theoric sums"
msgstr "Sommes théoriques" msgstr "Sommes théoriques"
#: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:1003 #: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:1005
msgid "Emptied" msgid "Emptied"
msgstr "Coffre vidé" msgstr "Coffre vidé"
@ -4076,8 +4080,8 @@ msgid "This is not a valid student card UID"
msgstr "Ce n'est pas un UID de carte étudiante valide" msgstr "Ce n'est pas un UID de carte étudiante valide"
#: counter/templates/counter/counter_click.jinja:41 #: counter/templates/counter/counter_click.jinja:41
#: counter/templates/counter/counter_click.jinja:68 #: counter/templates/counter/counter_click.jinja:67
#: counter/templates/counter/counter_click.jinja:133 #: counter/templates/counter/counter_click.jinja:132
#: counter/templates/counter/invoices_call.jinja:16 #: counter/templates/counter/invoices_call.jinja:16
#: launderette/templates/launderette/launderette_admin.jinja:35 #: launderette/templates/launderette/launderette_admin.jinja:35
#: launderette/templates/launderette/launderette_click.jinja:13 #: launderette/templates/launderette/launderette_click.jinja:13
@ -4090,25 +4094,25 @@ msgstr "Valider"
msgid "Registered cards" msgid "Registered cards"
msgstr "Cartes enregistrées" msgstr "Cartes enregistrées"
#: counter/templates/counter/counter_click.jinja:52 #: counter/templates/counter/counter_click.jinja:51
msgid "No card registered" msgid "No card registered"
msgstr "Aucune carte enregistrée" msgstr "Aucune carte enregistrée"
#: counter/templates/counter/counter_click.jinja:57 #: counter/templates/counter/counter_click.jinja:56
#: launderette/templates/launderette/launderette_admin.jinja:8 #: launderette/templates/launderette/launderette_admin.jinja:8
msgid "Selling" msgid "Selling"
msgstr "Vente" msgstr "Vente"
#: counter/templates/counter/counter_click.jinja:75 #: counter/templates/counter/counter_click.jinja:74
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:20 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:20
msgid "Basket: " msgid "Basket: "
msgstr "Panier : " msgstr "Panier : "
#: counter/templates/counter/counter_click.jinja:116 #: counter/templates/counter/counter_click.jinja:115
msgid "Finish" msgid "Finish"
msgstr "Terminer" msgstr "Terminer"
#: counter/templates/counter/counter_click.jinja:126 #: counter/templates/counter/counter_click.jinja:125
#: counter/templates/counter/refilling_list.jinja:9 #: counter/templates/counter/refilling_list.jinja:9
msgid "Refilling" msgid "Refilling"
msgstr "Rechargement" msgstr "Rechargement"
@ -4281,109 +4285,109 @@ msgstr "Temps"
msgid "Top 100 barman %(counter_name)s (all semesters)" msgid "Top 100 barman %(counter_name)s (all semesters)"
msgstr "Top 100 barman %(counter_name)s (tous les semestres)" msgstr "Top 100 barman %(counter_name)s (tous les semestres)"
#: counter/views.py:172 #: counter/views.py:173
msgid "Cash summary" msgid "Cash summary"
msgstr "Relevé de caisse" msgstr "Relevé de caisse"
#: counter/views.py:188 #: counter/views.py:189
msgid "Last operations" msgid "Last operations"
msgstr "Dernières opérations" msgstr "Dernières opérations"
#: counter/views.py:205 #: counter/views.py:206
msgid "Take items from stock" msgid "Take items from stock"
msgstr "Prendre des éléments du stock" msgstr "Prendre des éléments du stock"
#: counter/views.py:254 #: counter/views.py:255
msgid "Bad credentials" msgid "Bad credentials"
msgstr "Mauvais identifiants" msgstr "Mauvais identifiants"
#: counter/views.py:256 #: counter/views.py:257
msgid "User is not barman" msgid "User is not barman"
msgstr "L'utilisateur n'est pas barman." msgstr "L'utilisateur n'est pas barman."
#: counter/views.py:261 #: counter/views.py:262
msgid "Bad location, someone is already logged in somewhere else" msgid "Bad location, someone is already logged in somewhere else"
msgstr "Mauvais comptoir, quelqu'un est déjà connecté ailleurs" msgstr "Mauvais comptoir, quelqu'un est déjà connecté ailleurs"
#: counter/views.py:302 #: counter/views.py:303
msgid "Too young for that product" msgid "Too young for that product"
msgstr "Trop jeune pour ce produit" msgstr "Trop jeune pour ce produit"
#: counter/views.py:305 #: counter/views.py:306
msgid "Not allowed for that product" msgid "Not allowed for that product"
msgstr "Non autorisé pour ce produit" msgstr "Non autorisé pour ce produit"
#: counter/views.py:308 #: counter/views.py:309
msgid "No date of birth provided" msgid "No date of birth provided"
msgstr "Pas de date de naissance renseignée" msgstr "Pas de date de naissance renseignée"
#: counter/views.py:597 #: counter/views.py:598
msgid "You have not enough money to buy all the basket" msgid "You have not enough money to buy all the basket"
msgstr "Vous n'avez pas assez d'argent pour acheter le panier" msgstr "Vous n'avez pas assez d'argent pour acheter le panier"
#: counter/views.py:723 #: counter/views.py:725
msgid "Counter administration" msgid "Counter administration"
msgstr "Administration des comptoirs" msgstr "Administration des comptoirs"
#: counter/views.py:725 #: counter/views.py:727
msgid "Stocks" msgid "Stocks"
msgstr "Stocks" msgstr "Stocks"
#: counter/views.py:744 #: counter/views.py:746
msgid "Product types" msgid "Product types"
msgstr "Types de produit" msgstr "Types de produit"
#: counter/views.py:960 #: counter/views.py:962
msgid "10 cents" msgid "10 cents"
msgstr "10 centimes" msgstr "10 centimes"
#: counter/views.py:961 #: counter/views.py:963
msgid "20 cents" msgid "20 cents"
msgstr "20 centimes" msgstr "20 centimes"
#: counter/views.py:962 #: counter/views.py:964
msgid "50 cents" msgid "50 cents"
msgstr "50 centimes" msgstr "50 centimes"
#: counter/views.py:963 #: counter/views.py:965
msgid "1 euro" msgid "1 euro"
msgstr "1 €" msgstr "1 €"
#: counter/views.py:964 #: counter/views.py:966
msgid "2 euros" msgid "2 euros"
msgstr "2 €" msgstr "2 €"
#: counter/views.py:965 #: counter/views.py:967
msgid "5 euros" msgid "5 euros"
msgstr "5 €" msgstr "5 €"
#: counter/views.py:966 #: counter/views.py:968
msgid "10 euros" msgid "10 euros"
msgstr "10 €" msgstr "10 €"
#: counter/views.py:967 #: counter/views.py:969
msgid "20 euros" msgid "20 euros"
msgstr "20 €" msgstr "20 €"
#: counter/views.py:968 #: counter/views.py:970
msgid "50 euros" msgid "50 euros"
msgstr "50 €" msgstr "50 €"
#: counter/views.py:970 #: counter/views.py:972
msgid "100 euros" msgid "100 euros"
msgstr "100 €" msgstr "100 €"
#: counter/views.py:973 counter/views.py:979 counter/views.py:985 #: counter/views.py:975 counter/views.py:981 counter/views.py:987
#: counter/views.py:991 counter/views.py:997 #: counter/views.py:993 counter/views.py:999
msgid "Check amount" msgid "Check amount"
msgstr "Montant du chèque" msgstr "Montant du chèque"
#: counter/views.py:976 counter/views.py:982 counter/views.py:988 #: counter/views.py:978 counter/views.py:984 counter/views.py:990
#: counter/views.py:994 counter/views.py:1000 #: counter/views.py:996 counter/views.py:1002
msgid "Check quantity" msgid "Check quantity"
msgstr "Nombre de chèque" msgstr "Nombre de chèque"
#: counter/views.py:1530 #: counter/views.py:1532
msgid "people(s)" msgid "people(s)"
msgstr "personne(s)" msgstr "personne(s)"
@ -4691,11 +4695,11 @@ msgstr "Utilisateur se présentant"
msgid "This role already exists for this election" msgid "This role already exists for this election"
msgstr "Ce rôle existe déjà pour cette élection" msgstr "Ce rôle existe déjà pour cette élection"
#: election/views.py:166 #: election/views.py:170
msgid "Start candidature" msgid "Start candidature"
msgstr "Début des candidatures" msgstr "Début des candidatures"
#: election/views.py:168 #: election/views.py:173
msgid "End candidature" msgid "End candidature"
msgstr "Fin des candidatures" msgstr "Fin des candidatures"