downloads talks, speakers and volunteers as CSV

This commit is contained in:
Élie Bouttier 2017-11-08 20:17:56 +01:00
parent bd5804fdd6
commit b72e9c9180
7 changed files with 222 additions and 128 deletions

View File

@ -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')

View File

@ -39,7 +39,11 @@
</thead>
<tfoot>
<tr>
<td colspan="7">{% trans "Contact:" %} <a href="{{ contact_link }}">{% trans "link" %}</a></td>
<td colspan="7">
<a href="{{ contact_link }}">{% trans "contact by email" %}</a>
|
<a href="{{ csv_link }}">{% trans "download as csv" %}</a>
</td>
</tr>
</tfoot>
{% for participant in participant_list %}

View File

@ -48,6 +48,13 @@
<th class="text-center">{% trans "Status" %} <a href="?{{ sort_urls.status }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.status }} pull-right"></span></a></th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="7">
<a href="{{ csv_link }}">{% trans "download as csv" %}</a>
</td>
</tr>
</tfoot>
{% for talk in talk_list %}
{% if forloop.first %}
<tbody>

View File

@ -34,7 +34,11 @@
</thead>
<tfoot>
<tr>
<td colspan="7">{% trans "Contact:" %} <a href="{{ contact_link }}">{% trans "link" %}</a></td>
<td colspan="7">
<a href="{{ contact_link }}">{% trans "contact by email" %}</a>
|
<a href="{{ csv_link }}">{% trans "download as csv" %}</a>
</td>
</tr>
</tfoot>
{% for volunteer in volunteer_list %}

View File

@ -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

Binary file not shown.

View File

@ -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 daccueil (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, longlet programme redirigera vers cette URL."
#: cfp/models.py:41
#: cfp/models.py:42
msgid "Volunteers enrollment opening date"
msgstr "Date douverture de lappel à bénévole"
#: cfp/models.py:42
#: cfp/models.py:43
msgid "Volunteers enrollment closing date"
msgstr "Date de fermeture de lappel à 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 ""
"Ladresse 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 "Jaccepte 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 "Jai 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 dexposé"
#: 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 dintervention"
#: 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 laide 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 "Lintervenant %(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 "Lintervenant %(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é à lexposé avec succès."
#: cfp/views.py:428
#: cfp/views.py:441
msgid "Co-speaker successfully removed from the talk."
msgstr "Co-intervenant supprimé de lexposé avec succès."
#: cfp/views.py:470
#: cfp/views.py:483
msgid "The speaker confirmation have been noted."
msgstr "La confirmation de lorateur a été notée."
#: cfp/views.py:471
#: cfp/views.py:484
msgid "The talk have been confirmed."
msgstr "Lexposé a été confirmé."
#: cfp/views.py:473
#: cfp/views.py:486
msgid "The speaker unavailability have been noted."
msgstr "Lindisponibilité de lintervenant a été notée."
#: cfp/views.py:474
#: cfp/views.py:487
msgid "The talk have been cancelled."
msgstr "Lexposé 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 "Lexposé 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 "Lexposé 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."