diff --git a/cfp/models.py b/cfp/models.py
index 5e217a6..c0d57c6 100644
--- a/cfp/models.py
+++ b/cfp/models.py
@@ -13,6 +13,7 @@ from django.utils.html import escape, format_html
from autoslug import AutoSlugField
from colorful.fields import RGBColorField
+from functools import partial
import uuid
from datetime import timedelta
@@ -124,6 +125,9 @@ class Participant(PonyConfModel):
url = ('https' if self.site.conference.secure_domain else 'http') + '://' + self.site.domain + url
return url
+ def get_csv_row(self):
+ return map(partial(getattr, self), ['pk', 'name', 'email', 'biography', 'twitter', 'linkedin', 'github', 'website', 'facebook', 'mastodon', 'phone_number', 'notes'])
+
class Meta:
# A User can participe only once to a Conference (= Site)
unique_together = ('site', 'name')
@@ -392,6 +396,26 @@ class Talk(PonyConfModel):
def get_tags_html(self):
return mark_safe(' '.join(map(lambda tag: tag.link, self.tags.all())))
+ def get_csv_row(self):
+ return [
+ self.pk,
+ self.title,
+ self.description,
+ self.category,
+ self.track,
+ [speaker.pk for speaker in self.speakers.all()],
+ [speaker.name for speaker in self.speakers.all()],
+ [tag.name for tag in self.tags.all()],
+ 1 if self.videotaped else 0,
+ self.video_licence,
+ 1 if self.sound else 0,
+ self.estimated_duration,
+ self.room,
+ 1 if self.plenary else 0,
+ self.materials,
+ self.video,
+ ]
+
@property
def estimated_duration(self):
return self.duration or self.category.duration
@@ -450,6 +474,16 @@ class Volunteer(PonyConfModel):
url = ('https' if self.site.conference.secure_domain else 'http') + '://' + self.site.domain + url
return url
+ def get_csv_row(self):
+ return [
+ self.pk,
+ self.name,
+ self.email,
+ self.phone_number,
+ 1 if self.sms_prefered else 0,
+ self.notes,
+ ]
+
class Meta:
# A volunteer can participe only once to a Conference (= Site)
unique_together = ('site', 'email')
diff --git a/cfp/templates/cfp/staff/participant_list.html b/cfp/templates/cfp/staff/participant_list.html
index 7c19cd0..6edde20 100644
--- a/cfp/templates/cfp/staff/participant_list.html
+++ b/cfp/templates/cfp/staff/participant_list.html
@@ -39,7 +39,11 @@
- {% trans "Contact:" %} {% trans "link" %} |
+
+ {% trans "contact by email" %}
+ |
+ {% trans "download as csv" %}
+ |
{% for participant in participant_list %}
diff --git a/cfp/templates/cfp/staff/talk_list.html b/cfp/templates/cfp/staff/talk_list.html
index 9d1b26e..2ce3a09 100644
--- a/cfp/templates/cfp/staff/talk_list.html
+++ b/cfp/templates/cfp/staff/talk_list.html
@@ -48,6 +48,13 @@
{% trans "Status" %} |
+
+
+
+ {% trans "download as csv" %}
+ |
+
+
{% for talk in talk_list %}
{% if forloop.first %}
diff --git a/cfp/templates/cfp/staff/volunteer_list.html b/cfp/templates/cfp/staff/volunteer_list.html
index 55b17c5..359a405 100644
--- a/cfp/templates/cfp/staff/volunteer_list.html
+++ b/cfp/templates/cfp/staff/volunteer_list.html
@@ -34,7 +34,11 @@
- {% trans "Contact:" %} {% trans "link" %} |
+
+ {% trans "contact by email" %}
+ |
+ {% trans "download as csv" %}
+ |
{% for volunteer in volunteer_list %}
diff --git a/cfp/views.py b/cfp/views.py
index 7104064..26d6109 100644
--- a/cfp/views.py
+++ b/cfp/views.py
@@ -17,6 +17,7 @@ from django.forms import modelform_factory
from django_select2.views import AutoResponseView
from functools import reduce
+import csv
from mailing.models import Message
from mailing.forms import MessageForm
@@ -106,9 +107,9 @@ def volunteer_update_activity(request, volunteer, activity, join):
@staff_required
def volunteer_list(request):
site = request.conference.site
- show_filters = False
filter_form = VolunteerFilterForm(request.GET or None, site=site)
# Filtering
+ show_filters = False
volunteers = Volunteer.objects.filter(site=site).order_by('pk').distinct().prefetch_related('activities')
if filter_form.is_valid():
data = filter_form.cleaned_data
@@ -121,13 +122,25 @@ def volunteer_list(request):
if len(data['activity']):
q |= Q(activities__slug__in=data['activity'])
volunteers = volunteers.filter(q)
- contact_link = 'mailto:' + ','.join([volunteer.email for volunteer in volunteers.all()])
- return render(request, 'cfp/staff/volunteer_list.html', {
- 'volunteer_list': volunteers,
- 'filter_form': filter_form,
- 'show_filters': show_filters,
- 'contact_link': contact_link,
- })
+ if request.GET.get('format') == 'csv':
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment; filename="volunteers.csv"'
+ writer = csv.writer(response)
+ for volunteer in volunteers:
+ writer.writerow(volunteer.get_csv_row())
+ return response
+ else:
+ contact_link = 'mailto:' + ','.join([volunteer.email for volunteer in volunteers.all()])
+ csv_query_dict = request.GET.copy()
+ csv_query_dict['format'] = 'csv'
+ csv_link = '?' + csv_query_dict.urlencode()
+ return render(request, 'cfp/staff/volunteer_list.html', {
+ 'volunteer_list': volunteers,
+ 'filter_form': filter_form,
+ 'show_filters': show_filters,
+ 'contact_link': contact_link,
+ 'csv_link': csv_link,
+ })
@staff_required
@@ -538,6 +551,16 @@ def talk_list(request):
talks = talks.exclude(video__exact='')
else:
talks = talks.filter(video__exact='')
+ talks = talks.prefetch_related('category', 'speakers', 'track', 'tags')
+
+ if request.GET.get('format') == 'csv':
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment; filename="talks.csv"'
+ writer = csv.writer(response)
+ for talk in talks:
+ writer.writerow(talk.get_csv_row())
+ return response
+
# Action
action_form = TalkActionForm(request.POST or None, talks=talks, site=request.conference.site)
if request.method == 'POST' and action_form.is_valid():
@@ -592,7 +615,9 @@ def talk_list(request):
glyphicon = 'sort'
sort_urls[c] = url.urlencode()
sort_glyphicons[c] = glyphicon
- talks = talks.prefetch_related('category', 'speakers', 'track', 'tags')
+ csv_query_dict = request.GET.copy()
+ csv_query_dict['format'] = 'csv'
+ csv_link = '?' + csv_query_dict.urlencode()
return render(request, 'cfp/staff/talk_list.html', {
'show_filters': show_filters,
'talk_list': talks,
@@ -600,6 +625,7 @@ def talk_list(request):
'action_form': action_form,
'sort_urls': sort_urls,
'sort_glyphicons': sort_glyphicons,
+ 'csv_link': csv_link,
})
@@ -691,13 +717,25 @@ def participant_list(request):
q |= Q(track__slug__in=data['track'])
talks = talks.filter(q)
participants = participants.filter(talk__in=talks)
- contact_link = 'mailto:' + ','.join([participant.email for participant in participants.all()])
- return render(request, 'cfp/staff/participant_list.html', {
- 'filter_form': filter_form,
- 'participant_list': participants,
- 'show_filters': show_filters,
- 'contact_link': contact_link,
- })
+ if request.GET.get('format') == 'csv':
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment; filename="participants.csv"'
+ writer = csv.writer(response)
+ for participant in participants:
+ writer.writerow(participant.get_csv_row())
+ return response
+ else:
+ contact_link = 'mailto:' + ','.join([participant.email for participant in participants.all()])
+ csv_query_dict = request.GET.copy()
+ csv_query_dict['format'] = 'csv'
+ csv_link = '?' + csv_query_dict.urlencode()
+ return render(request, 'cfp/staff/participant_list.html', {
+ 'filter_form': filter_form,
+ 'participant_list': participants,
+ 'show_filters': show_filters,
+ 'contact_link': contact_link,
+ 'csv_link': csv_link,
+ })
@staff_required
diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo
index b10b171..10fc2e4 100644
Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index 6191abb..800bb99 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-11-07 23:13+0000\n"
-"PO-Revision-Date: 2017-11-08 00:14+0100\n"
+"POT-Creation-Date: 2017-11-08 19:16+0000\n"
+"PO-Revision-Date: 2017-11-08 20:17+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
@@ -34,15 +34,15 @@ msgstr "Décliné"
msgid "Waiting"
msgstr "En attente"
-#: cfp/forms.py:29 cfp/forms.py:130 cfp/forms.py:227 cfp/models.py:369
+#: cfp/forms.py:29 cfp/forms.py:130 cfp/forms.py:227 cfp/models.py:373
msgid "Confirmed"
msgstr "Confirmé"
-#: cfp/forms.py:30 cfp/models.py:371
+#: cfp/forms.py:30 cfp/models.py:375
msgid "Cancelled"
msgstr "Annulé"
-#: cfp/forms.py:62 cfp/models.py:470
+#: cfp/forms.py:62 cfp/models.py:504
msgid "Activity"
msgstr "Activité"
@@ -65,13 +65,13 @@ msgstr "Catégorie"
msgid "Title"
msgstr "Titre"
-#: cfp/forms.py:108 cfp/models.py:154 cfp/models.py:465
+#: cfp/forms.py:108 cfp/models.py:158 cfp/models.py:499
#: cfp/templates/cfp/proposal_talk_details.html:75
#: cfp/templates/cfp/staff/talk_details.html:64
msgid "Description"
msgstr "Description"
-#: cfp/forms.py:109 cfp/models.py:111 cfp/models.py:440
+#: cfp/forms.py:109 cfp/models.py:112 cfp/models.py:464
#: cfp/templates/cfp/staff/participant_details.html:19
#: cfp/templates/cfp/staff/talk_details.html:78
#: cfp/templates/cfp/staff/volunteer_details.html:22
@@ -82,7 +82,7 @@ msgstr "Notes"
msgid "Visible by speakers"
msgstr "Visible par les orateurs"
-#: cfp/forms.py:136 cfp/forms.py:233 cfp/models.py:326
+#: cfp/forms.py:136 cfp/forms.py:233 cfp/models.py:330
#: cfp/templates/cfp/staff/talk_details.html:21
#: cfp/templates/cfp/staff/talk_list.html:46
#: cfp/templates/cfp/staff/track_form.html:14
@@ -120,7 +120,7 @@ msgstr "Programmé"
msgid "Filter talks already / not yet scheduled"
msgstr "Filtrer les exposés déjà / pas encore planifiées"
-#: cfp/forms.py:160 cfp/models.py:343
+#: cfp/forms.py:160 cfp/models.py:347
#: cfp/templates/cfp/staff/talk_details.html:54
msgid "Materials"
msgstr "Supports"
@@ -161,7 +161,7 @@ msgstr "Assigner à une salle"
msgid "Notify by mail?"
msgstr "Notifier par e-mail ?"
-#: cfp/forms.py:249 cfp/models.py:435
+#: cfp/forms.py:249 cfp/models.py:459
#: cfp/templates/cfp/staff/volunteer_list.html:30
msgid "Email"
msgstr "E-mail"
@@ -180,63 +180,63 @@ msgstr "Un utilisateur avec ce prénom et ce nom existe déjà."
msgid "A user with that email already exists."
msgstr "Un utilisateur avec cet email existe déjà."
-#: cfp/models.py:29
+#: cfp/models.py:30
msgid "Conference name"
msgstr "Nom de la conférence"
-#: cfp/models.py:30
+#: cfp/models.py:31
msgid "Homepage (markdown)"
msgstr "Page d’accueil (markdown)"
-#: cfp/models.py:31
+#: cfp/models.py:32
msgid "Venue information"
msgstr "Informations sur le lieu"
-#: cfp/models.py:32
+#: cfp/models.py:33
msgid "City"
msgstr "Ville"
-#: cfp/models.py:33
+#: cfp/models.py:34
msgid "Contact email"
msgstr "Email de contact"
-#: cfp/models.py:34
+#: cfp/models.py:35
msgid "Reply email"
msgstr "Adresse de réponse"
-#: cfp/models.py:35
+#: cfp/models.py:36
msgid "Staff members"
msgstr "Membres du staff"
-#: cfp/models.py:36
+#: cfp/models.py:37
msgid "Secure domain (HTTPS)"
msgstr "Domaine sécurisé (HTTPS)"
-#: cfp/models.py:37
+#: cfp/models.py:38
msgid "Acceptances disclosure date"
msgstr "Date de divulgation des acceptations"
-#: cfp/models.py:38
+#: cfp/models.py:39
msgid "Schedule publishing date"
msgstr "Date de publication du programme"
-#: cfp/models.py:39
+#: cfp/models.py:40
msgid "Schedule redirection URL"
msgstr "URL de redirection du programme"
-#: cfp/models.py:40
+#: cfp/models.py:41
msgid "If specified, schedule tab will redirect to this URL."
msgstr "Si spécifiée, l’onglet programme redirigera vers cette URL."
-#: cfp/models.py:41
+#: cfp/models.py:42
msgid "Volunteers enrollment opening date"
msgstr "Date d’ouverture de l’appel à bénévole"
-#: cfp/models.py:42
+#: cfp/models.py:43
msgid "Volunteers enrollment closing date"
msgstr "Date de fermeture de l’appel à bénévole"
-#: cfp/models.py:79
+#: cfp/models.py:80
#, python-brace-format
msgid ""
"The reply email should be a formatable string accepting a token argument (e."
@@ -245,74 +245,74 @@ msgstr ""
"L’adresse de réponse doit être une chaine de texte formatable avec un "
"argument « token » (e.g. ponyconf+{token}@exemple.com)."
-#: cfp/models.py:99 cfp/models.py:152 cfp/models.py:204 cfp/models.py:463
+#: cfp/models.py:100 cfp/models.py:156 cfp/models.py:208 cfp/models.py:497
#: cfp/templates/cfp/staff/participant_list.html:35
#: cfp/templates/cfp/staff/volunteer_list.html:29
msgid "Name"
msgstr "Nom"
-#: cfp/models.py:101 cfp/templates/cfp/proposal_dashboard.html:33
+#: cfp/models.py:102 cfp/templates/cfp/proposal_dashboard.html:33
#: cfp/templates/cfp/staff/participant_details.html:15
msgid "Biography"
msgstr "Biographie"
-#: cfp/models.py:103
+#: cfp/models.py:104
msgid "Twitter"
msgstr "Twitter"
-#: cfp/models.py:104
+#: cfp/models.py:105
msgid "LinkedIn"
msgstr "LinkedIn"
-#: cfp/models.py:105
+#: cfp/models.py:106
msgid "Github"
msgstr "Github"
-#: cfp/models.py:106
+#: cfp/models.py:107
msgid "Website"
msgstr "Site web"
-#: cfp/models.py:107
+#: cfp/models.py:108
msgid "Facebook"
msgstr "Facebook"
-#: cfp/models.py:108
+#: cfp/models.py:109
msgid "Mastodon"
msgstr "Mastodon"
-#: cfp/models.py:109 cfp/models.py:437
+#: cfp/models.py:110 cfp/models.py:461
msgid "Phone number"
msgstr "Numéro de téléphone"
-#: cfp/models.py:112 cfp/models.py:325
+#: cfp/models.py:113 cfp/models.py:329
msgid "This field is only visible by organizers."
msgstr "Ce champs est uniquement visible par les organisateurs."
-#: cfp/models.py:113 cfp/templates/cfp/staff/participant_details.html:25
+#: cfp/models.py:114 cfp/templates/cfp/staff/participant_details.html:25
msgid "Invited speaker"
msgstr "Orateur invité"
-#: cfp/models.py:206
+#: cfp/models.py:210
msgid "Color"
msgstr "Couleur"
-#: cfp/models.py:208
+#: cfp/models.py:212
msgid "Show the tag on the program"
msgstr "Afficher l’étiquette sur le programme"
-#: cfp/models.py:244
+#: cfp/models.py:248
msgid "Default duration (min)"
msgstr "Durée par défaut (min)"
-#: cfp/models.py:245
+#: cfp/models.py:249
msgid "Color on program"
msgstr "Couleur sur le programme"
-#: cfp/models.py:246
+#: cfp/models.py:250
msgid "Label on program"
msgstr "Label dans le xml du programme"
-#: cfp/models.py:320 cfp/templates/cfp/proposal_talk_details.html:53
+#: cfp/models.py:324 cfp/templates/cfp/proposal_talk_details.html:53
#: cfp/templates/cfp/staff/base.html:11
#: cfp/templates/cfp/staff/participant_list.html:8
#: cfp/templates/cfp/staff/talk_details.html:68
@@ -320,19 +320,19 @@ msgstr "Label dans le xml du programme"
msgid "Speakers"
msgstr "Orateurs"
-#: cfp/models.py:321
+#: cfp/models.py:325
msgid "Talk Title"
msgstr "Titre de la proposition"
-#: cfp/models.py:324
+#: cfp/models.py:328
msgid "Description of your talk"
msgstr "Description de votre proposition"
-#: cfp/models.py:328 cfp/templates/cfp/proposal_talk_details.html:85
+#: cfp/models.py:332 cfp/templates/cfp/proposal_talk_details.html:85
msgid "Message to organizers"
msgstr "Message aux organisateurs"
-#: cfp/models.py:329
+#: cfp/models.py:333
msgid ""
"If you have any constraint or if you have anything that may help you to "
"select your talk, like a video or slides of your talk, please write it down "
@@ -342,67 +342,67 @@ msgstr ""
"votre proposition, comme une vidéo, des slides, n'hésitez pas à les ajouter "
"ici."
-#: cfp/models.py:332
+#: cfp/models.py:336
msgid "Talk Category"
msgstr "Catégorie de proposition"
-#: cfp/models.py:333
+#: cfp/models.py:337
msgid "I'm ok to be recorded on video"
msgstr "J’accepte d’être enregistré en vidéo"
-#: cfp/models.py:335
+#: cfp/models.py:339
msgid "Video licence"
msgstr "Licence vidéo"
-#: cfp/models.py:336
+#: cfp/models.py:340
msgid "I need sound"
msgstr "J’ai besoin de son"
-#: cfp/models.py:339
+#: cfp/models.py:343
msgid "Beginning date and time"
msgstr "Date et heure de début"
-#: cfp/models.py:340
+#: cfp/models.py:344
msgid "Duration (min)"
msgstr "Durée (min)"
-#: cfp/models.py:344
+#: cfp/models.py:348
msgid ""
"You can use this field to share some materials related to your intervention."
msgstr ""
"Vous pouvez utiliser ce champs pour partager les supports de votre "
"intervention."
-#: cfp/models.py:373
+#: cfp/models.py:377
msgid "Waiting confirmation"
msgstr "En attente de confirmation"
-#: cfp/models.py:375
+#: cfp/models.py:379
msgid "Refused"
msgstr "Refusé"
-#: cfp/models.py:377
+#: cfp/models.py:381
#, python-format
msgid "Pending decision, score: %(score).1f"
msgstr "En cours, score : %(score).1f"
-#: cfp/models.py:434
+#: cfp/models.py:458
msgid "Your Name"
msgstr "Votre Nom"
-#: cfp/models.py:438
+#: cfp/models.py:462
msgid "SMS prefered"
msgstr "SMS préférés"
-#: cfp/models.py:441
+#: cfp/models.py:465
msgid "If you have some constraints, you can indicate them here."
msgstr "Si vous avez des contraintes, vous pouvez les indiquer ici."
-#: cfp/models.py:466 cfp/templates/cfp/staff/volunteer_details.html:8
+#: cfp/models.py:500 cfp/templates/cfp/staff/volunteer_details.html:8
msgid "Volunteer"
msgstr "Bénévole"
-#: cfp/models.py:471 cfp/templates/cfp/admin/activity_list.html:9
+#: cfp/models.py:505 cfp/templates/cfp/admin/activity_list.html:9
#: cfp/templates/cfp/admin/base.html:13
#: cfp/templates/cfp/staff/volunteer_details.html:27
#: cfp/templates/cfp/staff/volunteer_list.html:32
@@ -603,7 +603,7 @@ msgstr "avec"
#: cfp/templates/cfp/staff/participant_details.html:48
#: cfp/templates/cfp/staff/room_details.html:21
#: cfp/templates/cfp/staff/room_details.html:39
-#: cfp/templates/cfp/staff/talk_list.html:62
+#: cfp/templates/cfp/staff/talk_list.html:69
msgid "and"
msgstr "et"
@@ -830,31 +830,32 @@ msgstr "orateur"
msgid "Talk count"
msgstr "Nombre d’exposé"
-#: cfp/templates/cfp/staff/participant_list.html:43
-#: cfp/templates/cfp/staff/volunteer_list.html:37
-msgid "Contact:"
-msgstr "Contacter :"
+#: cfp/templates/cfp/staff/participant_list.html:44
+#: cfp/templates/cfp/staff/volunteer_list.html:38
+msgid "contact by email"
+msgstr "contacter par e-mail"
-#: cfp/templates/cfp/staff/participant_list.html:43
-#: cfp/templates/cfp/staff/volunteer_list.html:37
-msgid "link"
-msgstr "lien"
+#: cfp/templates/cfp/staff/participant_list.html:46
+#: cfp/templates/cfp/staff/talk_list.html:54
+#: cfp/templates/cfp/staff/volunteer_list.html:40
+msgid "download as csv"
+msgstr "télécharger au format CSV"
-#: cfp/templates/cfp/staff/participant_list.html:56
+#: cfp/templates/cfp/staff/participant_list.html:60
#, python-format
msgid "accepted: %(accepted)s"
msgid_plural "accepted: %(accepted)s"
msgstr[0] "accepté : %(accepted)s"
msgstr[1] "acceptés : %(accepted)s"
-#: cfp/templates/cfp/staff/participant_list.html:58
+#: cfp/templates/cfp/staff/participant_list.html:62
#, python-format
msgid "pending: %(pending)s"
msgid_plural "pending: %(pending)s"
msgstr[0] "en attente : %(pending)s"
msgstr[1] "en attente : %(pending)s"
-#: cfp/templates/cfp/staff/participant_list.html:60
+#: cfp/templates/cfp/staff/participant_list.html:64
#, python-format
msgid "refused: %(refused)s"
msgid_plural "refused: %(refused)s"
@@ -1016,11 +1017,11 @@ msgstr "Éditer un exposé"
msgid "Intervention kind"
msgstr "Type d’intervention"
-#: cfp/templates/cfp/staff/talk_list.html:80
+#: cfp/templates/cfp/staff/talk_list.html:87
msgid "For selected talks:"
msgstr "Pour les exposés sélectionnés :"
-#: cfp/templates/cfp/staff/talk_list.html:85
+#: cfp/templates/cfp/staff/talk_list.html:92
msgid "Apply"
msgstr "Appliquer"
@@ -1078,7 +1079,7 @@ msgstr ""
msgid "We are looking for help with the following activities:"
msgstr "Nous cherchons de l’aide pour les activités suivantes :"
-#: cfp/views.py:51
+#: cfp/views.py:52
msgid ""
"Hi {},\n"
"\n"
@@ -1106,26 +1107,26 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:71
+#: cfp/views.py:72
msgid "Thank you for your help!"
msgstr "Merci pour votre aide !"
-#: cfp/views.py:76
+#: cfp/views.py:77
msgid ""
"Thank you for your participation! You can now subscribe to some activities."
msgstr ""
"Merci pour votre participation ! Vous pouvez maintenant vous inscrire à une "
"ou plusieurs activités."
-#: cfp/views.py:98
+#: cfp/views.py:99
msgid "Thank you for your participation!"
msgstr "Merci pour votre participation !"
-#: cfp/views.py:102
+#: cfp/views.py:103
msgid "Okay, no problem!"
msgstr "Ok, pas de soucis !"
-#: cfp/views.py:174
+#: cfp/views.py:187
msgid ""
"Hi {},\n"
"\n"
@@ -1165,15 +1166,15 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:204 cfp/views.py:288
+#: cfp/views.py:217 cfp/views.py:301
msgid "You proposition have been successfully submitted!"
msgstr "Votre proposition a été transmise avec succès !"
-#: cfp/views.py:218
+#: cfp/views.py:231
msgid "Sorry, we do not know this email."
msgstr "Désolé, nous ne connaissons pas cette e-mail."
-#: cfp/views.py:223
+#: cfp/views.py:236
msgid ""
"Hi {},\n"
"\n"
@@ -1204,41 +1205,41 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:243
+#: cfp/views.py:256
msgid "A email have been sent with a link to access to your profil."
msgstr "Un e-mail vous a été envoyé avec un lien pour accéder à votre profil."
-#: cfp/views.py:284 cfp/views.py:357
+#: cfp/views.py:297 cfp/views.py:370
msgid "Changes saved."
msgstr "Modifications sauvegardées."
-#: cfp/views.py:305
+#: cfp/views.py:318
msgid "You already confirmed your participation to this talk."
msgstr "Vous avez déjà confirmé votre participation à cet exposé."
-#: cfp/views.py:307
+#: cfp/views.py:320
msgid "You already cancelled your participation to this talk."
msgstr "Vous avez déjà annulé votre participation à cet exposé."
-#: cfp/views.py:312
+#: cfp/views.py:325
msgid "Your participation has been taken into account, thank you!"
msgstr "Votre participation a été prise en compte, merci !"
-#: cfp/views.py:313
+#: cfp/views.py:326
#, python-format
msgid "Speaker %(speaker)s confirmed his/her participation."
msgstr "L’intervenant %(speaker)s a confirmé sa participation."
-#: cfp/views.py:315
+#: cfp/views.py:328
msgid "We have noted your unavailability."
msgstr "Nous avons enregistré votre indisponibilité."
-#: cfp/views.py:316
+#: cfp/views.py:329
#, python-format
msgid "Speaker %(speaker)s CANCELLED his/her participation."
msgstr "L’intervenant %(speaker)s a ANNULÉ sa participation."
-#: cfp/views.py:364
+#: cfp/views.py:377
msgid ""
"Hi {},\n"
"\n"
@@ -1278,59 +1279,59 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:395 cfp/views.py:415
+#: cfp/views.py:408 cfp/views.py:428
msgid "Co-speaker successfully added to the talk."
msgstr "Co-intervenant ajouté à l’exposé avec succès."
-#: cfp/views.py:428
+#: cfp/views.py:441
msgid "Co-speaker successfully removed from the talk."
msgstr "Co-intervenant supprimé de l’exposé avec succès."
-#: cfp/views.py:470
+#: cfp/views.py:483
msgid "The speaker confirmation have been noted."
msgstr "La confirmation de l’orateur a été notée."
-#: cfp/views.py:471
+#: cfp/views.py:484
msgid "The talk have been confirmed."
msgstr "L’exposé a été confirmé."
-#: cfp/views.py:473
+#: cfp/views.py:486
msgid "The speaker unavailability have been noted."
msgstr "L’indisponibilité de l’intervenant a été notée."
-#: cfp/views.py:474
+#: cfp/views.py:487
msgid "The talk have been cancelled."
msgstr "L’exposé a été annulé."
-#: cfp/views.py:549 cfp/views.py:651
+#: cfp/views.py:572 cfp/views.py:677
msgid "The talk has been accepted."
msgstr "L’exposé a été accepté."
-#: cfp/views.py:551 cfp/views.py:653
+#: cfp/views.py:574 cfp/views.py:679
msgid "The talk has been declined."
msgstr "L’exposé a été décliné."
-#: cfp/views.py:620 cfp/views.py:713
+#: cfp/views.py:646 cfp/views.py:751
msgid "Message sent!"
msgstr "Message envoyé !"
-#: cfp/views.py:634
+#: cfp/views.py:660
msgid "Vote successfully created"
msgstr "A voté !"
-#: cfp/views.py:634
+#: cfp/views.py:660
msgid "Vote successfully updated"
msgstr "Vote mis à jour"
-#: cfp/views.py:655
+#: cfp/views.py:681
msgid "Decision taken in account"
msgstr "Décision enregistrée"
-#: cfp/views.py:748
+#: cfp/views.py:786
msgid "[{}] You have been added to the staff team"
msgstr "[{}] Vous avez été ajouté aux membres du staff"
-#: cfp/views.py:749
+#: cfp/views.py:787
msgid ""
"Hi {},\n"
"\n"
@@ -1354,15 +1355,15 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:770
+#: cfp/views.py:808
msgid "Modifications successfully saved."
msgstr "Modification enregistrée avec succès."
-#: cfp/views.py:934
+#: cfp/views.py:972
msgid "User created successfully."
msgstr "Utilisateur créé avec succès."
-#: cfp/views.py:955
+#: cfp/views.py:993
#, python-format
msgid "Format '%s' not available"
msgstr "Format '%s' non disponible"
@@ -1444,6 +1445,12 @@ msgstr "Changement de mot de passe"
msgid "Email address"
msgstr "Adresse e-mail"
+#~ msgid "Contact:"
+#~ msgstr "Contacter :"
+
+#~ msgid "link"
+#~ msgstr "lien"
+
#~ msgid "The volunteer made a few remarks to the staff."
#~ msgstr "Le bénévole a fait quelques remarques au staff."