From f68cd740220fac8f3dfa517fadaf95b87a3782b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 1 Aug 2017 01:11:58 +0200 Subject: [PATCH] inform new staff members by email --- cfp/forms.py | 11 +++++++- cfp/views.py | 31 +++++++++++++++++++++-- locale/fr/LC_MESSAGES/django.mo | Bin 18669 -> 19270 bytes locale/fr/LC_MESSAGES/django.po | 43 ++++++++++++++++++++++++++++---- 4 files changed, 77 insertions(+), 8 deletions(-) diff --git a/cfp/forms.py b/cfp/forms.py index 364102f..963ca8c 100644 --- a/cfp/forms.py +++ b/cfp/forms.py @@ -33,7 +33,16 @@ class UsersWidget(ModelSelect2MultipleWidget): search_fields = [ '%s__icontains' % field for field in UserAdmin.search_fields ] -ConferenceForm = modelform_factory(Conference, fields=['name', 'home', 'venue', 'city', 'contact_email', 'staff',], widgets={'staff': UsersWidget(),}) +class ConferenceForm(forms.ModelForm): + class Meta: + model = Conference + fields = ['name', 'home', 'venue', 'city', 'contact_email', 'staff',] + widgets = { + 'staff': UsersWidget(), + } + help_texts = { + 'staff': _('New staff members will be informed of their new position by e-mail.'), + } class CreateUserForm(forms.ModelForm): diff --git a/cfp/views.py b/cfp/views.py index aea9241..8a7740e 100644 --- a/cfp/views.py +++ b/cfp/views.py @@ -203,8 +203,35 @@ def conference(request, conference): form = ConferenceForm(request.POST or None, instance=conference) if request.method == 'POST' and form.is_valid(): - # TODO mail notifications to new staff members - form.save() + old_staff = set(conference.staff.all()) + new_conference = form.save() + new_staff = set(new_conference.staff.all()) + added_staff = new_staff - old_staff + protocol = 'http' if request.is_secure() else 'http' + base_url = protocol+'://'+conference.site.domain + url_login = base_url + reverse('login') + url_password_reset = base_url + reverse('password_reset') + msg_title = _('[{}] You have been added to the staff team').format(conference.name) + msg_body_template = _("""Hi {}, + +You have been added to the staff team. + +You can now: +- login: {} +- reset your password: {} + +{} + +""") + for user in added_staff: + msg_body = msg_body_template.format(user.get_full_name(), url_login, url_password_reset, conference.name) + send_mail( + msg_title, + msg_body, + conference.from_email(), + [user.email], + fail_silently=False, + ) messages.success(request, _('Modifications successfully saved.')) return redirect(reverse('conference')) diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo index 111f7dc7dcd23edd7908b7c42f95878abfafe400..d177466ef380c020c24831e557d9cb2e0caf52f0 100644 GIT binary patch delta 6307 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 YroZ?X3~%e_TW}(IdBuXo>3cnX2Uy!ZivR!s diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 294880a..83b3c40 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-31 21:38+0000\n" +"POT-Creation-Date: 2017-07-31 23:09+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -288,11 +288,16 @@ msgstr "%(name)s a été ajouté aux participants" msgid "%(name)s is already a participant" msgstr "%(name)s est déjà participant" -#: cfp/forms.py:55 +#: cfp/forms.py:44 +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:64 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:60 +#: cfp/forms.py:69 msgid "A user with that email already exists." msgstr "Un utilisateur avec cet email existe déjà." @@ -751,10 +756,38 @@ msgid "Decision taken in account" msgstr "Décision enregistrée" #: cfp/views.py:214 +msgid "[{}] You have been added to the staff team" +msgstr "[{}] Vous avez été ajouté aux membres du staff" + +#: cfp/views.py:215 +msgid "" +"Hi {},\n" +"\n" +"You have been added to the staff team.\n" +"\n" +"You can now:\n" +"- login: {}\n" +"- reset your password: {}\n" +"\n" +"{}\n" +"\n" +msgstr "" +"Bonjour {},\n" +"\n" +"Vous avez été ajouté à l’équipe d’organisation.\n" +"\n" +"Vous pouvez à présent :\n" +"- vous connecter : {}\n" +"- réinitialiser votre mot de passe : {}\n" +"\n" +"{}\n" +"\n" + +#: cfp/views.py:235 msgid "Modifications successfully saved." msgstr "Modification enregistrée avec succès." -#: cfp/views.py:228 +#: cfp/views.py:249 msgid "User created successfully." msgstr "Utilisateur créé avec succès." @@ -873,7 +906,7 @@ msgstr "Mot de passe oublié ?" msgid "Password Change" msgstr "Changement de mot de passe" -#: ponyconf/urls.py:27 +#: ponyconf/urls.py:26 msgid "Email address" msgstr ""