Added mail notifications when registering local user
authorThierry Florac <thierry.florac@onf.fr>
Tue, 31 Mar 2015 17:13:34 +0200
changeset 25 31ad4c01e99e
parent 24 7ed8fb9b132c
child 26 1a7d6f305943
Added mail notifications when registering local user
src/pyams_security/interfaces/notification.py
src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.mo
src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.po
src/pyams_security/locales/pyams_security.pot
src/pyams_security/notification.py
src/pyams_security/plugin/templates/register-info.pt
src/pyams_security/plugin/templates/register-message.pt
src/pyams_security/plugin/userfolder.py
src/pyams_security/views/login.py
src/pyams_security/zmi/notification.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_security/interfaces/notification.py	Tue Mar 31 17:13:34 2015 +0200
@@ -0,0 +1,70 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from zope.annotation.interfaces import IAttributeAnnotatable
+
+# import packages
+from zope.interface import Interface, invariant, Invalid
+from zope.schema import TextLine, Text, Bool, Choice
+
+from pyams_security import _
+
+
+class INotificationSettings(IAttributeAnnotatable):
+    """Mailer notification settings interface"""
+
+    enable_notifications = Bool(title=_("Enable notifications?"),
+                                description=_("If 'no', mail notifications will be disabled"),
+                                required=True,
+                                default=False)
+
+    mailer = Choice(title=_("Mailer utility"),
+                    description=_("Mail delivery utility used to send notifications"),
+                    required=False,
+                    vocabulary="PyAMS mailer utilities")
+
+    @invariant
+    def check_mailer(self):
+        if self.enable_notifications and not self.mailer:
+            raise Invalid(_("Notifications can't be enabled without mailer utility"))
+
+    service_name = TextLine(title=_("Service name"),
+                            description=_("Name of service as defined in registration mail subject"),
+                            required=True)
+
+    service_owner = TextLine(title=_("Service owner"),
+                             description=_("Name of the entity providing this service, which will be visible "
+                                           "in notifications messages"),
+                             required=True)
+
+    sender_name = TextLine(title=_("Sender name"),
+                           description=_("Visible name of registration mail sender"),
+                           required=True)
+
+    sender_email = TextLine(title=_("Sender email"),
+                            description=_("Email address of registration mail sender"),
+                            required=True)
+
+    subject_prefix = TextLine(title=_("Subject prefix"),
+                              description=_("This prefix will be inserted into subject prefix of each notification "
+                                            "message"),
+                              required=False)
+
+    signature = Text(title=_("Email signature"),
+                     description=_("Text displayed in email footer"),
+                     required=False)
Binary file src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.mo has changed
--- a/src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.po	Tue Mar 17 16:02:49 2015 +0100
+++ b/src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.po	Tue Mar 31 17:13:34 2015 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2015-03-03 16:44+0100\n"
+"POT-Creation-Date: 2015-03-31 16:39+0200\n"
 "PO-Revision-Date: 2015-02-18 22:19+0100\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French\n"
@@ -86,6 +86,7 @@
 msgstr "Propriétés..."
 
 #: src/pyams_security/zmi/utility.py:185
+#: src/pyams_security/zmi/notification.py:58
 #: src/pyams_security/zmi/plugin/social.py:79
 #: src/pyams_security/zmi/plugin/userfolder.py:76
 #: src/pyams_security/zmi/plugin/group.py:72
@@ -119,6 +120,14 @@
 msgid "Given plug-in name doesn't exist!"
 msgstr "Le module indiqué n'existe pas !"
 
+#: src/pyams_security/zmi/notification.py:45
+msgid "Notifications..."
+msgstr "Notifications..."
+
+#: src/pyams_security/zmi/notification.py:59
+msgid "Notifications properties"
+msgstr "Paramétrage des notifications"
+
 #: src/pyams_security/zmi/security.py:41
 msgid "Access rules..."
 msgstr "Règles d'accès..."
@@ -794,16 +803,161 @@
 "Vous ne pouvez pas activer les fonctions d'inscription libre sans "
 "sélectionner de dossier de stockage des utilisateurs"
 
+#: src/pyams_security/interfaces/notification.py:31
+msgid "Enable notifications?"
+msgstr "Activer les notifications ?"
+
+#: src/pyams_security/interfaces/notification.py:32
+msgid "If 'no', mail notifications will be disabled"
+msgstr "Si 'non', les notifications par mail seront désactivées"
+
+#: src/pyams_security/interfaces/notification.py:36
+msgid "Mailer utility"
+msgstr "Outil de messagerie"
+
+#: src/pyams_security/interfaces/notification.py:37
+msgid "Mail delivery utility used to send notifications"
+msgstr "Nom de l'outil d'envoi de mail utilisé pour les notifications"
+
+#: src/pyams_security/interfaces/notification.py:46
+msgid "Service name"
+msgstr "Nom du service"
+
+#: src/pyams_security/interfaces/notification.py:47
+msgid "Name of service as defined in registration mail subject"
+msgstr "Ce nom sera inscrit dans le sujet des messages de notification"
+
+#: src/pyams_security/interfaces/notification.py:50
+msgid "Service owner"
+msgstr "Propriétaire du service"
+
+#: src/pyams_security/interfaces/notification.py:51
+msgid ""
+"Name of the entity providing this service, which will be visible in "
+"notifications messages"
+msgstr ""
+"Nom de l'entité fournissant ce service, qui sera indiqué dans les messages "
+"de notifications"
+
+#: src/pyams_security/interfaces/notification.py:55
+msgid "Sender name"
+msgstr "Nom d'expéditeur"
+
+#: src/pyams_security/interfaces/notification.py:56
+msgid "Visible name of registration mail sender"
+msgstr "Nom de l'expéditeur des messages de notifications"
+
+#: src/pyams_security/interfaces/notification.py:59
+msgid "Sender email"
+msgstr "Adresse de l'expéditeur"
+
+#: src/pyams_security/interfaces/notification.py:60
+msgid "Email address of registration mail sender"
+msgstr "Nom de l'adresse d'expédition des messages de notifications"
+
+#: src/pyams_security/interfaces/notification.py:63
+msgid "Subject prefix"
+msgstr "Préfixe des sujets"
+
+#: src/pyams_security/interfaces/notification.py:64
+msgid ""
+"This prefix will be inserted into subject prefix of each notification message"
+msgstr "Ce préfixe sera inséré au début du sujet des messages de notification"
+
+#: src/pyams_security/interfaces/notification.py:68
+msgid "Email signature"
+msgstr "Signature"
+
+#: src/pyams_security/interfaces/notification.py:69
+msgid "Text displayed in email footer"
+msgstr "Ce texte sera affiché en pied des messages"
+
+#: src/pyams_security/interfaces/notification.py:44
+msgid "Notifications can't be enabled without mailer utility"
+msgstr ""
+"Les notifications ne peuvent pas être activées si vous ne séletionnez pas un "
+"outil d'envoi de messages"
+
 #: src/pyams_security/plugin/http.py:44
 msgid "HTTP Basic credentials"
 msgstr "Authentification HTTP Basic"
 
-#: src/pyams_security/plugin/userfolder.py:106
-#: src/pyams_security/plugin/userfolder.py:111
+#: src/pyams_security/plugin/userfolder.py:115
+#: src/pyams_security/plugin/userfolder.py:120
 msgid "Can't activate profile with given params!"
 msgstr ""
 "Impossible de confirmer votre inscription avec les paramètres fournis !"
 
+#: src/pyams_security/plugin/userfolder.py:249
+#, python-format
+msgid "{prefix}Please confirm registration"
+msgstr "{prefix}Veuillez confirmer votre inscription"
+
+#: src/pyams_security/plugin/templates/register-info.pt:7
+msgid "${header} Registration notice"
+msgstr "${header} Inscription effectuée"
+
+#: src/pyams_security/plugin/templates/register-info.pt:11
+#: src/pyams_security/plugin/templates/register-message.pt:11
+msgid "Hello,"
+msgstr "Bonjour,"
+
+#: src/pyams_security/plugin/templates/register-info.pt:12
+#: src/pyams_security/plugin/templates/register-message.pt:12
+msgid "${service_name} is a service provided by ${service_owner}."
+msgstr "${service_name} est un service fourni par ${service_owner}."
+
+#: src/pyams_security/plugin/templates/register-info.pt:14
+msgid ""
+"A new account has been created for your email address, that you may confirm "
+"before being able to use the service."
+msgstr ""
+"Un nouveau compte a été créé pour votre adresse de messagerie, que vous devez confirmer "
+"avant de pouvoir utiliser ce service."
+
+#: src/pyams_security/plugin/templates/register-info.pt:16
+msgid "The login what was given to your account is: ${login}."
+msgstr "L'identifiant de connexion qui a été fourni pour votre compte est : ${login}."
+
+#: src/pyams_security/plugin/templates/register-info.pt:17
+#: src/pyams_security/plugin/templates/register-message.pt:15
+msgid ""
+"To confirm your registration, please click on the following link and re-"
+"enter your login credentials:"
+msgstr ""
+"Pour confirmer cette inscription, veuillez cliquer sur le lien ci-dessous et "
+"re-saisir vos paramètres de connexion."
+
+#: src/pyams_security/plugin/templates/register-info.pt:24
+#: src/pyams_security/plugin/templates/register-message.pt:22
+msgid ""
+"If you don't want to confirm this registration, please just ignore this "
+"message and your registration information will be deleted within 30 days."
+msgstr ""
+"Si vous ne souhaitez pas confirmer cette inscription ou si celle-ci a été "
+"faite sans votre consentement, il vous suffit d'ignorer ce message et votre "
+"inscription sera supprimée automatiquement dans un délai de 30 jours."
+
+#: src/pyams_security/plugin/templates/register-info.pt:26
+#: src/pyams_security/plugin/templates/register-message.pt:24
+msgid "Thank you for using our services."
+msgstr "Merci d'utiliser nos services."
+
+#: src/pyams_security/plugin/templates/register-message.pt:7
+msgid "${header} Please confirm registration"
+msgstr "${header} Veuillez confirmer votre inscription"
+
+#: src/pyams_security/plugin/templates/register-message.pt:14
+msgid ""
+"You have registered a new account that you may confirm before being able to "
+"use the service."
+msgstr ""
+"Vous avez créé un nouveau compte que vous devez confirmer avant de pouvoir "
+"utiliser ce service."
+
+#~ msgid "Mailer name"
+#~ msgstr "Nom du service de mail"
+
 #~ msgid "Add..."
 #~ msgstr "Ajouter..."
 
--- a/src/pyams_security/locales/pyams_security.pot	Tue Mar 17 16:02:49 2015 +0100
+++ b/src/pyams_security/locales/pyams_security.pot	Tue Mar 31 17:13:34 2015 +0200
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2015-03-03 16:44+0100\n"
+"POT-Creation-Date: 2015-03-31 16:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -86,6 +86,7 @@
 msgstr ""
 
 #: ./src/pyams_security/zmi/utility.py:185
+#: ./src/pyams_security/zmi/notification.py:58
 #: ./src/pyams_security/zmi/plugin/social.py:79
 #: ./src/pyams_security/zmi/plugin/userfolder.py:76
 #: ./src/pyams_security/zmi/plugin/group.py:72
@@ -119,6 +120,14 @@
 msgid "Given plug-in name doesn't exist!"
 msgstr ""
 
+#: ./src/pyams_security/zmi/notification.py:45
+msgid "Notifications..."
+msgstr ""
+
+#: ./src/pyams_security/zmi/notification.py:59
+msgid "Notifications properties"
+msgstr ""
+
 #: ./src/pyams_security/zmi/security.py:41
 msgid "Access rules..."
 msgstr ""
@@ -752,11 +761,140 @@
 msgid "You can't activate open registration without selecting a users folder"
 msgstr ""
 
+#: ./src/pyams_security/interfaces/notification.py:31
+msgid "Enable notifications?"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:32
+msgid "If 'no', mail notifications will be disabled"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:36
+msgid "Mailer utility"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:37
+msgid "Mail delivery utility used to send notifications"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:46
+msgid "Service name"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:47
+msgid "Name of service as defined in registration mail subject"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:50
+msgid "Service owner"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:51
+msgid ""
+"Name of the entity providing this service, which will be visible in "
+"notifications messages"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:55
+msgid "Sender name"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:56
+msgid "Visible name of registration mail sender"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:59
+msgid "Sender email"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:60
+msgid "Email address of registration mail sender"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:63
+msgid "Subject prefix"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:64
+msgid ""
+"This prefix will be inserted into subject prefix of each notification message"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:68
+msgid "Email signature"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:69
+msgid "Text displayed in email footer"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/notification.py:44
+msgid "Notifications can't be enabled without mailer utility"
+msgstr ""
+
 #: ./src/pyams_security/plugin/http.py:44
 msgid "HTTP Basic credentials"
 msgstr ""
 
-#: ./src/pyams_security/plugin/userfolder.py:106
-#: ./src/pyams_security/plugin/userfolder.py:111
+#: ./src/pyams_security/plugin/userfolder.py:115
+#: ./src/pyams_security/plugin/userfolder.py:120
 msgid "Can't activate profile with given params!"
 msgstr ""
+
+#: ./src/pyams_security/plugin/userfolder.py:249
+#, python-format
+msgid "{prefix}Please confirm registration"
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:7
+msgid "${header} Registration notice"
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:11
+#: ./src/pyams_security/plugin/templates/register-message.pt:11
+msgid "Hello,"
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:12
+#: ./src/pyams_security/plugin/templates/register-message.pt:12
+msgid "${service_name} is a service provided by ${service_owner}."
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:14
+msgid ""
+"A new account has been created for your email address, that you may confirm "
+"before being able to use the service."
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:16
+msgid "The login what was given to your account is: ${login}."
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:17
+#: ./src/pyams_security/plugin/templates/register-message.pt:15
+msgid ""
+"To confirm your registration, please click on the following link and re-enter"
+" your login credentials:"
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:24
+#: ./src/pyams_security/plugin/templates/register-message.pt:22
+msgid ""
+"If you don't want to confirm this registration, please just ignore this "
+"message and your registration information will be deleted within 30 days."
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-info.pt:26
+#: ./src/pyams_security/plugin/templates/register-message.pt:24
+msgid "Thank you for using our services."
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-message.pt:7
+msgid "${header} Please confirm registration"
+msgstr ""
+
+#: ./src/pyams_security/plugin/templates/register-message.pt:14
+msgid ""
+"You have registered a new account that you may confirm before being able to "
+"use the service."
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_security/notification.py	Tue Mar 31 17:13:34 2015 +0200
@@ -0,0 +1,57 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_security.interfaces import ISecurityManager
+from pyams_security.interfaces.notification import INotificationSettings
+from zope.annotation.interfaces import IAnnotations
+
+# import packages
+from persistent import Persistent
+from pyams_utils.adapter import adapter_config
+from pyams_utils.request import check_request
+from zope.interface import implementer
+from zope.lifecycleevent import ObjectCreatedEvent
+from zope.schema.fieldproperty import FieldProperty
+
+
+@implementer(INotificationSettings)
+class NotificationSettings(Persistent):
+    """Notification settings"""
+
+    enable_notifications = FieldProperty(INotificationSettings['enable_notifications'])
+    mailer = FieldProperty(INotificationSettings['mailer'])
+    service_name = FieldProperty(INotificationSettings['service_name'])
+    service_owner = FieldProperty(INotificationSettings['service_owner'])
+    sender_name = FieldProperty(INotificationSettings['sender_name'])
+    sender_email = FieldProperty(INotificationSettings['sender_email'])
+    subject_prefix = FieldProperty(INotificationSettings['subject_prefix'])
+    signature = FieldProperty(INotificationSettings['signature'])
+
+
+NOTIFICATIONS_KEY = 'pyams_security.notifications'
+
+
+@adapter_config(context=ISecurityManager, provides=INotificationSettings)
+def SecurityNotificationSettingsFactory(context):
+    """Security manager notifications factory adapter"""
+    annotations = IAnnotations(context)
+    settings = annotations.get(NOTIFICATIONS_KEY)
+    if settings is None:
+        settings = annotations[NOTIFICATIONS_KEY] = NotificationSettings()
+        check_request().registry.notify(ObjectCreatedEvent(settings))
+    return settings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_security/plugin/templates/register-info.pt	Tue Mar 31 17:13:34 2015 +0200
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+	  tal:define="lang request.locale_name"
+	  tal:attributes="lang lang; xml:lang lang;"
+	  i18n:domain="pyams_security">
+<head>
+	<title i18n:translate=""><span tal:replace="settings.subject_prefix" i18n:name="header"></span> Registration notice</title>
+	<meta charset="utf-8">
+</head>
+<body>
+	<p i18n:translate="">Hello,</p>
+	<p i18n:translate=""><tal:var content="settings.service_name" i18n:name="service_name" /> is a service provided by
+		<tal:var content="settings.service_owner" i18n:name="service_owner" />.</p>
+	<p i18n:translate="">A new account has been created for your email address, that you may confirm before being able
+						 to use the service.</p>
+	<p i18n:translate="">The login what was given to your account is: <tal:var content="context.login" i18n:name="login" />.</p>
+	<p><span i18n:translate="">To confirm your registration, please click on the following link and re-enter your login credentials:</span><br />
+		<a tal:define="url extension:absolute_url(site);
+					   href string:${url}/@@user-confirmation.html?hash=${context.activation_hash};"
+		   tal:attributes="href href"
+		   tal:content="href"></a>
+	</p>
+	<p i18n:translate="">If you don't want to confirm this registration, please just ignore this message and your registration information
+						 will be deleted within 30 days.</p>
+	<p i18n:translate="">Thank you for using our services.</p>
+	<div tal:define="signature settings.signature"
+		 tal:content="structure extension:html(signature)"></div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_security/plugin/templates/register-message.pt	Tue Mar 31 17:13:34 2015 +0200
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+	  tal:define="lang request.locale_name"
+	  tal:attributes="lang lang; xml:lang lang;"
+	  i18n:domain="pyams_security">
+<head>
+	<title i18n:translate=""><span tal:replace="settings.subject_prefix" i18n:name="header"></span> Please confirm registration</title>
+	<meta charset="utf-8">
+</head>
+<body>
+	<p i18n:translate="">Hello,</p>
+	<p i18n:translate=""><tal:var content="settings.service_name" i18n:name="service_name" /> is a service provided by
+		<tal:var content="settings.service_owner" i18n:name="service_owner" />.</p>
+	<p i18n:translate="">You have registered a new account that you may confirm before being able to use the service.</p>
+	<p><span i18n:translate="">To confirm your registration, please click on the following link and re-enter your login credentials:</span><br />
+		<a tal:define="url extension:absolute_url(site);
+					   href string:${url}/@@user-confirmation.html?hash=${context.activation_hash};"
+		   tal:attributes="href href"
+		   tal:content="href"></a>
+	</p>
+	<p i18n:translate="">If you don't want to confirm this registration, please just ignore this message and your registration information
+						 will be deleted within 30 days.</p>
+	<p i18n:translate="">Thank you for using our services.</p>
+	<div tal:define="signature settings.signature"
+		 tal:content="structure extension:html(signature)"></div>
+</body>
+</html>
--- a/src/pyams_security/plugin/userfolder.py	Tue Mar 17 16:02:49 2015 +0100
+++ b/src/pyams_security/plugin/userfolder.py	Tue Mar 31 17:13:34 2015 +0200
@@ -9,6 +9,8 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from zope.component.interfaces import ISite
+from pyams_utils.traversing import get_parent
 
 __docformat__ = 'restructuredtext'
 
@@ -17,6 +19,7 @@
 import base64
 import hashlib
 import hmac
+import os
 import random
 import sys
 from datetime import datetime
@@ -24,16 +27,23 @@
 
 # import interfaces
 from pyams_security.interfaces import ISecurityManager, IUsersFolderPlugin, ILocalUser, IPrincipalInfo
+from pyams_security.interfaces.notification import INotificationSettings
+from pyramid_chameleon.interfaces import IChameleonTranslate
+from pyramid_mailer.interfaces import IMailer
 from zope.lifecycleevent.interfaces import IObjectAddedEvent
 from zope.password.interfaces import IPasswordManager
 from zope.schema.interfaces import IVocabularyRegistry
 
 # import packages
+from chameleon.zpt.template import PageTemplateFile
 from persistent import Persistent
 from pyams_security.principal import PrincipalInfo
 from pyams_utils.adapter import adapter_config
+from pyams_utils.html import html_to_text
 from pyams_utils.registry import query_utility, get_utility
+from pyams_utils.request import check_request
 from pyramid.events import subscriber
+from pyramid_mailer.message import Message, Attachment
 from zope.container.contained import Contained
 from zope.container.folder import Folder
 from zope.interface import implementer, provider, Invalid
@@ -55,6 +65,7 @@
     _password = FieldProperty(ILocalUser['password'])
     _password_salt = None
     password_manager = FieldProperty(ILocalUser['password_manager'])
+    wait_confirmation = FieldProperty(ILocalUser['wait_confirmation'])
     self_registered = FieldProperty(ILocalUser['self_registered'])
     activation_secret = FieldProperty(ILocalUser['activation_secret'])
     activation_hash = FieldProperty(ILocalUser['activation_hash'])
@@ -215,8 +226,43 @@
 @subscriber(IObjectAddedEvent, context_selector=ILocalUser)
 def handle_new_local_user(event):
     """Send a confirmation message when a new user is recorded"""
+    security = query_utility(ISecurityManager)
+    settings = INotificationSettings(security)
+    mailer = settings.mailer
+    if mailer is None:
+        return
+    if isinstance(mailer, str):
+        mailer = query_utility(IMailer, name=mailer)
+        if mailer is None:
+            return
+    request = check_request()
+    translate = request.localizer.translate
     user = event.object
     if user.self_registered:
-        pass
+        template_name = 'register-message.pt'
+    elif user.wait_confirmation:
+        template_name = 'register-info.pt'
     else:
-        pass
+        template_name = None
+    if template_name is not None:
+        template = PageTemplateFile(os.path.join(os.path.split(__file__)[0], 'templates', template_name),
+                                    translate=query_utility(IChameleonTranslate))
+        site = get_parent(request.context, ISite)
+        html_body = template(request=request, context=user, site=site, settings=settings)
+        message = Message(subject=translate(_("{prefix}Please confirm registration"))
+                            .format(prefix="{prefix} ".format(prefix=settings.subject_prefix)
+                                           if settings.subject_prefix else ''),
+                          sender='{name} <{email}>'.format(name=settings.sender_name,
+                                                           email=settings.sender_email),
+                          recipients=("{firstname} {lastname} <{email}>".format(firstname=user.firstname,
+                                                                                lastname=user.lastname,
+                                                                                email=user.email), ),
+                          html=Attachment(data=html_body,
+                                          content_type='text/html; charset=utf-8',
+                                          disposition='inline',
+                                          transfer_encoding='quoted-printable'),
+                          body=Attachment(data=html_to_text(html_body),
+                                          content_type='text/plain; charset=utf-8',
+                                          disposition='inline',
+                                          transfer_encoding='quoted-printable'))
+        mailer.send(message)
--- a/src/pyams_security/views/login.py	Tue Mar 17 16:02:49 2015 +0100
+++ b/src/pyams_security/views/login.py	Tue Mar 31 17:13:34 2015 +0200
@@ -122,7 +122,7 @@
         status = {'status': 'redirect'}
         session = self.request.session
         if LOGIN_REFERER_KEY in session:
-            status['location'] = session[LOGIN_REFERER_KEY]
+            status['location'] = session[LOGIN_REFERER_KEY] or '/'
             del session[LOGIN_REFERER_KEY]
         return status
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_security/zmi/notification.py	Tue Mar 31 17:13:34 2015 +0200
@@ -0,0 +1,78 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_security.interfaces import ISecurityManager
+from pyams_security.interfaces.notification import INotificationSettings
+from pyams_security.zmi.interfaces import ISecurityManagerMenu
+from pyams_skin.layer import IPyAMSLayer
+from pyams_zmi.layer import IAdminLayer
+from zope.component.interfaces import ISite
+
+# import packages
+from pyams_form.form import AJAXEditForm
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_skin.viewlet.menu import MenuItem
+from pyams_utils.registry import query_utility
+from pyams_viewlet.viewlet import viewlet_config
+from pyams_zmi.form import AdminDialogEditForm
+from pyramid.url import resource_url
+from pyramid.view import view_config
+from z3c.form import field
+
+from pyams_security import _
+
+
+@viewlet_config(name='notifications.menu', context=ISite, layer=IAdminLayer, manager=ISecurityManagerMenu,
+                permission='system.view', weight=2)
+class SecurityManagerNotificationsMenuItem(MenuItem):
+    """Notifications properties menu item"""
+
+    label = _("Notifications...")
+    url = 'notifications.html'
+    modal_target = True
+
+    def get_url(self):
+        manager = query_utility(ISecurityManager)
+        return resource_url(manager, self.request, self.url)
+
+
+@pagelet_config(name='notifications.html', context=ISecurityManager, layer=IPyAMSLayer, permission='system.view')
+class SecurityManagerNotificationsEditForm(AdminDialogEditForm):
+    """Security manager notifications edit form"""
+
+    title = _("System security manager")
+    legend = _("Notifications properties")
+    icon_css_class = 'fa fa-fw fa-envelope-o'
+    label_css_class = 'control-label col-md-5'
+    input_css_class = 'col-md-7'
+
+    fields = field.Fields(INotificationSettings)
+    ajax_handler = 'notifications.json'
+
+    def getContent(self):
+        return query_utility(ISecurityManager)
+
+    def updateWidgets(self, prefix=None):
+        super(SecurityManagerNotificationsEditForm, self).updateWidgets(prefix)
+        self.widgets['signature'].label_css_class = 'textarea'
+
+
+@view_config(name='notifications.json', context=ISecurityManager, request_type=IPyAMSLayer,
+             permission='system.manage', renderer='json', xhr=True)
+class SecurityManagerNotificationsAJAXEditForm(AJAXEditForm, SecurityManagerNotificationsEditForm):
+    """Security manager notifications edit form, AJAX view"""