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 !"