From 3bb8f7ab8ba4c9d28e898e96d59e38b99bd68a47 Mon Sep 17 00:00:00 2001 From: Matt Lewellyn Date: Fri, 29 Jan 2021 08:55:59 -0500 Subject: [PATCH] allow user to prevent sending welcome email after user form - email may be subsequently sent from the grid fixes #76 --- keg_auth/forms.py | 12 ++++++++++++ keg_auth/tests/test_forms.py | 9 +++++++++ keg_auth/tests/test_views.py | 13 +++++++++++++ keg_auth/views.py | 6 +++++- 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/keg_auth/forms.py b/keg_auth/forms.py index d8db5db..058c7f3 100644 --- a/keg_auth/forms.py +++ b/keg_auth/forms.py @@ -9,6 +9,7 @@ from sqlalchemy_utils import EmailType from webhelpers2.html.tags import link_to from wtforms.fields import ( + BooleanField, DateField, HiddenField, PasswordField, @@ -200,6 +201,10 @@ class FieldsMeta: ]) confirm = PasswordField(_('Confirm Password')) field_order = field_order + ('reset_password', 'confirm') + else: + # place a Send Welcome field after the initial set of fields + send_welcome = BooleanField('Send Welcome Email', default=True) + field_order = tuple(_fields + ['send_welcome'] + list(field_order[len(_fields):])) def get_object_by_field(self, field): return user_cls.get_by(username=field.data) @@ -212,6 +217,13 @@ def __iter__(self): order = ('csrf_token', ) + self.field_order return (getattr(self, field_id) for field_id in order) + def after_init(self, args, kwargs): + if kwargs.get('obj') and hasattr(self, 'send_welcome'): + self.send_welcome = None + self.field_order = tuple(filter(lambda v: v != 'send_welcome', self.field_order)) + + return super().after_init(args, kwargs) + return User diff --git a/keg_auth/tests/test_forms.py b/keg_auth/tests/test_forms.py index a40367f..5fc7471 100644 --- a/keg_auth/tests/test_forms.py +++ b/keg_auth/tests/test_forms.py @@ -215,6 +215,15 @@ def test_alternate_ident_field(self): allow_superuser=False, endpoint='auth.user:edit') assert hasattr(form_cls, 'username') + def test_send_welcome_present(self): + form = self.make_form() + assert form.send_welcome + + def test_send_welcome_absent(self): + user = ents.User.testing_create() + form = self.make_form(obj=user) + assert not form.send_welcome + def test_no_email(self): with mock.patch('keg_auth_ta.extensions.auth_entity_registry._user_cls', ents.UserNoEmail): form_cls = forms.user_form({'KEGAUTH_EMAIL_OPS_ENABLED': False}, diff --git a/keg_auth/tests/test_views.py b/keg_auth/tests/test_views.py index adce316..494aae2 100644 --- a/keg_auth/tests/test_views.py +++ b/keg_auth/tests/test_views.py @@ -566,6 +566,19 @@ def test_add(self): assert user.groups == [group_approve] assert user.bundles == [bundle_approve] + def test_add_no_welcome(self): + resp = self.client.get('/users/add') + + resp.form['email'] = 'abc3@example.com' + resp.form['send_welcome'] = False + with mail_ext.record_messages() as outbox: + resp = resp.form.submit() + assert resp.status_code == 302 + assert resp.location.endswith('/users') + assert resp.flashes == [('success', 'Successfully created User')] + assert len(outbox) == 0 + assert self.user_ent.get_by(email='abc3@example.com') + def test_resend_verification(self): self.current_user.is_verified = True self.current_user.permissions = ents.Permission.query.filter_by(token='auth-manage').all() diff --git a/keg_auth/views.py b/keg_auth/views.py index fd88d1e..bdb7bab 100644 --- a/keg_auth/views.py +++ b/keg_auth/views.py @@ -375,7 +375,11 @@ def grid_cls(self): def create_user(self, form): auth_manager = keg.current_app.auth_manager - email_enabled = flask.current_app.config.get('KEGAUTH_EMAIL_OPS_ENABLED', True) + email_enabled = ( + flask.current_app.config.get('KEGAUTH_EMAIL_OPS_ENABLED', True) + and hasattr(form, 'send_welcome') + and form.send_welcome.data + ) user_kwargs = {} user_kwargs['mail_enabled'] = email_enabled for field in form.data: