From da785bd510aa25d4a159d3fcf3ef22e3673d263b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=89lie=20Bouttier?=
Date: Mon, 6 Nov 2017 21:47:31 +0100
Subject: [PATCH] volunteers: link to user
---
cfp/decorators.py | 16 +-
cfp/models.py | 5 +-
.../cfp/staff/volunteer_details.html | 6 +-
cfp/templates/cfp/volunteer.html | 4 +-
cfp/urls.py | 6 +-
cfp/views.py | 16 +-
locale/fr/LC_MESSAGES/django.mo | Bin 21786 -> 22215 bytes
locale/fr/LC_MESSAGES/django.po | 250 +++++++++---------
8 files changed, 165 insertions(+), 138 deletions(-)
diff --git a/cfp/decorators.py b/cfp/decorators.py
index ffab13f..c952ecd 100644
--- a/cfp/decorators.py
+++ b/cfp/decorators.py
@@ -5,7 +5,7 @@ from django.shortcuts import get_object_or_404
from functools import wraps
from cfp.utils import is_staff
-from cfp.models import Participant
+from cfp.models import Participant, Volunteer
def speaker_required(view_func):
@@ -22,6 +22,20 @@ def speaker_required(view_func):
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 _is_staff(request, *args, **kwargs):
if not request.user.is_authenticated():
diff --git a/cfp/models.py b/cfp/models.py
index 67b1be9..42bbb69 100644
--- a/cfp/models.py
+++ b/cfp/models.py
@@ -115,7 +115,6 @@ class Participant(PonyConfModel):
objects = ParticipantManager()
-
def get_absolute_url(self):
return reverse('participant-details', kwargs=dict(participant_id=self.token))
@@ -434,10 +433,10 @@ class Volunteer(PonyConfModel):
conversation = models.OneToOneField(MessageThread)
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):
- url = reverse('volunteer-home', kwargs={'volunteer_id': self.token})
+ url = reverse('volunteer-home', kwargs=dict(volunteer_token=self.token))
if full:
url = ('https' if self.site.conference.secure_domain else 'http') + '://' + self.site.domain + url
return url
diff --git a/cfp/templates/cfp/staff/volunteer_details.html b/cfp/templates/cfp/staff/volunteer_details.html
index 650c183..1c37e43 100644
--- a/cfp/templates/cfp/staff/volunteer_details.html
+++ b/cfp/templates/cfp/staff/volunteer_details.html
@@ -8,12 +8,14 @@
{% trans "Volunteer" %} {{ volunteer.name }}
- - {% trans "Email" %}
+ - {% trans "Email:" %}
- {{ volunteer.email }}
{% if volunteer.phone_number %}
- - {% trans "Phone number" %}
+ - {% trans "Phone number:" %}
- {{ volunteer.phone_number }}{% if volunteer.sms_prefered %} (SMS){% endif %}
{% endif %}
+ - {% trans "Secret link:" %}
+ - {{ volunteer.token }}
{% if volunteer.notes %}
diff --git a/cfp/templates/cfp/volunteer.html b/cfp/templates/cfp/volunteer.html
index 572e3ed..7aa404c 100644
--- a/cfp/templates/cfp/volunteer.html
+++ b/cfp/templates/cfp/volunteer.html
@@ -16,9 +16,9 @@
{{ activity.description }}
{% if volunteer not in activity.volunteers.all %}
- {% trans "I will be happy to help on that!" %}
+ {% trans "I will be happy to help on that!" %}
{% else %}
- {% trans "Sorry, I have a setback" %}
+ {% trans "Sorry, I have a setback" %}
{% endif %}
diff --git a/cfp/urls.py b/cfp/urls.py
index c096d03..2ad41ec 100644
--- a/cfp/urls.py
+++ b/cfp/urls.py
@@ -28,9 +28,9 @@ urlpatterns = [
url(r'^cfp/(?P[\w\-]+)/(?P[\w\-]+)/desist/$', views.talk_acknowledgment, {'confirm': False}, name='talk-desist'),
# End backward compatibility
url(r'^volunteer/$', views.volunteer_enrole, name='volunteer-enrole'),
- url(r'^volunteer/(?P[\w\-]+)/$', views.volunteer_home, name='volunteer-home'),
- url(r'^volunteer/(?P[\w\-]+)/join/(?P[\w\-]+)/$', views.volunteer_update_activity, {'join': True}, name='volunteer-join'),
- url(r'^volunteer/(?P[\w\-]+)/quit/(?P[\w\-]+)/$', views.volunteer_update_activity, {'join': False}, name='volunteer-quit'),
+ url(r'^volunteer/(?P[\w\-]+)/$', views.volunteer_home, name='volunteer-home'),
+ url(r'^volunteer/(?P[\w\-]+)/join/(?P[\w\-]+)/$', views.volunteer_update_activity, {'join': True}, name='volunteer-join'),
+ url(r'^volunteer/(?P[\w\-]+)/quit/(?P[\w\-]+)/$', views.volunteer_update_activity, {'join': False}, name='volunteer-quit'),
#url(r'^talk/(?P[\w\-]+)/$', views.talk_show, name='show-talk'),
#url(r'^speaker/(?P[\w\-]+)/$', views.speaker_show, name='show-speaker'),
url(r'^staff/$', views.staff, name='staff'),
diff --git a/cfp/views.py b/cfp/views.py
index a95f4ff..7f29d88 100644
--- a/cfp/views.py
+++ b/cfp/views.py
@@ -21,7 +21,7 @@ from functools import reduce
from mailing.models import Message
from mailing.forms import MessageForm
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 .utils import is_staff
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)],
)
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', {
'activities': Activity.objects.filter(site=request.conference.site),
'form': form,
})
-def volunteer_home(request, volunteer_id):
- volunteer = get_object_or_404(Volunteer, token=volunteer_id, site=request.conference.site)
+@volunteer_required
+def volunteer_home(request, volunteer):
return render(request, 'cfp/volunteer.html', {
'activities': Activity.objects.filter(site=request.conference.site),
'volunteer': volunteer,
})
-def volunteer_update_activity(request, volunteer_id, activity, join):
- if not request.conference.volunteers_enrollment_is_open():
- raise PermissionDenied
- volunteer = get_object_or_404(Volunteer, token=volunteer_id, site=request.conference.site)
+@volunteer_required
+def volunteer_update_activity(request, volunteer, activity, join):
activity = get_object_or_404(Activity, slug=activity, site=request.conference.site)
if join:
activity.volunteers.add(volunteer)
@@ -101,7 +99,7 @@ def volunteer_update_activity(request, volunteer_id, activity, join):
activity.volunteers.remove(volunteer)
activity.save()
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
diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo
index 62cf5537c7e6fed2d9cb8525c88498302e07a6dd..39321cf7cd5126e714bab5fbdb45dabae93de56c 100644
GIT binary patch
delta 6060
zcmZ|Td3a7&0>|+avdU(SCB+*=VoxHrprSz#YgMC_(jX)nO)M>nzG=~xu~jU!RB5dh
z3}MDLEuxAUlq#jFQyCrF+LuyV{r=v2GLQZ-_v!EboO8Fc-FxHd;*Y&P-{9pwU*3DZ
zVJqup%oDiO-^_E~H^Wtf
z6)_lVpzhxgImI+XKkSJWY2T#U6S7e~dPRQ#5|fI}@Kt;p3veXH*JA$Pqp+I!ZiVe?8mM{%96AMrsT!Om)3cG(JYG8#}MeqM^Pr;b4
zP*ZXhHKKc{3;m;=sjq~(aRVHJF{qBsM=ixB)RG-XP4#8u1u>=SIj>_4Y)Cy8b^ZX1
zr+t&B0&YWnxqd`{e1sZ-KVKoOaR_SURnZrttc_7q-waD*GOD8~sPlVa8605ELfv-^
zy4BOyD5yvIn1b7I1bQ`aMxKN8#Z0yJO~`-dGk!F}8`fZk#~W+vS(C8|^$d)|`KT}H
zLDcfjdC2zO%w9>ow0;3S??Qw8}}nMBl*
z3_(`WKn|YuN-f
z#n0LLK-5xBLrwJ@)O9OS_bou~=Qi6YsKK4i4zu5S2sM>QZT$vz_2LUC+25X5hUdu4
zK;3W$YKiutUc+-(2XEWsRrv#;C9Z|~o6yKpXZ^cTPzO>`H%Lc4#S^d`E<*iTUXL2d
zKGf8o!WMWDb$xXfG!dh$nW&Dev+lK?L3QK?hUxu(NI_FmfxCI87Ii{x)E}M3sHsiC
zrq~;4(@aI3zYFzH72$9^hgzECmd@+j2i3tWEQ_O2$ETn>jKUmy!WyhXeY33}w)K-3
z$^I*-3oEp8{>;|IAnJ*zCFqXo(6d+`2Utg9Rq9i)A}&Kc8-=Y{e@*31cIXC&P&YVX
z>t|6jQEc~L#YF0Nk!3Y4cophlHb&tBd>TJNJv-%EJ4+Xj)u^YSW@0F+1G%l4e>FUo
z9d$7etKb^cRPRA=9=hAOk^22M{Cf}A@-NX5?CsYVW*$^-&}3gn9`3
zqXwFX4RAJciP`0*FrUH$oPh5>#Xqw!ILR2=G#ju8FQcYS@nG4Rn@uA!=sb%PHsv>ro$u?e>HN_Jm`$eikcnycqRX+{daI*vYw3
zBx(s_Y`q_rral-o6T|RDoQS&5w-~PX{}u&JO=z;yks7GitO2S+?NGd}WDn?^2vN~oF
z*2QzE4wmlXG*}M(s7Ik1Zh}0gCJEKCN$87{Q5~O-ezb2EQwYEh(S-$A6OW*JdW^+d_huvo{{EPckZ*_i
z64mp-ZqC!(5&fyBqee0uHRZXe56V>3$QGbF^gim@ScPTqQw+qzcK<2V!+E_M^REwu
ze|M*WaMXc1=)yLbfiK`>EJ7_!au4S%7=T)$nW&DhMt!=^qn`SQs4r-EPp94zd4o+V
z@+~v-dNTi-fg|kD4IZIJ+M<^;(nQpVI^ihnVe5OXhfwDqxAn6aK>Y%0AU~rEy?Z-v
zLnNxh^-weRl$$~bg)a6$Kh%_sL`~U5Y>4k*Bix4GSd41u5|+iAsOw7e`O{j5puP|F
zurUt7bj(L}_zvoN_wN*V4~>5xXKLyoA2pMXblxn-M7)7<825~GVFs$<9E`_2Ti=FJ
z)DNJR;wtL?L4BQ>jz)Fhd5qEfKbV51Vjh;lC8(Y)Lw!KjqL!clgK;Z{;y%<&oIuUg
zX=^dYQon|JSR%4mq^LB*%p38Cc<;yw^4snv^Al9vx|h0=ZL1}CBhr>zwHL4Wn=>R+3uZT
zeQ3RjKaqbC`eg=@0b~pbq%nO5w2dVXJSG0fq5D&QW|HxCr_j26W$RrrmFUZ-?J{}Z
zQ*wSjf&*k4`Ih{f93pc_5jjk>JXgsca*v!P`ab-k_5YAUCP^WS$gAY>?FyB40TfoF{yH%sMiHlx(#q
zyi5*~^2GnKkx@09$aXS{6p(Dvij-`*2~?am?S{+*xq?GB;;4;*FdYw;6O
zms}tn$w(4HDwEgAUh)^BEr$eqO3u$XTTa9Jq#&j
z(w6IBUcf}spX?yoPLU7DLJ~^`lfRQKWHeb$O12;hzmZVVTOW8Iufn&&a=d*;q-SL(
z6yBDC#e$GC=Oj2cn2&J|I3r%PnuADA?cd;kCd
delta 5863
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
L{0laBsuuJcqt0hs
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index 6b5481c..4ff6439 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-04 20:04+0000\n"
-"PO-Revision-Date: 2017-11-04 21:12+0100\n"
+"POT-Creation-Date: 2017-11-06 20:28+0000\n"
+"PO-Revision-Date: 2017-11-06 21:30+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
@@ -22,7 +22,7 @@ msgstr ""
msgid "Pending decision"
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"
msgstr "Accepté"
@@ -34,15 +34,15 @@ msgstr "Décliné"
msgid "Waiting"
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"
msgstr "Confirmé"
-#: cfp/forms.py:30 cfp/models.py:359
+#: cfp/forms.py:30 cfp/models.py:362
msgid "Cancelled"
msgstr "Annulé"
-#: cfp/forms.py:62 cfp/models.py:452
+#: cfp/forms.py:62 cfp/models.py:461
msgid "Activity"
msgstr "Activité"
@@ -56,7 +56,7 @@ msgstr "Aucune"
msgid "Default duration: %(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
msgid "Category"
msgstr "Catégorie"
@@ -65,16 +65,16 @@ msgstr "Catégorie"
msgid "Title"
msgstr "Titre"
-#: cfp/forms.py:108 cfp/models.py:151 cfp/models.py:447
-#: cfp/templates/cfp/proposal_talk_details.html:73
+#: cfp/forms.py:108 cfp/models.py:154 cfp/models.py:456
+#: 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: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/talk_details.html:78
-#: cfp/templates/cfp/staff/volunteer_details.html:20
+#: cfp/templates/cfp/staff/volunteer_details.html:22
msgid "Notes"
msgstr "Notes"
@@ -82,7 +82,7 @@ msgstr "Notes"
msgid "Visible by speakers"
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_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:331
+#: cfp/forms.py:160 cfp/models.py:334
#: cfp/templates/cfp/staff/talk_details.html:54
msgid "Materials"
msgstr "Supports"
@@ -137,7 +137,7 @@ msgstr "Vidéo"
msgid "Filter talks with / without video"
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"
msgstr "Pas encore assignée"
@@ -161,23 +161,22 @@ msgstr "Assigner à une salle"
msgid "Notify by mail?"
msgstr "Notifier par e-mail ?"
-#: cfp/forms.py:264 cfp/models.py:423
-#: cfp/templates/cfp/staff/volunteer_details.html:11
+#: cfp/forms.py:249 cfp/models.py:426
#: cfp/templates/cfp/staff/volunteer_list.html:30
msgid "Email"
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."
msgstr ""
"Les nouveaux membres du staff seront informés de leur nouveau rôle par "
"courrier électronique."
-#: cfp/forms.py:303
+#: cfp/forms.py:288
msgid "An user with that firstname and that lastname already exists."
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."
msgstr "Un utilisateur avec cet email existe déjà."
@@ -246,7 +245,7 @@ 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: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/volunteer_list.html:29
msgid "Name"
@@ -281,12 +280,11 @@ msgstr "Facebook"
msgid "Mastodon"
msgstr "Mastodon"
-#: cfp/models.py:109 cfp/models.py:425
-#: cfp/templates/cfp/staff/volunteer_details.html:14
+#: cfp/models.py:109 cfp/models.py:428
msgid "Phone number"
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."
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"
msgstr "Orateur invité"
-#: cfp/models.py:203
+#: cfp/models.py:206
msgid "Color"
msgstr "Couleur"
-#: cfp/models.py:235
+#: cfp/models.py:238
msgid "Default duration (min)"
msgstr "Durée par défaut (min)"
-#: cfp/models.py:236
+#: cfp/models.py:239
msgid "Color on program"
msgstr "Couleur sur le programme"
-#: cfp/models.py:237
+#: cfp/models.py:240
msgid "Label on program"
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/participant_list.html:8
#: cfp/templates/cfp/staff/talk_details.html:68
@@ -318,19 +316,19 @@ msgstr "Label dans le xml du programme"
msgid "Speakers"
msgstr "Orateurs"
-#: cfp/models.py:309
+#: cfp/models.py:312
msgid "Talk Title"
msgstr "Titre de la proposition"
-#: cfp/models.py:312
+#: cfp/models.py:315
msgid "Description of your talk"
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"
msgstr "Message aux organisateurs"
-#: cfp/models.py:317
+#: cfp/models.py:320
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 "
@@ -340,67 +338,67 @@ msgstr ""
"votre proposition, comme une vidéo, des slides, n'hésitez pas à les ajouter "
"ici."
-#: cfp/models.py:320
+#: cfp/models.py:323
msgid "Talk Category"
msgstr "Catégorie de proposition"
-#: cfp/models.py:321
+#: cfp/models.py:324
msgid "I'm ok to be recorded on video"
msgstr "J’accepte d’être enregistré en vidéo"
-#: cfp/models.py:323
+#: cfp/models.py:326
msgid "Video licence"
msgstr "Licence vidéo"
-#: cfp/models.py:324
+#: cfp/models.py:327
msgid "I need sound"
msgstr "J’ai besoin de son"
-#: cfp/models.py:327
+#: cfp/models.py:330
msgid "Beginning date and time"
msgstr "Date et heure de début"
-#: cfp/models.py:328
+#: cfp/models.py:331
msgid "Duration (min)"
msgstr "Durée (min)"
-#: cfp/models.py:332
+#: cfp/models.py:335
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:361
+#: cfp/models.py:364
msgid "Waiting confirmation"
msgstr "En attente de confirmation"
-#: cfp/models.py:363
+#: cfp/models.py:366
msgid "Refused"
msgstr "Refusé"
-#: cfp/models.py:365
+#: cfp/models.py:368
#, python-format
msgid "Pending decision, score: %(score).1f"
msgstr "En cours, score : %(score).1f"
-#: cfp/models.py:422
+#: cfp/models.py:425
msgid "Your Name"
msgstr "Votre Nom"
-#: cfp/models.py:426
+#: cfp/models.py:429
msgid "SMS prefered"
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."
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"
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
msgid "Activities"
msgstr "Activités"
@@ -430,19 +428,41 @@ msgid "Please select a category."
msgstr "Veuillez sélectionner une catégorie."
#: 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"
msgstr "Ajouter un nouvel utilisateur"
#: 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_speaker_form.html:48
+#: cfp/templates/cfp/proposal_speaker_form.html:49
#: cfp/templates/cfp/proposal_talk_form.html:28
-#: cfp/templates/cfp/staff/create_user.html:13
msgid "Save"
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é, l’appel à 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 "
+"here."
+msgstr ""
+"Si vous avez déjà soumis une proposition et que vous souhaitez l’éditer, "
+"cliquez ici."
+
#: cfp/templates/cfp/proposal_dashboard.html:11
#, python-format
msgid "Welcome %(name)s!"
@@ -494,6 +514,7 @@ msgstr "Mastodon :"
#: cfp/templates/cfp/proposal_dashboard.html:29
#: cfp/templates/cfp/staff/participant_details.html:33
+#: cfp/templates/cfp/staff/volunteer_details.html:14
msgid "Phone number:"
msgstr "Numéro de téléphone :"
@@ -533,16 +554,12 @@ msgstr "annulé"
msgid "No proposals."
msgstr "Aucune proposition."
-#: cfp/templates/cfp/proposal_dashboard.html:75
-#: cfp/templates/cfp/proposal_talk_details.html:17
+#: cfp/templates/cfp/proposal_dashboard.html:76
+#: cfp/templates/cfp/proposal_talk_details.html:18
msgid "New proposal"
msgstr "Nouvelle proposition"
-#: cfp/templates/cfp/proposal_home.html:12
-msgid "Participate"
-msgstr "Participer"
-
-#: cfp/templates/cfp/proposal_home.html:21
+#: cfp/templates/cfp/proposal_home.html:22
#, python-format
msgid ""
"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"
#: 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"
msgstr "Ajouter un co-intervenant"
@@ -585,58 +602,58 @@ msgstr "Vous souhaitez peut-être ajouter un des intervenants suivants :"
msgid "My profile"
msgstr "Mon profil"
-#: cfp/templates/cfp/proposal_talk_details.html:20
+#: cfp/templates/cfp/proposal_talk_details.html:22
msgid "Edit this proposal"
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_list.html:48
msgid "Status"
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."
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!"
msgstr "Accepté !"
-#: cfp/templates/cfp/proposal_talk_details.html:34
+#: cfp/templates/cfp/proposal_talk_details.html:36
msgid "Please confirm your 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!"
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 :-("
msgstr "Désolé, j’ai 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."
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!"
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 :-("
msgstr "Désolé, refusé :-("
-#: cfp/templates/cfp/proposal_talk_details.html:59
+#: cfp/templates/cfp/proposal_talk_details.html:61
msgid "you!"
msgstr "vous !"
-#: cfp/templates/cfp/proposal_talk_details.html:62
+#: cfp/templates/cfp/proposal_talk_details.html:64
msgid "remove"
msgstr "supprimer"
-#: cfp/templates/cfp/proposal_talk_details.html:79
-#: cfp/templates/cfp/proposal_talk_details.html:89
+#: cfp/templates/cfp/proposal_talk_details.html:81
+#: cfp/templates/cfp/proposal_talk_details.html:91
#: cfp/templates/cfp/staff/talk_details.html:66
msgid "No description provided."
msgstr "Aucune description fournie."
@@ -676,11 +693,6 @@ msgstr "Sessions"
msgid "Rooms"
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
msgid "VIP"
msgstr "VIP"
@@ -699,6 +711,7 @@ msgid "Language:"
msgstr "Langue :"
#: cfp/templates/cfp/staff/participant_details.html:35
+#: cfp/templates/cfp/staff/volunteer_details.html:17
msgid "Secret link:"
msgstr "Lien secret :"
@@ -964,11 +977,15 @@ msgstr "responsable"
msgid "No tracks."
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:"
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."
msgstr "Le bénévole ne s’est proposé pour aucune activité."
@@ -1006,7 +1023,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:49
+#: cfp/views.py:50
msgid ""
"Hi {},\n"
"\n"
@@ -1034,26 +1051,26 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:69
+#: cfp/views.py:70
msgid "Thank you for your help!"
msgstr "Merci pour votre aide !"
-#: cfp/views.py:74
+#: cfp/views.py:75
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:97
msgid "Thank you for your participation!"
msgstr "Merci pour votre participation !"
-#: cfp/views.py:102
+#: cfp/views.py:101
msgid "Okay, no problem!"
msgstr "Ok, pas de soucis !"
-#: cfp/views.py:160
+#: cfp/views.py:173
msgid ""
"Hi {},\n"
"\n"
@@ -1093,15 +1110,15 @@ msgstr ""
"{}\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!"
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."
msgstr "Désolé, nous ne connaissons pas cette e-mail."
-#: cfp/views.py:209
+#: cfp/views.py:222
msgid ""
"Hi {},\n"
"\n"
@@ -1132,41 +1149,41 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:229
+#: cfp/views.py:242
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:270 cfp/views.py:336
+#: cfp/views.py:283 cfp/views.py:356
msgid "Changes saved."
msgstr "Modifications sauvegardées."
-#: cfp/views.py:291
+#: cfp/views.py:304
msgid "You already confirmed your participation to this talk."
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."
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!"
msgstr "Votre participation a été prise en compte, merci !"
-#: cfp/views.py:299
+#: cfp/views.py:312
#, python-format
msgid "Speaker %(speaker)s confirmed his/her participation."
msgstr "L’intervenant %(speaker)s a confirmé sa participation."
-#: cfp/views.py:301
+#: cfp/views.py:314
msgid "We have noted your unavailability."
msgstr "Nous avons enregistré votre indisponibilité."
-#: cfp/views.py:302
+#: cfp/views.py:315
#, python-format
msgid "Speaker %(speaker)s CANCELLED his/her participation."
msgstr "L’intervenant %(speaker)s a ANNULÉ sa participation."
-#: cfp/views.py:343
+#: cfp/views.py:363
msgid ""
"Hi {},\n"
"\n"
@@ -1206,59 +1223,59 @@ msgstr ""
"{}\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."
msgstr "Co-intervenant ajouté à l’exposé avec succès."
-#: cfp/views.py:406
+#: cfp/views.py:427
msgid "Co-speaker successfully removed from the talk."
msgstr "Co-intervenant supprimé de l’exposé avec succès."
-#: cfp/views.py:448
+#: cfp/views.py:469
msgid "The speaker confirmation have been noted."
msgstr "La confirmation de l’orateur a été notée."
-#: cfp/views.py:449
+#: cfp/views.py:470
msgid "The talk have been confirmed."
msgstr "L’exposé a été confirmé."
-#: cfp/views.py:451
+#: cfp/views.py:472
msgid "The speaker unavailability have been noted."
msgstr "L’indisponibilité de l’intervenant a été notée."
-#: cfp/views.py:452
+#: cfp/views.py:473
msgid "The talk have been cancelled."
msgstr "L’exposé 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."
msgstr "L’exposé 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."
msgstr "L’exposé a été décliné."
-#: cfp/views.py:598 cfp/views.py:691
+#: cfp/views.py:619 cfp/views.py:712
msgid "Message sent!"
msgstr "Message envoyé !"
-#: cfp/views.py:612
+#: cfp/views.py:633
msgid "Vote successfully created"
msgstr "A voté !"
-#: cfp/views.py:612
+#: cfp/views.py:633
msgid "Vote successfully updated"
msgstr "Vote mis à jour"
-#: cfp/views.py:633
+#: cfp/views.py:654
msgid "Decision taken in account"
msgstr "Décision enregistrée"
-#: cfp/views.py:719
+#: cfp/views.py:747
msgid "[{}] You have been added to the staff team"
msgstr "[{}] Vous avez été ajouté aux membres du staff"
-#: cfp/views.py:720
+#: cfp/views.py:748
msgid ""
"Hi {},\n"
"\n"
@@ -1282,15 +1299,15 @@ msgstr ""
"{}\n"
"\n"
-#: cfp/views.py:741
+#: cfp/views.py:769
msgid "Modifications successfully saved."
msgstr "Modification enregistrée avec succès."
-#: cfp/views.py:818
+#: cfp/views.py:846
msgid "User created successfully."
msgstr "Utilisateur créé avec succès."
-#: cfp/views.py:839
+#: cfp/views.py:867
#, python-format
msgid "Format '%s' not available"
msgstr "Format '%s' non disponible"
@@ -1372,9 +1389,6 @@ msgstr "Changement de mot de passe"
msgid "Email address"
msgstr "Adresse e-mail"
-#~ msgid "Sorry, the Call for Participation is closed!"
-#~ msgstr "Désolé, l’appel à participation est fermé !"
-
#~ msgid "Your proposition have been successfully submitted!"
#~ msgstr "Votre proposition a été transmise avec succès !"