From ed8a5494587eaa5223a70bc01314d9ad3fe1a455 Mon Sep 17 00:00:00 2001 From: zhengxie Date: Sat, 6 Jan 2018 16:53:48 +0800 Subject: [PATCH] Notify admins after register --- seahub/oauth/backends.py | 6 +++- seahub/settings.py | 4 +++ .../registration/register_complete_email.txt | 4 +++ .../register_complete_email_subject.txt | 1 + .../seahub/thirdpart/registration/__init__.py | 0 .../thirdpart/registration/test_models.py | 33 +++++++++++++++++++ thirdpart/registration/models.py | 28 ++++++++++++++++ thirdpart/shibboleth/backends.py | 5 ++- 8 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 seahub/templates/registration/register_complete_email.txt create mode 100644 seahub/templates/registration/register_complete_email_subject.txt create mode 100644 tests/seahub/thirdpart/registration/__init__.py create mode 100644 tests/seahub/thirdpart/registration/test_models.py diff --git a/seahub/oauth/backends.py b/seahub/oauth/backends.py index 313523838f..2557155f05 100644 --- a/seahub/oauth/backends.py +++ b/seahub/oauth/backends.py @@ -2,7 +2,9 @@ from django.conf import settings from django.contrib.auth.backends import RemoteUserBackend from seahub.base.accounts import User -from registration.models import notify_admins_on_activate_request +from registration.models import ( + notify_admins_on_activate_request, notify_admins_on_register_complete) + class OauthRemoteUserBackend(RemoteUserBackend): """ @@ -49,6 +51,8 @@ class OauthRemoteUserBackend(RemoteUserBackend): email=username, is_active=self.activate_after_creation) if user and self.activate_after_creation is False: notify_admins_on_activate_request(user.email) + if user and settings.NOTIFY_ADMIN_AFTER_REGISTRATION is True: + notify_admins_on_register_complete(user.email) else: user = None diff --git a/seahub/settings.py b/seahub/settings.py index 2bf6ad9284..24207f4ce4 100644 --- a/seahub/settings.py +++ b/seahub/settings.py @@ -420,6 +420,10 @@ ACTIVATE_AFTER_REGISTRATION = True # This option will be ignored if ``ACTIVATE_AFTER_REGISTRATION`` set to ``True``. REGISTRATION_SEND_MAIL = False +# Whether or not send notify email to sytem admins when user registered or +# first login through Shibboleth. +NOTIFY_ADMIN_AFTER_REGISTRATION = False + # Whether or not activate inactive user on first login. Mainly used in LDAP user sync. ACTIVATE_AFTER_FIRST_LOGIN = False diff --git a/seahub/templates/registration/register_complete_email.txt b/seahub/templates/registration/register_complete_email.txt new file mode 100644 index 0000000000..481fa87b9d --- /dev/null +++ b/seahub/templates/registration/register_complete_email.txt @@ -0,0 +1,4 @@ +{% load i18n %} {% blocktrans %}You're receiving this e-mail because you are the admin of {{site_name }}, and a new user {{ reg_email}} is joined.{% endblocktrans%} + +{% trans "Please click the following link to view the new account:" %} +{{ user_search_link }} diff --git a/seahub/templates/registration/register_complete_email_subject.txt b/seahub/templates/registration/register_complete_email_subject.txt new file mode 100644 index 0000000000..e62b4e5532 --- /dev/null +++ b/seahub/templates/registration/register_complete_email_subject.txt @@ -0,0 +1 @@ +{% load i18n %}{% blocktrans %}New account created on {{site_name}}{% endblocktrans %} diff --git a/tests/seahub/thirdpart/registration/__init__.py b/tests/seahub/thirdpart/registration/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/seahub/thirdpart/registration/test_models.py b/tests/seahub/thirdpart/registration/test_models.py new file mode 100644 index 0000000000..cdb888ad0c --- /dev/null +++ b/tests/seahub/thirdpart/registration/test_models.py @@ -0,0 +1,33 @@ +from django.core import mail +from django.test import override_settings + +from seahub.test_utils import BaseTestCase +from registration import signals +from constance import config + + +class EmailAdminOnRegistrationTest(BaseTestCase): + def setUp(self): + self.clear_cache() + self.old_config = config.ACTIVATE_AFTER_REGISTRATION + config.ACTIVATE_AFTER_REGISTRATION = True + + def tearDown(self): + config.ACTIVATE_AFTER_REGISTRATION = self.old_config + + def _send_signal(self): + signals.user_registered.send(sender=self.__class__, + user=self.user, + request=self.fake_request) + + @override_settings( + NOTIFY_ADMIN_AFTER_REGISTRATION=True, + ) + def test_notify_admin_after_registration(self): + self.assertEqual(len(mail.outbox), 0) + self._send_signal() + + assert 'New account created' in mail.outbox[0].subject + assert '%s is joined' % self.user.email in mail.outbox[0].body + + assert len(mail.outbox) > 0 diff --git a/thirdpart/registration/models.py b/thirdpart/registration/models.py index 3f96e50d61..1336a62d3d 100644 --- a/thirdpart/registration/models.py +++ b/thirdpart/registration/models.py @@ -325,6 +325,30 @@ def notify_admins_on_activate_request(reg_email): except Exception as e: logger.error(e) +def notify_admins_on_register_complete(reg_email): + ctx_dict = { + "site_name": settings.SITE_NAME, + "user_search_link": "%s%s?email=%s" % ( + get_site_scheme_and_netloc(), reverse("user_search"), + urlquote(reg_email)), + "reg_email": reg_email, + } + + subject = render_to_string('registration/register_complete_email_subject.txt', + ctx_dict) + # Email subject *must not* contain newlines + subject = ''.join(subject.splitlines()) + + message = render_to_string('registration/register_complete_email.txt', + ctx_dict) + + admins = User.objects.get_superusers() + for admin in admins: + try: + admin.email_user(subject, message, settings.DEFAULT_FROM_EMAIL) + except Exception as e: + logger.error(e) + @receiver(user_registered) def email_admin_on_registration(sender, **kwargs): """Send an email notification to admin when a newly registered user need @@ -337,3 +361,7 @@ def email_admin_on_registration(sender, **kwargs): bool(config.REGISTRATION_SEND_MAIL) is False: reg_email = kwargs['user'].email notify_admins_on_activate_request(reg_email) + + if settings.NOTIFY_ADMIN_AFTER_REGISTRATION is True: + reg_email = kwargs['user'].email + notify_admins_on_register_complete(reg_email) diff --git a/thirdpart/shibboleth/backends.py b/thirdpart/shibboleth/backends.py index 6ab1a6d216..03d7193e74 100644 --- a/thirdpart/shibboleth/backends.py +++ b/thirdpart/shibboleth/backends.py @@ -3,7 +3,8 @@ from django.db import connection from django.contrib.auth.backends import RemoteUserBackend from seahub.base.accounts import User -from registration.models import notify_admins_on_activate_request +from registration.models import ( + notify_admins_on_activate_request, notify_admins_on_register_complete) class ShibbolethRemoteUserBackend(RemoteUserBackend): """ @@ -50,6 +51,8 @@ class ShibbolethRemoteUserBackend(RemoteUserBackend): email=username, is_active=self.activate_after_creation) if user and self.activate_after_creation is False: notify_admins_on_activate_request(user.email) + if user and settings.NOTIFY_ADMIN_AFTER_REGISTRATION is True: + notify_admins_on_register_complete(user.email) else: user = None