only show mobile number on register from invite page if user is sms_auth

also clean up the way the form is invoked - it now populates from an
invited_user object
This commit is contained in:
Leo Hemsted
2017-11-14 15:53:38 +00:00
parent c8dbd819ef
commit 8c14113da5
5 changed files with 37 additions and 12 deletions

View File

@@ -176,6 +176,13 @@ class RegisterUserForm(Form):
class RegisterUserFromInviteForm(Form):
def __init__(self, invited_user):
super().__init__(
service=invited_user['service'],
email_address=invited_user['email_address'],
auth_type=invited_user['auth_type'],
)
name = StringField(
'Full name',
validators=[DataRequired(message='Cant be empty')]

View File

@@ -46,24 +46,23 @@ def register_from_invite():
if not invited_user:
abort(404)
form = RegisterUserFromInviteForm()
is_sms_auth = invited_user['auth_type'] == 'sms_auth'
form = RegisterUserFromInviteForm(invited_user)
if form.validate_on_submit():
if form.service.data != invited_user['service'] or form.email_address.data != invited_user['email_address']:
abort(400)
_do_registration(form, send_email=False, send_sms=invited_user['auth_type'] == 'sms_auth')
_do_registration(form, send_email=False, send_sms=is_sms_auth)
invite_api_client.accept_invite(invited_user['service'], invited_user['id'])
if invited_user['auth_type'] == 'sms_auth':
if is_sms_auth:
return redirect(url_for('main.verify'))
else:
# we've already proven this user has email because they clicked the invite link,
# so just activate them straight away
return activate_user(session['user_details']['id'])
form.service.data = invited_user['service']
form.email_address.data = invited_user['email_address']
return render_template('views/register-from-invite.html', email_address=invited_user['email_address'], form=form)
return render_template('views/register-from-invite.html', invited_user=invited_user, form=form)
def _do_registration(form, send_sms=True, send_email=True):

View File

@@ -11,16 +11,19 @@ Create an account
<div class="grid-row">
<div class="column-two-thirds">
<h1 class="heading-large">Create an account</h1>
<p>Your account will be created with this email: {{email_address}}</p>
<p>Your account will be created with this email: {{invited_user.email_address}}</p>
<form method="post" autocomplete="off">
{{ textbox(form.name, width='3-4') }}
<div class="extra-tracking">
{{ textbox(form.mobile_number, width='3-4', hint='Well send you a security code by text message') }}
</div>
{% if invited_user.auth_type == 'sms_auth' %}
<div class="extra-tracking">
{{ textbox(form.mobile_number, width='3-4', hint='Well send you a security code by text message') }}
</div>
{% endif %}
{{ textbox(form.password, hint="At least 8 characters", width='3-4') }}
{{ page_footer("Continue") }}
{{form.service}}
{{form.email_address}}
{{form.auth_type}}
</form>
</div>
</div>

View File

@@ -354,7 +354,7 @@ def test_new_invited_user_verifies_and_added_to_service(
'password': 'longpassword',
'mobile_number': '+447890123456',
'name': 'Invited User',
# 'auth_type': 'sms_auth'
'auth_type': 'sms_auth'
}
response = client.post(url_for('main.register_from_invite'), data=data)
assert response.status_code == 302

View File

@@ -327,3 +327,19 @@ def test_cannot_register_with_sms_auth_and_missing_mobile_number(
err = page.select_one('.error-message')
assert err.text.strip() == 'Cant be empty'
assert err.attrs['data-error-label'] == 'mobile_number'
def test_register_from_invite_form_doesnt_show_mobile_number_field_if_email_auth(
client,
sample_invite
):
sample_invite['auth_type'] = 'email_auth'
with client.session_transaction() as session:
session['invited_user'] = sample_invite
response = client.get(url_for('main.register_from_invite'))
assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert page.find('input', attrs={'name': 'auth_type'}).attrs['value'] == 'email_auth'
assert page.find('input', attrs={'name': 'mobile_number'}) is None