volunteers: link to user

This commit is contained in:
Élie Bouttier 2017-11-06 21:47:31 +01:00
parent 41f745384f
commit da785bd510
8 changed files with 165 additions and 138 deletions

View File

@ -5,7 +5,7 @@ from django.shortcuts import get_object_or_404
from functools import wraps from functools import wraps
from cfp.utils import is_staff from cfp.utils import is_staff
from cfp.models import Participant from cfp.models import Participant, Volunteer
def speaker_required(view_func): def speaker_required(view_func):
@ -22,6 +22,20 @@ def speaker_required(view_func):
return wraps(view_func)(wrapped_view) return wraps(view_func)(wrapped_view)
def volunteer_required(view_func):
def wrapped_view(request, **kwargs):
volunteer_token = kwargs.pop('volunteer_token')
if volunteer_token:
volunteer = get_object_or_404(Volunteer, site=request.conference.site, token=volunteer_token)
elif request.user.is_authenticated():
volunteer = get_object_or_404(Volunteer, site=request.conference.site, email=request.user.email)
else:
raise PermissionDenied
kwargs['volunteer'] = volunteer
return view_func(request, **kwargs)
return wraps(view_func)(wrapped_view)
def staff_required(view_func): def staff_required(view_func):
def _is_staff(request, *args, **kwargs): def _is_staff(request, *args, **kwargs):
if not request.user.is_authenticated(): if not request.user.is_authenticated():

View File

@ -115,7 +115,6 @@ class Participant(PonyConfModel):
objects = ParticipantManager() objects = ParticipantManager()
def get_absolute_url(self): def get_absolute_url(self):
return reverse('participant-details', kwargs=dict(participant_id=self.token)) return reverse('participant-details', kwargs=dict(participant_id=self.token))
@ -434,10 +433,10 @@ class Volunteer(PonyConfModel):
conversation = models.OneToOneField(MessageThread) conversation = models.OneToOneField(MessageThread)
def get_absolute_url(self): def get_absolute_url(self):
return reverse('volunteer-home', kwargs={'volunteer_id': self.token}) return reverse('volunteer-details', kwargs=dict(volunteer_id=self.pk))
def get_secret_url(self, full=False): def get_secret_url(self, full=False):
url = reverse('volunteer-home', kwargs={'volunteer_id': self.token}) url = reverse('volunteer-home', kwargs=dict(volunteer_token=self.token))
if full: if full:
url = ('https' if self.site.conference.secure_domain else 'http') + '://' + self.site.domain + url url = ('https' if self.site.conference.secure_domain else 'http') + '://' + self.site.domain + url
return url return url

View File

@ -8,12 +8,14 @@
<h1>{% trans "Volunteer" %} <b>{{ volunteer.name }}</b></h1> <h1>{% trans "Volunteer" %} <b>{{ volunteer.name }}</b></h1>
<dl class="dl-horizontal"> <dl class="dl-horizontal">
<dt>{% trans "Email" %}</dt> <dt>{% trans "Email:" %}</dt>
<dd><a href="mailto:{{ volunteer.email }}">{{ volunteer.email }}</a></dd> <dd><a href="mailto:{{ volunteer.email }}">{{ volunteer.email }}</a></dd>
{% if volunteer.phone_number %} {% if volunteer.phone_number %}
<dt>{% trans "Phone number" %}</dt> <dt>{% trans "Phone number:" %}</dt>
<dd><a href="tel:{{ volunteer.phone_number }}">{{ volunteer.phone_number }}</a>{% if volunteer.sms_prefered %} (SMS){% endif %}</dd> <dd><a href="tel:{{ volunteer.phone_number }}">{{ volunteer.phone_number }}</a>{% if volunteer.sms_prefered %} (SMS){% endif %}</dd>
{% endif %} {% endif %}
<dt>{% trans "Secret link:" %}</dt>
<dd><a href="{{ volunteer.get_secret_url }}">{{ volunteer.token }}</a></dd>
</dl> </dl>
{% if volunteer.notes %} {% if volunteer.notes %}

View File

@ -16,9 +16,9 @@
<p>{{ activity.description }}</p> <p>{{ activity.description }}</p>
<p> <p>
{% if volunteer not in activity.volunteers.all %} {% if volunteer not in activity.volunteers.all %}
<a class="btn btn-primary" href="{% url 'volunteer-join' volunteer_id=volunteer.token activity=activity.slug %}">{% trans "I will be happy to help on that!" %}</a> <a class="btn btn-primary" href="{% url 'volunteer-join' volunteer_token=volunteer.token activity=activity.slug %}">{% trans "I will be happy to help on that!" %}</a>
{% else %} {% else %}
<a class="btn btn-danger" href="{% url 'volunteer-quit' volunteer_id=volunteer.token activity=activity.slug %}">{% trans "Sorry, I have a setback" %}</a> <a class="btn btn-danger" href="{% url 'volunteer-quit' volunteer_token=volunteer.token activity=activity.slug %}">{% trans "Sorry, I have a setback" %}</a>
{% endif %} {% endif %}
</p> </p>
</p> </p>

View File

@ -28,9 +28,9 @@ urlpatterns = [
url(r'^cfp/(?P<talk_id>[\w\-]+)/(?P<participant_id>[\w\-]+)/desist/$', views.talk_acknowledgment, {'confirm': False}, name='talk-desist'), url(r'^cfp/(?P<talk_id>[\w\-]+)/(?P<participant_id>[\w\-]+)/desist/$', views.talk_acknowledgment, {'confirm': False}, name='talk-desist'),
# End backward compatibility # End backward compatibility
url(r'^volunteer/$', views.volunteer_enrole, name='volunteer-enrole'), url(r'^volunteer/$', views.volunteer_enrole, name='volunteer-enrole'),
url(r'^volunteer/(?P<volunteer_id>[\w\-]+)/$', views.volunteer_home, name='volunteer-home'), url(r'^volunteer/(?P<volunteer_token>[\w\-]+)/$', views.volunteer_home, name='volunteer-home'),
url(r'^volunteer/(?P<volunteer_id>[\w\-]+)/join/(?P<activity>[\w\-]+)/$', views.volunteer_update_activity, {'join': True}, name='volunteer-join'), url(r'^volunteer/(?P<volunteer_token>[\w\-]+)/join/(?P<activity>[\w\-]+)/$', views.volunteer_update_activity, {'join': True}, name='volunteer-join'),
url(r'^volunteer/(?P<volunteer_id>[\w\-]+)/quit/(?P<activity>[\w\-]+)/$', views.volunteer_update_activity, {'join': False}, name='volunteer-quit'), url(r'^volunteer/(?P<volunteer_token>[\w\-]+)/quit/(?P<activity>[\w\-]+)/$', views.volunteer_update_activity, {'join': False}, name='volunteer-quit'),
#url(r'^talk/(?P<talk_id>[\w\-]+)/$', views.talk_show, name='show-talk'), #url(r'^talk/(?P<talk_id>[\w\-]+)/$', views.talk_show, name='show-talk'),
#url(r'^speaker/(?P<participant_id>[\w\-]+)/$', views.speaker_show, name='show-speaker'), #url(r'^speaker/(?P<participant_id>[\w\-]+)/$', views.speaker_show, name='show-speaker'),
url(r'^staff/$', views.staff, name='staff'), url(r'^staff/$', views.staff, name='staff'),

View File

@ -21,7 +21,7 @@ from functools import reduce
from mailing.models import Message from mailing.models import Message
from mailing.forms import MessageForm from mailing.forms import MessageForm
from .planning import Program from .planning import Program
from .decorators import speaker_required, staff_required from .decorators import speaker_required, volunteer_required, staff_required
from .mixins import StaffRequiredMixin, OnSiteMixin, OnSiteFormMixin from .mixins import StaffRequiredMixin, OnSiteMixin, OnSiteFormMixin
from .utils import is_staff from .utils import is_staff
from .models import Participant, Talk, TalkCategory, Vote, Track, Tag, Room, Volunteer, Activity from .models import Participant, Talk, TalkCategory, Vote, Track, Tag, Room, Volunteer, Activity
@ -73,25 +73,23 @@ Thanks!
recipient_list=['%s <%s>' % (volunteer.name, volunteer.email)], recipient_list=['%s <%s>' % (volunteer.name, volunteer.email)],
) )
messages.success(request, _('Thank you for your participation! You can now subscribe to some activities.')) messages.success(request, _('Thank you for your participation! You can now subscribe to some activities.'))
return redirect(reverse('volunteer-home', kwargs=dict(volunteer_id=volunteer.token))) return redirect(reverse('volunteer-home', kwargs=dict(volunteer_token=volunteer.token)))
return render(request, 'cfp/volunteer_enrole.html', { return render(request, 'cfp/volunteer_enrole.html', {
'activities': Activity.objects.filter(site=request.conference.site), 'activities': Activity.objects.filter(site=request.conference.site),
'form': form, 'form': form,
}) })
def volunteer_home(request, volunteer_id): @volunteer_required
volunteer = get_object_or_404(Volunteer, token=volunteer_id, site=request.conference.site) def volunteer_home(request, volunteer):
return render(request, 'cfp/volunteer.html', { return render(request, 'cfp/volunteer.html', {
'activities': Activity.objects.filter(site=request.conference.site), 'activities': Activity.objects.filter(site=request.conference.site),
'volunteer': volunteer, 'volunteer': volunteer,
}) })
def volunteer_update_activity(request, volunteer_id, activity, join): @volunteer_required
if not request.conference.volunteers_enrollment_is_open(): def volunteer_update_activity(request, volunteer, activity, join):
raise PermissionDenied
volunteer = get_object_or_404(Volunteer, token=volunteer_id, site=request.conference.site)
activity = get_object_or_404(Activity, slug=activity, site=request.conference.site) activity = get_object_or_404(Activity, slug=activity, site=request.conference.site)
if join: if join:
activity.volunteers.add(volunteer) activity.volunteers.add(volunteer)
@ -101,7 +99,7 @@ def volunteer_update_activity(request, volunteer_id, activity, join):
activity.volunteers.remove(volunteer) activity.volunteers.remove(volunteer)
activity.save() activity.save()
messages.success(request, _('Okay, no problem!')) messages.success(request, _('Okay, no problem!'))
return redirect(reverse('volunteer-home', kwargs=dict(volunteer_id=volunteer.token))) return redirect(reverse('volunteer-home', kwargs=dict(volunteer_token=volunteer.token)))
@staff_required @staff_required

Binary file not shown.

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-04 20:04+0000\n" "POT-Creation-Date: 2017-11-06 20:28+0000\n"
"PO-Revision-Date: 2017-11-04 21:12+0100\n" "PO-Revision-Date: 2017-11-06 21:30+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: fr\n" "Language: fr\n"
@ -22,7 +22,7 @@ msgstr ""
msgid "Pending decision" msgid "Pending decision"
msgstr "Décision en attente" msgstr "Décision en attente"
#: cfp/forms.py:18 cfp/forms.py:124 cfp/forms.py:236 #: cfp/forms.py:18 cfp/forms.py:124 cfp/forms.py:221
msgid "Accepted" msgid "Accepted"
msgstr "Accepté" msgstr "Accepté"
@ -34,15 +34,15 @@ msgstr "Décliné"
msgid "Waiting" msgid "Waiting"
msgstr "En attente" msgstr "En attente"
#: cfp/forms.py:29 cfp/forms.py:130 cfp/forms.py:242 cfp/models.py:357 #: cfp/forms.py:29 cfp/forms.py:130 cfp/forms.py:227 cfp/models.py:360
msgid "Confirmed" msgid "Confirmed"
msgstr "Confirmé" msgstr "Confirmé"
#: cfp/forms.py:30 cfp/models.py:359 #: cfp/forms.py:30 cfp/models.py:362
msgid "Cancelled" msgid "Cancelled"
msgstr "Annulé" msgstr "Annulé"
#: cfp/forms.py:62 cfp/models.py:452 #: cfp/forms.py:62 cfp/models.py:461
msgid "Activity" msgid "Activity"
msgstr "Activité" msgstr "Activité"
@ -56,7 +56,7 @@ msgstr "Aucune"
msgid "Default duration: %(duration)d min" msgid "Default duration: %(duration)d min"
msgstr "Durée par défaut : %(duration)d min" msgstr "Durée par défaut : %(duration)d min"
#: cfp/forms.py:106 cfp/forms.py:118 cfp/forms.py:230 #: cfp/forms.py:106 cfp/forms.py:118 cfp/forms.py:215
#: cfp/templates/cfp/staff/talk_details.html:15 #: cfp/templates/cfp/staff/talk_details.html:15
msgid "Category" msgid "Category"
msgstr "Catégorie" msgstr "Catégorie"
@ -65,16 +65,16 @@ msgstr "Catégorie"
msgid "Title" msgid "Title"
msgstr "Titre" msgstr "Titre"
#: cfp/forms.py:108 cfp/models.py:151 cfp/models.py:447 #: cfp/forms.py:108 cfp/models.py:154 cfp/models.py:456
#: cfp/templates/cfp/proposal_talk_details.html:73 #: cfp/templates/cfp/proposal_talk_details.html:75
#: cfp/templates/cfp/staff/talk_details.html:64 #: cfp/templates/cfp/staff/talk_details.html:64
msgid "Description" msgid "Description"
msgstr "Description" msgstr "Description"
#: cfp/forms.py:109 cfp/models.py:111 cfp/models.py:428 #: cfp/forms.py:109 cfp/models.py:111 cfp/models.py:431
#: cfp/templates/cfp/staff/participant_details.html:19 #: cfp/templates/cfp/staff/participant_details.html:19
#: cfp/templates/cfp/staff/talk_details.html:78 #: cfp/templates/cfp/staff/talk_details.html:78
#: cfp/templates/cfp/staff/volunteer_details.html:20 #: cfp/templates/cfp/staff/volunteer_details.html:22
msgid "Notes" msgid "Notes"
msgstr "Notes" msgstr "Notes"
@ -82,7 +82,7 @@ msgstr "Notes"
msgid "Visible by speakers" msgid "Visible by speakers"
msgstr "Visible par les orateurs" msgstr "Visible par les orateurs"
#: cfp/forms.py:136 cfp/forms.py:248 cfp/models.py:314 #: cfp/forms.py:136 cfp/forms.py:233 cfp/models.py:317
#: cfp/templates/cfp/staff/talk_details.html:21 #: cfp/templates/cfp/staff/talk_details.html:21
#: cfp/templates/cfp/staff/talk_list.html:46 #: cfp/templates/cfp/staff/talk_list.html:46
#: cfp/templates/cfp/staff/track_form.html:14 #: cfp/templates/cfp/staff/track_form.html:14
@ -120,7 +120,7 @@ msgstr "Programmé"
msgid "Filter talks already / not yet scheduled" msgid "Filter talks already / not yet scheduled"
msgstr "Filtrer les exposés déjà / pas encore planifiées" msgstr "Filtrer les exposés déjà / pas encore planifiées"
#: cfp/forms.py:160 cfp/models.py:331 #: cfp/forms.py:160 cfp/models.py:334
#: cfp/templates/cfp/staff/talk_details.html:54 #: cfp/templates/cfp/staff/talk_details.html:54
msgid "Materials" msgid "Materials"
msgstr "Supports" msgstr "Supports"
@ -137,7 +137,7 @@ msgstr "Vidéo"
msgid "Filter talks with / without video" msgid "Filter talks with / without video"
msgstr "Filtrer les exposés avec / sans vidéo" msgstr "Filtrer les exposés avec / sans vidéo"
#: cfp/forms.py:174 cfp/forms.py:260 #: cfp/forms.py:174 cfp/forms.py:245
msgid "Not assigned" msgid "Not assigned"
msgstr "Pas encore assignée" msgstr "Pas encore assignée"
@ -161,23 +161,22 @@ msgstr "Assigner à une salle"
msgid "Notify by mail?" msgid "Notify by mail?"
msgstr "Notifier par e-mail ?" msgstr "Notifier par e-mail ?"
#: cfp/forms.py:264 cfp/models.py:423 #: cfp/forms.py:249 cfp/models.py:426
#: cfp/templates/cfp/staff/volunteer_details.html:11
#: cfp/templates/cfp/staff/volunteer_list.html:30 #: cfp/templates/cfp/staff/volunteer_list.html:30
msgid "Email" msgid "Email"
msgstr "E-mail" msgstr "E-mail"
#: cfp/forms.py:283 #: cfp/forms.py:268
msgid "New staff members will be informed of their new position by e-mail." msgid "New staff members will be informed of their new position by e-mail."
msgstr "" msgstr ""
"Les nouveaux membres du staff seront informés de leur nouveau rôle par " "Les nouveaux membres du staff seront informés de leur nouveau rôle par "
"courrier électronique." "courrier électronique."
#: cfp/forms.py:303 #: cfp/forms.py:288
msgid "An user with that firstname and that lastname already exists." msgid "An user with that firstname and that lastname already exists."
msgstr "Un utilisateur avec ce prénom et ce nom existe déjà." msgstr "Un utilisateur avec ce prénom et ce nom existe déjà."
#: cfp/forms.py:308 #: cfp/forms.py:293
msgid "A user with that email already exists." msgid "A user with that email already exists."
msgstr "Un utilisateur avec cet email existe déjà." msgstr "Un utilisateur avec cet email existe déjà."
@ -246,7 +245,7 @@ msgstr ""
"Ladresse de réponse doit être une chaine de texte formatable avec un " "Ladresse de réponse doit être une chaine de texte formatable avec un "
"argument « token » (e.g. ponyconf+{token}@exemple.com)." "argument « token » (e.g. ponyconf+{token}@exemple.com)."
#: cfp/models.py:99 cfp/models.py:149 cfp/models.py:201 cfp/models.py:445 #: cfp/models.py:99 cfp/models.py:152 cfp/models.py:204 cfp/models.py:454
#: cfp/templates/cfp/staff/participant_list.html:35 #: cfp/templates/cfp/staff/participant_list.html:35
#: cfp/templates/cfp/staff/volunteer_list.html:29 #: cfp/templates/cfp/staff/volunteer_list.html:29
msgid "Name" msgid "Name"
@ -281,12 +280,11 @@ msgstr "Facebook"
msgid "Mastodon" msgid "Mastodon"
msgstr "Mastodon" msgstr "Mastodon"
#: cfp/models.py:109 cfp/models.py:425 #: cfp/models.py:109 cfp/models.py:428
#: cfp/templates/cfp/staff/volunteer_details.html:14
msgid "Phone number" msgid "Phone number"
msgstr "Numéro de téléphone" msgstr "Numéro de téléphone"
#: cfp/models.py:112 cfp/models.py:313 #: cfp/models.py:112 cfp/models.py:316
msgid "This field is only visible by organizers." msgid "This field is only visible by organizers."
msgstr "Ce champs est uniquement visible par les organisateurs." msgstr "Ce champs est uniquement visible par les organisateurs."
@ -294,23 +292,23 @@ msgstr "Ce champs est uniquement visible par les organisateurs."
msgid "Invited speaker" msgid "Invited speaker"
msgstr "Orateur invité" msgstr "Orateur invité"
#: cfp/models.py:203 #: cfp/models.py:206
msgid "Color" msgid "Color"
msgstr "Couleur" msgstr "Couleur"
#: cfp/models.py:235 #: cfp/models.py:238
msgid "Default duration (min)" msgid "Default duration (min)"
msgstr "Durée par défaut (min)" msgstr "Durée par défaut (min)"
#: cfp/models.py:236 #: cfp/models.py:239
msgid "Color on program" msgid "Color on program"
msgstr "Couleur sur le programme" msgstr "Couleur sur le programme"
#: cfp/models.py:237 #: cfp/models.py:240
msgid "Label on program" msgid "Label on program"
msgstr "Label dans le xml du programme" msgstr "Label dans le xml du programme"
#: cfp/models.py:308 cfp/templates/cfp/proposal_talk_details.html:51 #: cfp/models.py:311 cfp/templates/cfp/proposal_talk_details.html:53
#: cfp/templates/cfp/staff/base.html:11 #: cfp/templates/cfp/staff/base.html:11
#: cfp/templates/cfp/staff/participant_list.html:8 #: cfp/templates/cfp/staff/participant_list.html:8
#: cfp/templates/cfp/staff/talk_details.html:68 #: cfp/templates/cfp/staff/talk_details.html:68
@ -318,19 +316,19 @@ msgstr "Label dans le xml du programme"
msgid "Speakers" msgid "Speakers"
msgstr "Orateurs" msgstr "Orateurs"
#: cfp/models.py:309 #: cfp/models.py:312
msgid "Talk Title" msgid "Talk Title"
msgstr "Titre de la proposition" msgstr "Titre de la proposition"
#: cfp/models.py:312 #: cfp/models.py:315
msgid "Description of your talk" msgid "Description of your talk"
msgstr "Description de votre proposition" msgstr "Description de votre proposition"
#: cfp/models.py:316 cfp/templates/cfp/proposal_talk_details.html:83 #: cfp/models.py:319 cfp/templates/cfp/proposal_talk_details.html:85
msgid "Message to organizers" msgid "Message to organizers"
msgstr "Message aux organisateurs" msgstr "Message aux organisateurs"
#: cfp/models.py:317 #: cfp/models.py:320
msgid "" msgid ""
"If you have any constraint or if you have anything that may help you to " "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 " "select your talk, like a video or slides of your talk, please write it down "
@ -340,67 +338,67 @@ msgstr ""
"votre proposition, comme une vidéo, des slides, n'hésitez pas à les ajouter " "votre proposition, comme une vidéo, des slides, n'hésitez pas à les ajouter "
"ici." "ici."
#: cfp/models.py:320 #: cfp/models.py:323
msgid "Talk Category" msgid "Talk Category"
msgstr "Catégorie de proposition" msgstr "Catégorie de proposition"
#: cfp/models.py:321 #: cfp/models.py:324
msgid "I'm ok to be recorded on video" msgid "I'm ok to be recorded on video"
msgstr "Jaccepte dêtre enregistré en vidéo" msgstr "Jaccepte dêtre enregistré en vidéo"
#: cfp/models.py:323 #: cfp/models.py:326
msgid "Video licence" msgid "Video licence"
msgstr "Licence vidéo" msgstr "Licence vidéo"
#: cfp/models.py:324 #: cfp/models.py:327
msgid "I need sound" msgid "I need sound"
msgstr "Jai besoin de son" msgstr "Jai besoin de son"
#: cfp/models.py:327 #: cfp/models.py:330
msgid "Beginning date and time" msgid "Beginning date and time"
msgstr "Date et heure de début" msgstr "Date et heure de début"
#: cfp/models.py:328 #: cfp/models.py:331
msgid "Duration (min)" msgid "Duration (min)"
msgstr "Durée (min)" msgstr "Durée (min)"
#: cfp/models.py:332 #: cfp/models.py:335
msgid "" msgid ""
"You can use this field to share some materials related to your intervention." "You can use this field to share some materials related to your intervention."
msgstr "" msgstr ""
"Vous pouvez utiliser ce champs pour partager les supports de votre " "Vous pouvez utiliser ce champs pour partager les supports de votre "
"intervention." "intervention."
#: cfp/models.py:361 #: cfp/models.py:364
msgid "Waiting confirmation" msgid "Waiting confirmation"
msgstr "En attente de confirmation" msgstr "En attente de confirmation"
#: cfp/models.py:363 #: cfp/models.py:366
msgid "Refused" msgid "Refused"
msgstr "Refusé" msgstr "Refusé"
#: cfp/models.py:365 #: cfp/models.py:368
#, python-format #, python-format
msgid "Pending decision, score: %(score).1f" msgid "Pending decision, score: %(score).1f"
msgstr "En cours, score : %(score).1f" msgstr "En cours, score : %(score).1f"
#: cfp/models.py:422 #: cfp/models.py:425
msgid "Your Name" msgid "Your Name"
msgstr "Votre Nom" msgstr "Votre Nom"
#: cfp/models.py:426 #: cfp/models.py:429
msgid "SMS prefered" msgid "SMS prefered"
msgstr "SMS préférés" msgstr "SMS préférés"
#: cfp/models.py:429 #: cfp/models.py:432
msgid "If you have some constraints, you can indicate them here." msgid "If you have some constraints, you can indicate them here."
msgstr "Si vous avez des contraintes, vous pouvez les indiquer ici." msgstr "Si vous avez des contraintes, vous pouvez les indiquer ici."
#: cfp/models.py:448 cfp/templates/cfp/staff/volunteer_details.html:8 #: cfp/models.py:457 cfp/templates/cfp/staff/volunteer_details.html:8
msgid "Volunteer" msgid "Volunteer"
msgstr "Bénévole" msgstr "Bénévole"
#: cfp/models.py:453 cfp/templates/cfp/staff/volunteer_details.html:25 #: cfp/models.py:462 cfp/templates/cfp/staff/volunteer_details.html:27
#: cfp/templates/cfp/staff/volunteer_list.html:32 #: cfp/templates/cfp/staff/volunteer_list.html:32
msgid "Activities" msgid "Activities"
msgstr "Activités" msgstr "Activités"
@ -430,19 +428,41 @@ msgid "Please select a category."
msgstr "Veuillez sélectionner une catégorie." msgstr "Veuillez sélectionner une catégorie."
#: cfp/templates/cfp/admin/conference.html:13 #: cfp/templates/cfp/admin/conference.html:13
#: cfp/templates/cfp/staff/create_user.html:8 #: cfp/templates/cfp/admin/create_user.html:8
msgid "Add a new user" msgid "Add a new user"
msgstr "Ajouter un nouvel utilisateur" msgstr "Ajouter un nouvel utilisateur"
#: cfp/templates/cfp/admin/conference.html:14 #: cfp/templates/cfp/admin/conference.html:14
#: cfp/templates/cfp/proposal_home.html:28 #: cfp/templates/cfp/admin/create_user.html:13
#: cfp/templates/cfp/proposal_home.html:30
#: cfp/templates/cfp/proposal_mail_token.html:25 #: cfp/templates/cfp/proposal_mail_token.html:25
#: cfp/templates/cfp/proposal_speaker_form.html:48 #: cfp/templates/cfp/proposal_speaker_form.html:49
#: cfp/templates/cfp/proposal_talk_form.html:28 #: cfp/templates/cfp/proposal_talk_form.html:28
#: cfp/templates/cfp/staff/create_user.html:13
msgid "Save" msgid "Save"
msgstr "Envoyer" msgstr "Envoyer"
#: cfp/templates/cfp/admin/create_user.html:14
#: cfp/templates/cfp/staff/talk_decide.html:22 ponyconf/templates/_form.html:16
msgid "Cancel"
msgstr "Annuler"
#: cfp/templates/cfp/closed.html:9 cfp/templates/cfp/proposal_home.html:12
msgid "Participate"
msgstr "Participer"
#: cfp/templates/cfp/closed.html:13
msgid "Sorry, the Call for Participation is closed!"
msgstr "Désolé, lappel à participation est fermé !"
#: cfp/templates/cfp/closed.html:16
#, python-format
msgid ""
"If you already have submitted a talk and you want to edit it, please click "
"<a href=\"%(mail_token_url)s\">here</a>."
msgstr ""
"Si vous avez déjà soumis une proposition et que vous souhaitez léditer, "
"cliquez <a href=\"%(mail_token_url)s\">ici</a>."
#: cfp/templates/cfp/proposal_dashboard.html:11 #: cfp/templates/cfp/proposal_dashboard.html:11
#, python-format #, python-format
msgid "Welcome <b>%(name)s</b>!" msgid "Welcome <b>%(name)s</b>!"
@ -494,6 +514,7 @@ msgstr "Mastodon :"
#: cfp/templates/cfp/proposal_dashboard.html:29 #: cfp/templates/cfp/proposal_dashboard.html:29
#: cfp/templates/cfp/staff/participant_details.html:33 #: cfp/templates/cfp/staff/participant_details.html:33
#: cfp/templates/cfp/staff/volunteer_details.html:14
msgid "Phone number:" msgid "Phone number:"
msgstr "Numéro de téléphone :" msgstr "Numéro de téléphone :"
@ -533,16 +554,12 @@ msgstr "annulé"
msgid "No proposals." msgid "No proposals."
msgstr "Aucune proposition." msgstr "Aucune proposition."
#: cfp/templates/cfp/proposal_dashboard.html:75 #: cfp/templates/cfp/proposal_dashboard.html:76
#: cfp/templates/cfp/proposal_talk_details.html:17 #: cfp/templates/cfp/proposal_talk_details.html:18
msgid "New proposal" msgid "New proposal"
msgstr "Nouvelle proposition" msgstr "Nouvelle proposition"
#: cfp/templates/cfp/proposal_home.html:12 #: cfp/templates/cfp/proposal_home.html:22
msgid "Participate"
msgstr "Participer"
#: cfp/templates/cfp/proposal_home.html:21
#, python-format #, python-format
msgid "" msgid ""
"If you already have submitted a talk and you want to edit it or submit " "If you already have submitted a talk and you want to edit it or submit "
@ -569,7 +586,7 @@ msgid "Edit a speaker"
msgstr "Éditer un orateur" msgstr "Éditer un orateur"
#: cfp/templates/cfp/proposal_speaker_form.html:15 #: cfp/templates/cfp/proposal_speaker_form.html:15
#: cfp/templates/cfp/proposal_talk_details.html:69 #: cfp/templates/cfp/proposal_talk_details.html:71
msgid "Add a co-speaker" msgid "Add a co-speaker"
msgstr "Ajouter un co-intervenant" msgstr "Ajouter un co-intervenant"
@ -585,58 +602,58 @@ msgstr "Vous souhaitez peut-être ajouter un des intervenants suivants :"
msgid "My profile" msgid "My profile"
msgstr "Mon profil" msgstr "Mon profil"
#: cfp/templates/cfp/proposal_talk_details.html:20 #: cfp/templates/cfp/proposal_talk_details.html:22
msgid "Edit this proposal" msgid "Edit this proposal"
msgstr "Éditer cette proposition" msgstr "Éditer cette proposition"
#: cfp/templates/cfp/proposal_talk_details.html:26 #: cfp/templates/cfp/proposal_talk_details.html:28
#: cfp/templates/cfp/staff/talk_details.html:18 #: cfp/templates/cfp/staff/talk_details.html:18
#: cfp/templates/cfp/staff/talk_list.html:48 #: cfp/templates/cfp/staff/talk_list.html:48
msgid "Status" msgid "Status"
msgstr "Statut" msgstr "Statut"
#: cfp/templates/cfp/proposal_talk_details.html:29 #: cfp/templates/cfp/proposal_talk_details.html:31
msgid "Reviewing in progress, we will keep you informed by mail." msgid "Reviewing in progress, we will keep you informed by mail."
msgstr "Relecture en cours, nous vous tenons informé par e-mail." msgstr "Relecture en cours, nous vous tenons informé par e-mail."
#: cfp/templates/cfp/proposal_talk_details.html:31 #: cfp/templates/cfp/proposal_talk_details.html:33
msgid "Accepted!" msgid "Accepted!"
msgstr "Accepté !" msgstr "Accepté !"
#: cfp/templates/cfp/proposal_talk_details.html:34 #: cfp/templates/cfp/proposal_talk_details.html:36
msgid "Please confirm your participation:" msgid "Please confirm your participation:"
msgstr "Merci de confirmer votre participation :" msgstr "Merci de confirmer votre participation :"
#: cfp/templates/cfp/proposal_talk_details.html:35 #: cfp/templates/cfp/proposal_talk_details.html:37
msgid "I will be there!" msgid "I will be there!"
msgstr "Je serai là !" msgstr "Je serai là !"
#: cfp/templates/cfp/proposal_talk_details.html:36 #: cfp/templates/cfp/proposal_talk_details.html:38
msgid "Sorry, couldn't make it :-(" msgid "Sorry, couldn't make it :-("
msgstr "Désolé, jai un contre temps :-(" msgstr "Désolé, jai un contre temps :-("
#: cfp/templates/cfp/proposal_talk_details.html:40 #: cfp/templates/cfp/proposal_talk_details.html:42
msgid "Sorry, I have to cancel." msgid "Sorry, I have to cancel."
msgstr "Désolé, je dois annuler." msgstr "Désolé, je dois annuler."
#: cfp/templates/cfp/proposal_talk_details.html:44 #: cfp/templates/cfp/proposal_talk_details.html:46
msgid "Good news, I finally could be there!" msgid "Good news, I finally could be there!"
msgstr "Bonne nouvelle, je peux finalement être présent !" msgstr "Bonne nouvelle, je peux finalement être présent !"
#: cfp/templates/cfp/proposal_talk_details.html:48 #: cfp/templates/cfp/proposal_talk_details.html:50
msgid "Sorry, refused :-(" msgid "Sorry, refused :-("
msgstr "Désolé, refusé :-(" msgstr "Désolé, refusé :-("
#: cfp/templates/cfp/proposal_talk_details.html:59 #: cfp/templates/cfp/proposal_talk_details.html:61
msgid "you!" msgid "you!"
msgstr "vous !" msgstr "vous !"
#: cfp/templates/cfp/proposal_talk_details.html:62 #: cfp/templates/cfp/proposal_talk_details.html:64
msgid "remove" msgid "remove"
msgstr "supprimer" msgstr "supprimer"
#: cfp/templates/cfp/proposal_talk_details.html:79 #: cfp/templates/cfp/proposal_talk_details.html:81
#: cfp/templates/cfp/proposal_talk_details.html:89 #: cfp/templates/cfp/proposal_talk_details.html:91
#: cfp/templates/cfp/staff/talk_details.html:66 #: cfp/templates/cfp/staff/talk_details.html:66
msgid "No description provided." msgid "No description provided."
msgstr "Aucune description fournie." msgstr "Aucune description fournie."
@ -676,11 +693,6 @@ msgstr "Sessions"
msgid "Rooms" msgid "Rooms"
msgstr "Salles" msgstr "Salles"
#: cfp/templates/cfp/staff/create_user.html:14
#: cfp/templates/cfp/staff/talk_decide.html:22 ponyconf/templates/_form.html:16
msgid "Cancel"
msgstr "Annuler"
#: cfp/templates/cfp/staff/participant_details.html:10 #: cfp/templates/cfp/staff/participant_details.html:10
msgid "VIP" msgid "VIP"
msgstr "VIP" msgstr "VIP"
@ -699,6 +711,7 @@ msgid "Language:"
msgstr "Langue :" msgstr "Langue :"
#: cfp/templates/cfp/staff/participant_details.html:35 #: cfp/templates/cfp/staff/participant_details.html:35
#: cfp/templates/cfp/staff/volunteer_details.html:17
msgid "Secret link:" msgid "Secret link:"
msgstr "Lien secret :" msgstr "Lien secret :"
@ -964,11 +977,15 @@ msgstr "responsable"
msgid "No tracks." msgid "No tracks."
msgstr "Aucune session." msgstr "Aucune session."
#: cfp/templates/cfp/staff/volunteer_details.html:29 #: cfp/templates/cfp/staff/volunteer_details.html:11
msgid "Email:"
msgstr "E-mail :"
#: cfp/templates/cfp/staff/volunteer_details.html:31
msgid "The volunteer applied for following activities:" msgid "The volunteer applied for following activities:"
msgstr "Le bénévole s'est proposé pour les activités suivantes :" msgstr "Le bénévole s'est proposé pour les activités suivantes :"
#: cfp/templates/cfp/staff/volunteer_details.html:39 #: cfp/templates/cfp/staff/volunteer_details.html:41
msgid "The volunteer does not applied for any activities." msgid "The volunteer does not applied for any activities."
msgstr "Le bénévole ne sest proposé pour aucune activité." msgstr "Le bénévole ne sest proposé pour aucune activité."
@ -1006,7 +1023,7 @@ msgstr ""
msgid "We are looking for help with the following activities:" msgid "We are looking for help with the following activities:"
msgstr "Nous cherchons de laide pour les activités suivantes :" msgstr "Nous cherchons de laide pour les activités suivantes :"
#: cfp/views.py:49 #: cfp/views.py:50
msgid "" msgid ""
"Hi {},\n" "Hi {},\n"
"\n" "\n"
@ -1034,26 +1051,26 @@ msgstr ""
"{}\n" "{}\n"
"\n" "\n"
#: cfp/views.py:69 #: cfp/views.py:70
msgid "Thank you for your help!" msgid "Thank you for your help!"
msgstr "Merci pour votre aide !" msgstr "Merci pour votre aide !"
#: cfp/views.py:74 #: cfp/views.py:75
msgid "" msgid ""
"Thank you for your participation! You can now subscribe to some activities." "Thank you for your participation! You can now subscribe to some activities."
msgstr "" msgstr ""
"Merci pour votre participation ! Vous pouvez maintenant vous inscrire à une " "Merci pour votre participation ! Vous pouvez maintenant vous inscrire à une "
"ou plusieurs activités." "ou plusieurs activités."
#: cfp/views.py:98 #: cfp/views.py:97
msgid "Thank you for your participation!" msgid "Thank you for your participation!"
msgstr "Merci pour votre participation !" msgstr "Merci pour votre participation !"
#: cfp/views.py:102 #: cfp/views.py:101
msgid "Okay, no problem!" msgid "Okay, no problem!"
msgstr "Ok, pas de soucis !" msgstr "Ok, pas de soucis !"
#: cfp/views.py:160 #: cfp/views.py:173
msgid "" msgid ""
"Hi {},\n" "Hi {},\n"
"\n" "\n"
@ -1093,15 +1110,15 @@ msgstr ""
"{}\n" "{}\n"
"\n" "\n"
#: cfp/views.py:190 cfp/views.py:274 #: cfp/views.py:203 cfp/views.py:287
msgid "You proposition have been successfully submitted!" msgid "You proposition have been successfully submitted!"
msgstr "Votre proposition a été transmise avec succès !" msgstr "Votre proposition a été transmise avec succès !"
#: cfp/views.py:204 #: cfp/views.py:217
msgid "Sorry, we do not know this email." msgid "Sorry, we do not know this email."
msgstr "Désolé, nous ne connaissons pas cette e-mail." msgstr "Désolé, nous ne connaissons pas cette e-mail."
#: cfp/views.py:209 #: cfp/views.py:222
msgid "" msgid ""
"Hi {},\n" "Hi {},\n"
"\n" "\n"
@ -1132,41 +1149,41 @@ msgstr ""
"{}\n" "{}\n"
"\n" "\n"
#: cfp/views.py:229 #: cfp/views.py:242
msgid "A email have been sent with a link to access to your profil." 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." msgstr "Un e-mail vous a été envoyé avec un lien pour accéder à votre profil."
#: cfp/views.py:270 cfp/views.py:336 #: cfp/views.py:283 cfp/views.py:356
msgid "Changes saved." msgid "Changes saved."
msgstr "Modifications sauvegardées." msgstr "Modifications sauvegardées."
#: cfp/views.py:291 #: cfp/views.py:304
msgid "You already confirmed your participation to this talk." msgid "You already confirmed your participation to this talk."
msgstr "Vous avez déjà confirmé votre participation à cet exposé." msgstr "Vous avez déjà confirmé votre participation à cet exposé."
#: cfp/views.py:293 #: cfp/views.py:306
msgid "You already cancelled your participation to this talk." msgid "You already cancelled your participation to this talk."
msgstr "Vous avez déjà annulé votre participation à cet exposé." msgstr "Vous avez déjà annulé votre participation à cet exposé."
#: cfp/views.py:298 #: cfp/views.py:311
msgid "Your participation has been taken into account, thank you!" msgid "Your participation has been taken into account, thank you!"
msgstr "Votre participation a été prise en compte, merci !" msgstr "Votre participation a été prise en compte, merci !"
#: cfp/views.py:299 #: cfp/views.py:312
#, python-format #, python-format
msgid "Speaker %(speaker)s confirmed his/her participation." msgid "Speaker %(speaker)s confirmed his/her participation."
msgstr "Lintervenant %(speaker)s a confirmé sa participation." msgstr "Lintervenant %(speaker)s a confirmé sa participation."
#: cfp/views.py:301 #: cfp/views.py:314
msgid "We have noted your unavailability." msgid "We have noted your unavailability."
msgstr "Nous avons enregistré votre indisponibilité." msgstr "Nous avons enregistré votre indisponibilité."
#: cfp/views.py:302 #: cfp/views.py:315
#, python-format #, python-format
msgid "Speaker %(speaker)s CANCELLED his/her participation." msgid "Speaker %(speaker)s CANCELLED his/her participation."
msgstr "Lintervenant %(speaker)s a ANNULÉ sa participation." msgstr "Lintervenant %(speaker)s a ANNULÉ sa participation."
#: cfp/views.py:343 #: cfp/views.py:363
msgid "" msgid ""
"Hi {},\n" "Hi {},\n"
"\n" "\n"
@ -1206,59 +1223,59 @@ msgstr ""
"{}\n" "{}\n"
"\n" "\n"
#: cfp/views.py:374 cfp/views.py:393 #: cfp/views.py:394 cfp/views.py:414
msgid "Co-speaker successfully added to the talk." msgid "Co-speaker successfully added to the talk."
msgstr "Co-intervenant ajouté à lexposé avec succès." msgstr "Co-intervenant ajouté à lexposé avec succès."
#: cfp/views.py:406 #: cfp/views.py:427
msgid "Co-speaker successfully removed from the talk." msgid "Co-speaker successfully removed from the talk."
msgstr "Co-intervenant supprimé de lexposé avec succès." msgstr "Co-intervenant supprimé de lexposé avec succès."
#: cfp/views.py:448 #: cfp/views.py:469
msgid "The speaker confirmation have been noted." msgid "The speaker confirmation have been noted."
msgstr "La confirmation de lorateur a été notée." msgstr "La confirmation de lorateur a été notée."
#: cfp/views.py:449 #: cfp/views.py:470
msgid "The talk have been confirmed." msgid "The talk have been confirmed."
msgstr "Lexposé a été confirmé." msgstr "Lexposé a été confirmé."
#: cfp/views.py:451 #: cfp/views.py:472
msgid "The speaker unavailability have been noted." msgid "The speaker unavailability have been noted."
msgstr "Lindisponibilité de lintervenant a été notée." msgstr "Lindisponibilité de lintervenant a été notée."
#: cfp/views.py:452 #: cfp/views.py:473
msgid "The talk have been cancelled." msgid "The talk have been cancelled."
msgstr "Lexposé a été annulé." msgstr "Lexposé a été annulé."
#: cfp/views.py:527 cfp/views.py:629 #: cfp/views.py:548 cfp/views.py:650
msgid "The talk has been accepted." msgid "The talk has been accepted."
msgstr "Lexposé a été accepté." msgstr "Lexposé a été accepté."
#: cfp/views.py:529 cfp/views.py:631 #: cfp/views.py:550 cfp/views.py:652
msgid "The talk has been declined." msgid "The talk has been declined."
msgstr "Lexposé a été décliné." msgstr "Lexposé a été décliné."
#: cfp/views.py:598 cfp/views.py:691 #: cfp/views.py:619 cfp/views.py:712
msgid "Message sent!" msgid "Message sent!"
msgstr "Message envoyé !" msgstr "Message envoyé !"
#: cfp/views.py:612 #: cfp/views.py:633
msgid "Vote successfully created" msgid "Vote successfully created"
msgstr "A voté !" msgstr "A voté !"
#: cfp/views.py:612 #: cfp/views.py:633
msgid "Vote successfully updated" msgid "Vote successfully updated"
msgstr "Vote mis à jour" msgstr "Vote mis à jour"
#: cfp/views.py:633 #: cfp/views.py:654
msgid "Decision taken in account" msgid "Decision taken in account"
msgstr "Décision enregistrée" msgstr "Décision enregistrée"
#: cfp/views.py:719 #: cfp/views.py:747
msgid "[{}] You have been added to the staff team" msgid "[{}] You have been added to the staff team"
msgstr "[{}] Vous avez été ajouté aux membres du staff" msgstr "[{}] Vous avez été ajouté aux membres du staff"
#: cfp/views.py:720 #: cfp/views.py:748
msgid "" msgid ""
"Hi {},\n" "Hi {},\n"
"\n" "\n"
@ -1282,15 +1299,15 @@ msgstr ""
"{}\n" "{}\n"
"\n" "\n"
#: cfp/views.py:741 #: cfp/views.py:769
msgid "Modifications successfully saved." msgid "Modifications successfully saved."
msgstr "Modification enregistrée avec succès." msgstr "Modification enregistrée avec succès."
#: cfp/views.py:818 #: cfp/views.py:846
msgid "User created successfully." msgid "User created successfully."
msgstr "Utilisateur créé avec succès." msgstr "Utilisateur créé avec succès."
#: cfp/views.py:839 #: cfp/views.py:867
#, python-format #, python-format
msgid "Format '%s' not available" msgid "Format '%s' not available"
msgstr "Format '%s' non disponible" msgstr "Format '%s' non disponible"
@ -1372,9 +1389,6 @@ msgstr "Changement de mot de passe"
msgid "Email address" msgid "Email address"
msgstr "Adresse e-mail" msgstr "Adresse e-mail"
#~ msgid "Sorry, the Call for Participation is closed!"
#~ msgstr "Désolé, lappel à participation est fermé !"
#~ msgid "Your proposition have been successfully submitted!" #~ msgid "Your proposition have been successfully submitted!"
#~ msgstr "Votre proposition a été transmise avec succès !" #~ msgstr "Votre proposition a été transmise avec succès !"