Commit b1c7cdf4 by Bessie Steinberg

Add profession & specialty fields to register page

The site configurations can now set 'Profession' and 'Specialty' as
fields on the registration page.  The list of potential professions and
specialties to choice from can also be set from the site configurations
by setting 'PROFESSION_OPTIONS' and 'SPECIALTY_OPTIONS'.

WL-1098
parent 729127c3
...@@ -84,6 +84,10 @@ PASSWORD_CANT_EQUAL_USERNAME_MSG = _(u"Password cannot be the same as the userna ...@@ -84,6 +84,10 @@ PASSWORD_CANT_EQUAL_USERNAME_MSG = _(u"Password cannot be the same as the userna
REQUIRED_FIELD_NAME_MSG = _(u"Enter your full name.") REQUIRED_FIELD_NAME_MSG = _(u"Enter your full name.")
REQUIRED_FIELD_CONFIRM_EMAIL_MSG = _(u"The email addresses do not match.") REQUIRED_FIELD_CONFIRM_EMAIL_MSG = _(u"The email addresses do not match.")
REQUIRED_FIELD_COUNTRY_MSG = _(u"Select your country or region of residence.") REQUIRED_FIELD_COUNTRY_MSG = _(u"Select your country or region of residence.")
REQUIRED_FIELD_PROFESSION_SELECT_MSG = _(u"Select your profession.")
REQUIRED_FIELD_SPECIALTY_SELECT_MSG = _(u"Select your specialty.")
REQUIRED_FIELD_PROFESSION_TEXT_MSG = _(u"Enter your profession.")
REQUIRED_FIELD_SPECIALTY_TEXT_MSG = _(u"Enter your specialty.")
REQUIRED_FIELD_CITY_MSG = _(u"Enter your city.") REQUIRED_FIELD_CITY_MSG = _(u"Enter your city.")
REQUIRED_FIELD_GOALS_MSG = _(u"Tell us your goals.") REQUIRED_FIELD_GOALS_MSG = _(u"Tell us your goals.")
REQUIRED_FIELD_LEVEL_OF_EDUCATION_MSG = _(u"Select the highest level of education you have completed.") REQUIRED_FIELD_LEVEL_OF_EDUCATION_MSG = _(u"Select the highest level of education you have completed.")
......
...@@ -148,6 +148,8 @@ class RegistrationFormFactory(object): ...@@ -148,6 +148,8 @@ class RegistrationFormFactory(object):
"goals", "goals",
"honor_code", "honor_code",
"terms_of_service", "terms_of_service",
"profession",
"specialty",
] ]
def _is_field_visible(self, field_name): def _is_field_visible(self, field_name):
...@@ -472,6 +474,80 @@ class RegistrationFormFactory(object): ...@@ -472,6 +474,80 @@ class RegistrationFormFactory(object):
required=required required=required
) )
def _add_field_with_configurable_select_options(self, field_name, field_label, form_desc, required=False):
"""Add a field to a form description.
If select options are given for this field, it will be a select type
otherwise it will be a text type.
Arguments:
field_name: name of field
field_label: label for the field
form_desc: A form description
Keyword Arguments:
required (bool): Whether this field is required; defaults to False
"""
extra_field_options = configuration_helpers.get_value('EXTRA_FIELD_OPTIONS')
if extra_field_options is None or extra_field_options.get(field_name) is None:
field_type = "text"
include_default_option = False
options = None
error_msg = ''
exec("error_msg = accounts.REQUIRED_FIELD_%s_TEXT_MSG" % (field_name.upper()))
else:
field_type = "select"
include_default_option = True
field_options = extra_field_options.get(field_name)
options = [(unicode(option.lower()), option) for option in field_options]
error_msg = ''
exec("error_msg = accounts.REQUIRED_FIELD_%s_SELECT_MSG" % (field_name.upper()))
form_desc.add_field(
field_name,
label=field_label,
field_type=field_type,
options=options,
include_default_option=include_default_option,
required=required,
error_messages={
"required": error_msg
}
)
def _add_profession_field(self, form_desc, required=False):
"""Add a profession field to a form description.
Arguments:
form_desc: A form description
Keyword Arguments:
required (bool): Whether this field is required; defaults to False
"""
# Translators: This label appears above a dropdown menu on the registration
# form used to select the user's profession
profession_label = _("Profession")
self._add_field_with_configurable_select_options('profession', profession_label, form_desc, required=required)
def _add_specialty_field(self, form_desc, required=False):
"""Add a specialty field to a form description.
Arguments:
form_desc: A form description
Keyword Arguments:
required (bool): Whether this field is required; defaults to False
"""
# Translators: This label appears above a dropdown menu on the registration
# form used to select the user's specialty
specialty_label = _("Specialty")
self._add_field_with_configurable_select_options('specialty', specialty_label, form_desc, required=required)
def _add_mailing_address_field(self, form_desc, required=True): def _add_mailing_address_field(self, form_desc, required=True):
"""Add a mailing address field to a form description. """Add a mailing address field to a form description.
Arguments: Arguments:
......
...@@ -22,6 +22,7 @@ from django_comment_common import models ...@@ -22,6 +22,7 @@ from django_comment_common import models
from openedx.core.djangoapps.site_configuration.helpers import get_value from openedx.core.djangoapps.site_configuration.helpers import get_value
from openedx.core.lib.api.test_utils import ApiTestCase, TEST_API_KEY from openedx.core.lib.api.test_utils import ApiTestCase, TEST_API_KEY
from openedx.core.lib.time_zone_utils import get_display_time_zone from openedx.core.lib.time_zone_utils import get_display_time_zone
from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration
from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, skip_unless_lms from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, skip_unless_lms
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from third_party_auth.tests.testutil import simulate_running_pipeline, ThirdPartyAuthTestMixin from third_party_auth.tests.testutil import simulate_running_pipeline, ThirdPartyAuthTestMixin
...@@ -923,6 +924,52 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase): ...@@ -923,6 +924,52 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
CITY = "Springfield" CITY = "Springfield"
COUNTRY = "us" COUNTRY = "us"
GOALS = "Learn all the things!" GOALS = "Learn all the things!"
PROFESSION_OPTIONS = [
{
"name": u'--',
"value": u'',
"default": True
},
{
"value": u'software engineer',
"name": u'Software Engineer',
"default": False
},
{
"value": u'teacher',
"name": u'Teacher',
"default": False
},
{
"value": u'other',
"name": u'Other',
"default": False
}
]
SPECIALTY_OPTIONS = [
{
"name": u'--',
"value": u'',
"default": True
},
{
"value": "aerospace",
"name": "Aerospace",
"default": False
},
{
"value": u'early education',
"name": u'Early Education',
"default": False
},
{
"value": u'n/a',
"name": u'N/A',
"default": False
}
]
def setUp(self): def setUp(self):
super(RegistrationViewTest, self).setUp() super(RegistrationViewTest, self).setUp()
...@@ -1299,6 +1346,66 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase): ...@@ -1299,6 +1346,66 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
} }
) )
def test_register_form_profession_without_profession_options(self):
self._assert_reg_field(
{"profession": "required"},
{
"name": "profession",
"type": "text",
"required": True,
"label": "Profession",
"errorMessages": {
"required": "Enter your profession."
}
}
)
@with_site_configuration(configuration={"EXTRA_FIELD_OPTIONS": {"profession": ["Software Engineer", "Teacher", "Other"]}})
def test_register_form_profession_with_profession_options(self):
self._assert_reg_field(
{"profession": "required"},
{
"name": "profession",
"type": "select",
"required": True,
"label": "Profession",
"options": self.PROFESSION_OPTIONS,
"errorMessages": {
"required": "Select your profession."
},
}
)
def test_register_form_specialty_without_specialty_options(self):
self._assert_reg_field(
{"specialty": "required"},
{
"name": "specialty",
"type": "text",
"required": True,
"label": "Specialty",
"errorMessages": {
"required": "Enter your specialty."
}
}
)
@with_site_configuration(configuration={"EXTRA_FIELD_OPTIONS": {"specialty": ["Aerospace", "Early Education", "N/A"]}})
def test_register_form_specialty_with_specialty_options(self):
self._assert_reg_field(
{"specialty": "required"},
{
"name": "specialty",
"type": "select",
"required": True,
"label": "Specialty",
"options": self.SPECIALTY_OPTIONS,
"errorMessages": {
"required": "Select your specialty."
},
}
)
def test_registration_form_mailing_address(self): def test_registration_form_mailing_address(self):
self._assert_reg_field( self._assert_reg_field(
{"mailing_address": "optional"}, {"mailing_address": "optional"},
...@@ -1618,6 +1725,8 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase): ...@@ -1618,6 +1725,8 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
"goals", "goals",
"honor_code", "honor_code",
"terms_of_service", "terms_of_service",
"specialty",
"profession",
], ],
) )
def test_field_order_override(self): def test_field_order_override(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment