Merge pull request #24079 from edx/ahtisham/PROD-1412-2

Added v2 for confirm email backward compatibility
This commit is contained in:
Ahtisham Shahid
2020-06-03 17:13:49 +05:00
committed by GitHub
3 changed files with 211 additions and 31 deletions

View File

@@ -27,6 +27,10 @@ urlpatterns = [
url(r'^user_api/v1/account/registration/$', register.RegistrationView.as_view(),
name="user_api_registration"),
# V2 is created to avoid backward compatibility issue with confirm_email
url(r'^user_api/v2/account/registration/$', register.RegistrationView.as_view(),
name="user_api_registration_v2"),
# Moved from user_api/urls.py
# `api/user` prefix is preserved for backwards compatibility.
url(

View File

@@ -2,7 +2,6 @@
Objects and utilities used to construct registration forms.
"""
import copy
from importlib import import_module
import re
@@ -42,6 +41,7 @@ class TrueCheckbox(widgets.CheckboxInput):
"""
A checkbox widget that only accepts "true" (case-insensitive) as true.
"""
def value_from_datadict(self, data, files, name):
value = data.get(name, '')
return value.lower() == 'true'
@@ -164,12 +164,12 @@ class AccountCreationForm(forms.Form):
)
def __init__(
self,
data=None,
extra_fields=None,
extended_profile_fields=None,
do_third_party_auth=True,
tos_required=True
self,
data=None,
extra_fields=None,
extended_profile_fields=None,
do_third_party_auth=True,
tos_required=True
):
super(AccountCreationForm, self).__init__(data)
@@ -430,6 +430,13 @@ class RegistrationFormFactory(object):
required=self._is_field_required(field_name)
)
# remove confirm_email form v1 registration form
if 'v1' in request.get_full_path():
for index, field in enumerate(form_desc.fields):
if field['name'] == 'confirm_email':
del form_desc.fields[index]
break
return form_desc
def _add_email_field(self, form_desc, required=True):
@@ -952,7 +959,6 @@ class RegistrationFormFactory(object):
field_type = 'checkbox'
if not separate_honor_and_tos:
field_type = 'plaintext'
pp_link = marketing_link("PRIVACY")
@@ -1069,10 +1075,11 @@ class RegistrationFormFactory(object):
field_name, default=field_overrides[field_name]
)
if (field_name not in ['terms_of_service', 'honor_code']
and field_overrides[field_name]
and hide_registration_fields_except_tos):
if (
field_name not in ['terms_of_service', 'honor_code'] and
field_overrides[field_name] and
hide_registration_fields_except_tos
):
form_desc.override_field_properties(
field_name,
field_type="hidden",

View File

@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
"""Tests for account creation"""
import json
from unittest import skipIf, skipUnless
from datetime import datetime
@@ -328,7 +327,7 @@ class RegistrationViewValidationErrorTest(ThirdPartyAuthTestMixin, UserAPITestCa
@ddt.ddt
@skip_unless_lms
class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
class RegistrationViewTestV1(ThirdPartyAuthTestMixin, UserAPITestCase):
"""Tests for the registration end-points of the User API. """
maxDiff = None
@@ -392,7 +391,7 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
link_template = u"<a href='/honor' rel='noopener' target='_blank'>{link_label}</a>"
def setUp(self): # pylint: disable=arguments-differ
super(RegistrationViewTest, self).setUp()
super(RegistrationViewTestV1, self).setUp()
self.url = reverse("user_api_registration")
@ddt.data("get", "post")
@@ -494,7 +493,7 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
}
)
msg = u'Your password must contain at least 2 characters, including '\
msg = u'Your password must contain at least 2 characters, including ' \
u'3 uppercase letters & 1 symbol.'
self._assert_reg_field(
no_extra_fields_setting,
@@ -950,18 +949,7 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
)
def test_registration_form_confirm_email(self):
self._assert_reg_field(
{"confirm_email": "required"},
{
"name": "confirm_email",
"type": "text",
"required": True,
"label": "Confirm Email",
"errorMessages": {
"required": "The email addresses do not match.",
}
}
)
pass
@override_settings(
MKTG_URLS={"ROOT": "https://www.test.com/", "HONOR": "honor"},
@@ -1160,7 +1148,6 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
"password",
"favorite_movie",
"favorite_editor",
"confirm_email",
"city",
"state",
"country",
@@ -1221,7 +1208,6 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
"name",
"username",
"email",
"confirm_email",
"password",
"city",
"state",
@@ -1279,7 +1265,7 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
"password",
"favorite_movie",
"favorite_editor",
"confirm_email",
"city",
"state",
"country",
@@ -1637,6 +1623,7 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
"""
Test case to check user creation is forbidden when ALLOW_PUBLIC_ACCOUNT_CREATION feature flag is turned off
"""
def _side_effect_for_get_value(value, default=None):
"""
returns a side_effect with given return value for a given value
@@ -1735,6 +1722,188 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
})
class RegistrationViewTestV2(RegistrationViewTestV1):
def setUp(self): # pylint: disable=arguments-differ
super(RegistrationViewTestV1, self).setUp()
self.url = reverse("user_api_registration_v2")
@override_settings(
REGISTRATION_EXTRA_FIELDS={
"level_of_education": "optional",
"gender": "optional",
"year_of_birth": "optional",
"mailing_address": "optional",
"goals": "optional",
"city": "optional",
"state": "optional",
"country": "required",
"honor_code": "required",
"confirm_email": "required",
},
REGISTRATION_EXTENSION_FORM='openedx.core.djangoapps.user_api.tests.test_helpers.TestCaseForm',
REGISTRATION_FIELD_ORDER=[
"name",
"confirm_email",
"password",
"first_name",
"last_name",
"gender",
"year_of_birth",
"level_of_education",
"company",
"title",
"mailing_address",
"goals",
"honor_code",
"terms_of_service",
],
)
def test_field_order_invalid_override(self):
response = self.client.get(self.url)
self.assertHttpOK(response)
# Verify that all fields render in the correct order
form_desc = json.loads(response.content.decode('utf-8'))
field_names = [field["name"] for field in form_desc["fields"]]
self.assertEqual(field_names, [
"email",
"name",
"username",
"password",
"favorite_movie",
"favorite_editor",
"confirm_email",
"city",
"state",
"country",
"gender",
"year_of_birth",
"level_of_education",
"mailing_address",
"goals",
"honor_code",
])
@override_settings(
REGISTRATION_EXTRA_FIELDS={
"level_of_education": "optional",
"gender": "optional",
"year_of_birth": "optional",
"mailing_address": "optional",
"goals": "optional",
"city": "optional",
"state": "optional",
"country": "required",
"honor_code": "required",
"confirm_email": "required",
},
REGISTRATION_FIELD_ORDER=[
"name",
"username",
"email",
"confirm_email",
"password",
"first_name",
"last_name",
"city",
"state",
"country",
"gender",
"year_of_birth",
"level_of_education",
"company",
"title",
"job_title",
"mailing_address",
"goals",
"honor_code",
"terms_of_service",
"specialty",
"profession",
],
)
def test_field_order_override(self):
response = self.client.get(self.url)
self.assertHttpOK(response)
# Verify that all fields render in the correct order
form_desc = json.loads(response.content.decode('utf-8'))
field_names = [field["name"] for field in form_desc["fields"]]
self.assertEqual(field_names, [
"name",
"username",
"email",
"confirm_email",
"password",
"city",
"state",
"country",
"gender",
"year_of_birth",
"level_of_education",
"mailing_address",
"goals",
"honor_code",
])
@override_settings(
REGISTRATION_EXTRA_FIELDS={
"level_of_education": "optional",
"gender": "optional",
"year_of_birth": "optional",
"mailing_address": "optional",
"goals": "optional",
"city": "optional",
"state": "optional",
"country": "required",
"honor_code": "required",
"confirm_email": "required",
},
REGISTRATION_EXTENSION_FORM='openedx.core.djangoapps.user_api.tests.test_helpers.TestCaseForm',
)
def test_field_order(self):
response = self.client.get(self.url)
self.assertHttpOK(response)
# Verify that all fields render in the correct order
form_desc = json.loads(response.content.decode('utf-8'))
field_names = [field["name"] for field in form_desc["fields"]]
self.assertEqual(field_names, [
"email",
"name",
"username",
"password",
"favorite_movie",
"favorite_editor",
"confirm_email",
"city",
"state",
"country",
"gender",
"year_of_birth",
"level_of_education",
"mailing_address",
"goals",
"honor_code",
])
def test_registration_form_confirm_email(self):
self._assert_reg_field(
{"confirm_email": "required"},
{
"name": "confirm_email",
"type": "text",
"required": True,
"label": "Confirm Email",
"errorMessages": {
"required": "The email addresses do not match.",
}
}
)
@httpretty.activate
@ddt.ddt
class ThirdPartyRegistrationTestMixin(ThirdPartyOAuthTestMixin, CacheIsolationTestCase):