diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 9965132302ad9b8c26620ab09509a410ecc531a4..2da6d459cb523549b7d815a427011209b13f686d 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -46,7 +46,8 @@ from student.models import ( Registration, UserProfile, PendingNameChange, PendingEmailChange, CourseEnrollment, unique_id_for_user, CourseEnrollmentAllowed, UserStanding, LoginFailures, - create_comments_service_user, PasswordHistory, UserSignupSource + create_comments_service_user, PasswordHistory, UserSignupSource, + anonymous_id_for_user ) from student.forms import PasswordResetFormNoActive @@ -92,6 +93,9 @@ from util.password_policy_validators import ( from third_party_auth import pipeline, provider from xmodule.error_module import ErrorDescriptor +import analytics +from eventtracking import tracker + log = logging.getLogger("edx.student") AUDIT_LOG = logging.getLogger("audit") @@ -381,6 +385,10 @@ def register_user(request, extra_context=None): 'username': '', } + # We save this so, later on, we can determine what course motivated a user's signup + # if they actually complete the registration process + request.session['registration_course_id'] = context['course_id'] + if extra_context is not None: context.update(extra_context) @@ -951,6 +959,31 @@ def login_user(request, error=""): # pylint: disable-msg=too-many-statements,un if LoginFailures.is_feature_enabled(): LoginFailures.clear_lockout_counter(user) + # Track the user's sign in + if settings.FEATURES.get('SEGMENT_IO_LMS') and hasattr(settings, 'SEGMENT_IO_LMS_KEY'): + tracking_context = tracker.get_tracker().resolve_context() + analytics.identify(anonymous_id_for_user(user, None), { + 'email': email, + 'username': username, + }) + + # If the user entered the flow via a specific course page, we track that + registration_course_id = request.session.get('registration_course_id') + analytics.track( + user.id, + "edx.bi.user.account.authenticated", + { + 'category': "conversion", + 'label': registration_course_id + }, + context={ + 'Google Analytics': { + 'clientId': tracking_context.get('client_id') + } + } + ) + request.session['registration_course_id'] = None + if user is not None and user.is_active: try: # We do not log here, because we have a handler registered @@ -1398,6 +1431,33 @@ def create_account(request, post_override=None): # pylint: disable-msg=too-many (user, profile, registration) = ret dog_stats_api.increment("common.student.account_created") + + email = post_vars['email'] + + # Track the user's registration + if settings.FEATURES.get('SEGMENT_IO_LMS') and hasattr(settings, 'SEGMENT_IO_LMS_KEY'): + tracking_context = tracker.get_tracker().resolve_context() + analytics.identify(anonymous_id_for_user(user, None), { + email: email, + username: username, + }) + + registration_course_id = request.session.get('registration_course_id') + analytics.track( + user.id, + "edx.bi.user.account.registered", + { + "category": "conversion", + "label": registration_course_id + }, + context={ + 'Google Analytics': { + 'clientId': tracking_context.get('client_id') + } + } + ) + request.session['registration_course_id'] = None + create_comments_service_user(user) context = { diff --git a/common/djangoapps/third_party_auth/provider.py b/common/djangoapps/third_party_auth/provider.py index 4067db832f5ec6a17a2ca7bac5999340b8bd57f7..d398e1584c4694c3ef9001131c015a4b2bafc83a 100644 --- a/common/djangoapps/third_party_auth/provider.py +++ b/common/djangoapps/third_party_auth/provider.py @@ -4,7 +4,7 @@ Loaded by Django's settings mechanism. Consequently, this module must not invoke the Django armature. """ -from social.backends import google, linkedin +from social.backends import google, linkedin, facebook _DEFAULT_ICON_CLASS = 'icon-signin' @@ -150,6 +150,26 @@ class LinkedInOauth2(BaseProvider): return provider_details.get('fullname') +class FacebookOauth2(BaseProvider): + """Provider for LinkedIn's Oauth2 auth system.""" + + BACKEND_CLASS = facebook.FacebookOAuth2 + ICON_CLASS = 'icon-facebook' + NAME = 'Facebook' + SETTINGS = { + 'SOCIAL_AUTH_FACEBOOK_KEY': None, + 'SOCIAL_AUTH_FACEBOOK_SECRET': None, + } + + @classmethod + def get_email(cls, provider_details): + return provider_details.get('email') + + @classmethod + def get_name(cls, provider_details): + return provider_details.get('fullname') + + class Registry(object): """Singleton registry of third-party auth providers. diff --git a/common/djangoapps/third_party_auth/tests/specs/base.py b/common/djangoapps/third_party_auth/tests/specs/base.py index 4eb40fff3d0d9df4959957f0983eea0cb6d23c38..0ba253c27e578ac595dea93128bd617197898097 100644 --- a/common/djangoapps/third_party_auth/tests/specs/base.py +++ b/common/djangoapps/third_party_auth/tests/specs/base.py @@ -282,7 +282,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase): def assert_register_response_before_pipeline_looks_correct(self, response): """Asserts a GET of /register not in the pipeline looks correct.""" self.assertEqual(200, response.status_code) - self.assertIn('Sign in with ' + self.PROVIDER_CLASS.NAME, response.content) + self.assertIn('Sign up with ' + self.PROVIDER_CLASS.NAME, response.content) self.assert_signin_button_looks_functional(response.content, pipeline.AUTH_ENTRY_REGISTER) def assert_signin_button_looks_functional(self, content, auth_entry): diff --git a/common/static/js/src/utility.js b/common/static/js/src/utility.js index ef540373fca69168b0c99e730998e3daed96d9de..2ea5da08fc4909f53fe52ddcea9a6227a2c118ca 100644 --- a/common/static/js/src/utility.js +++ b/common/static/js/src/utility.js @@ -91,75 +91,7 @@ window.parseQueryString = function(queryString) { return parameters }; -// Check if the user recently enrolled in a course by looking at a referral URL -window.checkRecentEnrollment = function(referrer) { - var enrolledIn = null; - - // Check if the referrer URL contains a query string - if (referrer.indexOf("?") > -1) { - referrerQueryString = referrer.split("?")[1]; - } else { - referrerQueryString = ""; - } - - if (referrerQueryString != "") { - // Convert a non-empty query string into a key/value object - var referrerParameters = window.parseQueryString(referrerQueryString); - if ("course_id" in referrerParameters && "enrollment_action" in referrerParameters) { - if (referrerParameters.enrollment_action == "enroll") { - enrolledIn = referrerParameters.course_id; - } - } - } - - return enrolledIn -}; - -window.assessUserSignIn = function(parameters, userID, email, username) { - // Check if the user has logged in to enroll in a course - designed for when "Register" button registers users on click (currently, this could indicate a course registration when there may not have yet been one) - var enrolledIn = window.checkRecentEnrollment(document.referrer); - - // Check if the user has just registered - if (parameters.signin == "initial") { - window.trackAccountRegistration(enrolledIn, userID, email, username); - } else { - window.trackReturningUserSignIn(enrolledIn, userID, email, username); - } -}; - -window.trackAccountRegistration = function(enrolledIn, userID, email, username) { - // Alias the user's anonymous history with the user's new identity (for Mixpanel) - analytics.alias(userID); - - // Map the user's activity to their newly assigned ID - analytics.identify(userID, { - email: email, - username: username - }); - - // Track the user's account creation - analytics.track("edx.bi.user.account.registered", { - category: "conversion", - label: enrolledIn != null ? enrolledIn : "none" - }); -}; - -window.trackReturningUserSignIn = function(enrolledIn, userID, email, username) { - // Map the user's activity to their assigned ID - analytics.identify(userID, { - email: email, - username: username - }); - - // Track the user's sign in - analytics.track("edx.bi.user.account.authenticated", { - category: "conversion", - label: enrolledIn != null ? enrolledIn : "none" - }); -}; - window.identifyUser = function(userID, email, username) { - // If the signin parameter isn't present but the query string is non-empty, map the user's activity to their assigned ID analytics.identify(userID, { email: email, username: username diff --git a/lms/envs/dev.py b/lms/envs/dev.py index f0ced63d07d91f02d249600e95995b533196926c..d57ab3bd5b3da3bda9acae053e244b62eed325c0 100644 --- a/lms/envs/dev.py +++ b/lms/envs/dev.py @@ -44,12 +44,6 @@ FEEDBACK_SUBMISSION_EMAIL = "dummy@example.com" WIKI_ENABLED = True -LOGGING = get_logger_config(ENV_ROOT / "log", - logging_env="dev", - local_loglevel="DEBUG", - dev_env=True, - debug=True) - DJFS = { 'type': 'osfs', 'directory_root': 'lms/static/djpyfs', diff --git a/lms/startup.py b/lms/startup.py index 61926b078202cbd0fddc0a7148cce0c1fd03ae9f..bb6b312a5090bcd1c0f73c8ffb17941c15399002 100644 --- a/lms/startup.py +++ b/lms/startup.py @@ -37,7 +37,7 @@ def run(): # Initialize Segment.io analytics module. Flushes first time a message is received and # every 50 messages thereafter, or if 10 seconds have passed since last flush - if settings.FEATURES.get('SEGMENT_IO_LMS') and settings.SEGMENT_IO_LMS_KEY: + if settings.FEATURES.get('SEGMENT_IO_LMS') and hasattr(settings, 'SEGMENT_IO_LMS_KEY'): analytics.init(settings.SEGMENT_IO_LMS_KEY, flush_at=50) diff --git a/lms/static/sass/elements/_controls.scss b/lms/static/sass/elements/_controls.scss index 776c2e3ac209cbfaedb522388f99ce5a2b014f1f..f094f78df1bf696e7112e7b655ab1e0caf406d66 100644 --- a/lms/static/sass/elements/_controls.scss +++ b/lms/static/sass/elements/_controls.scss @@ -237,6 +237,54 @@ } } +// blue secondary button outline style +%btn-secondary-blue-outline { + @extend %t-action2; + @extend %btn; + @extend %btn-edged; + box-shadow: none; + border: 1px solid $m-blue-d3; + padding: ($baseline/2) $baseline; + background: transparent; + color: $m-blue-d3; + + &:hover, &:active, &:focus { + box-shadow: 0 2px 1px 0 $m-blue-d4; + background: $m-blue-d1; + color: $white; + } + + &.current, &.active { + box-shadow: inset 0 2px 1px 1px $m-blue-d2; + background: $m-blue; + color: $m-blue-d2; + + &:hover, &:active, &:focus { + box-shadow: inset 0 2px 1px 1px $m-blue-d3; + color: $m-blue-d3; + } + } + + &.disabled, &[disabled] { + box-shadow: none; + } +} + +// grey secondary button outline style +%btn-secondary-grey-outline { + @extend %btn-secondary-blue-outline; + border: 1px solid $gray-l4; + + &:hover, &:active, &:focus { + box-shadow: none; + border: 1px solid $m-blue-d3; + } + + &.disabled, &[disabled] { + box-shadow: none; + } +} + // ==================== // application: canned actions diff --git a/lms/static/sass/multicourse/_account.scss b/lms/static/sass/multicourse/_account.scss index 26cafdc432df7cba8e4ebc1a78b25b894854bc89..00b19e636d7df1e1586d04782e0c8855ac7d3baa 100644 --- a/lms/static/sass/multicourse/_account.scss +++ b/lms/static/sass/multicourse/_account.scss @@ -230,6 +230,21 @@ margin: 0 0 ($baseline/4) 0; } } + + .cta-login { + + h3.title, + .instructions { + display: inline-block; + margin-bottom: 0; + } + + .cta-login-action { + @extend %btn-secondary-grey-outline; + padding: ($baseline/10) ($baseline*.75); + margin-left: ($baseline/4); + } + } } // forms @@ -275,6 +290,17 @@ } } + .group-form-personalinformation { + + .field-education-level, + .field-gender, + .field-yob { + display: inline-block; + vertical-align: top; + margin-bottom: 0; + } + } + // individual fields .field { margin: 0 0 $baseline 0; @@ -304,6 +330,16 @@ font-size: em(13); } + &.password { + position: relative; + + .tip { + position: absolute; + top: 0; + right: 0; + } + } + input, textarea { width: 100%; margin: 0; @@ -432,9 +468,7 @@ } .action-primary { - float: left; width: flex-grid(8,8); - margin-right: flex-gutter(0); } .action-secondary { @@ -452,16 +486,71 @@ } // forms - third-party auth - .form-third-party-auth { + + // UI: deco - divider + .deco-divider { + position: relative; + display: block; + margin: ($baseline*1.5) 0; + border-top: ($baseline/5) solid $m-gray-l4; + + .copy { + @extend %t-copy-lead1; + @extend %t-weight4; + position: absolute; + top: -($baseline); + left: 43%; + padding: ($baseline/4) ($baseline*1.5); + background: white; + text-align: center; + color: $m-gray-l2; + } + } + + // downplay required note + .instructions .note { + @extend %t-copy-sub2; + display: block; + font-weight: normal; + color: $gray; + } + + .form-actions.form-third-party-auth { + width: flex-grid(8,8); margin-bottom: $baseline; - button { - margin-right: $baseline; + button[type="submit"] { + @extend %btn-secondary-blue-outline; + width: flex-grid(4,8); + margin-right: ($baseline/2); .icon { color: inherit; margin-right: $baseline/2; } + + &:last-child { + margin-right: 0; + } + + &.button-Google:hover { + box-shadow: 0 2px 1px 0 #8D3024; + background-color: #dd4b39; + border: 1px solid #A5382B; + } + + &.button-Facebook:hover { + box-shadow: 0 2px 1px 0 #30487C; + background-color: #3b5998; + border: 1px solid #263A62; + } + + &.button-LinkedIn:hover { + box-shadow: 0 2px 1px 0 #005D8E; + background-color: #0077b5; + border: 1px solid #06527D; + } + } } @@ -536,7 +625,6 @@ .introduction { header { height: 120px; - border-bottom: 1px solid $m-gray; background: transparent $login-banner-image 0 0 no-repeat; } } @@ -548,7 +636,6 @@ .introduction { header { height: 120px; - border-bottom: 1px solid $m-gray; background: transparent $register-banner-image 0 0 no-repeat; } } diff --git a/lms/static/sass/multicourse/_dashboard.scss b/lms/static/sass/multicourse/_dashboard.scss index 6f5f4c1e710db6832eec20f1be8ecf142fcdb7d0..a2a2f1a90bbefdab803fad7603d828ffec398d2f 100644 --- a/lms/static/sass/multicourse/_dashboard.scss +++ b/lms/static/sass/multicourse/_dashboard.scss @@ -110,17 +110,40 @@ .third-party-auth { color: inherit; font-weight: inherit; + } - .control { - float: right; - } + .auth-provider { + width: flex-grid(12); + display: block; + margin-top: ($baseline/4); + + .status { + width: flex-grid(1); + display: inline-block; + color: $gray-l2; + + .icon-link { + color: $base-font-color; + } - .icon { - margin-top: 4px; + .copy { + @extend %text-sr; + } } .provider { - display: inline; + width: flex-grid(9); + display: inline-block; + } + + .control { + width: flex-grid(2); + display: inline-block; + text-align: right; + + a:link, a:visited { + @extend %t-copy-sub2; + } } } } diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index 4f086d901c6f808f0d7c44cac725a6a34229cd99..8099775f95af9a5c85bc4fa053794b505e132edd 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -198,7 +198,7 @@ % if duplicate_provider: <section class="dashboard-banner third-party-auth"> ## Translators: this message is displayed when a user tries to link their account with a third-party authentication provider (for example, Google or LinkedIn) with a given edX account, but their third-party account is already associated with another edX account. provider_name is the name of the third-party authentication provider, and platform_name is the name of the edX deployment. - ${_('The selected {provider_name} account is already linked to another {platform_name} account. Please {link_start}log out{link_end}, then log in with your {provider_name} account.').format(link_end='</a>', link_start='<a href="%s">' % logout_url, provider_name='<strong>%s</strong>' % duplicate_provider.NAME, platform_name=platform_name)} + <p>${_('The {provider_name} account you selected is already linked to another {platform_name} account.').format(provider_name='<strong>%s</strong>' % duplicate_provider.NAME, platform_name=platform_name)} </section> % endif @@ -226,22 +226,23 @@ % if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): <li class="controls--account"> <span class="title"> - <div class="icon icon-gears"></div> ## Translators: this section lists all the third-party authentication providers (for example, Google and LinkedIn) the user can link with or unlink from their edX account. - ${_("Account Links")} + ${_("Connected Accounts")} </span> <span class="data"> <span class="third-party-auth"> % for state in provider_user_states: - <div> + <div class="auth-provider"> - % if state.has_account: - <span class="icon icon-link pull-left"></span> - % else: - <span class="icon icon-unlink pull-left"></span> - % endif + <div class="status"> + % if state.has_account: + <i class="icon icon-link"></i> <span class="copy">${_('Linked')}</span> + % else: + <i class="icon icon-unlink"></i><span class="copy">${_('Not Linked')}</span> + % endif + </div> <span class="provider">${state.provider.NAME}</span> <span class="control"> @@ -252,17 +253,19 @@ method="post" name="${state.get_unlink_form_name()}"> <input type="hidden" name="csrfmiddlewaretoken" value="${csrf_token}"> - </form> - <a href="#" onclick="document.${state.get_unlink_form_name()}.submit()"> - ## Translators: clicking on this removes the link between a user's edX account and their account with an external authentication provider (like Google or LinkedIn). - ${_("unlink")} - </a> - % else: - <a href="${pipeline.get_login_url(state.provider.NAME, pipeline.AUTH_ENTRY_DASHBOARD)}"> - ## Translators: clicking on this creates a link between a user's edX account and their account with an external authentication provider (like Google or LinkedIn). - ${_("link")} - </a> + + <a href="#" onclick="document.${state.get_unlink_form_name()}.submit()"> + ## Translators: clicking on this removes the link between a user's edX account and their account with an external authentication provider (like Google or LinkedIn). + ${_("Unlink")} + </a> + % else: + <a href="${pipeline.get_login_url(state.provider.NAME, pipeline.AUTH_ENTRY_DASHBOARD)}"> + ## Translators: clicking on this creates a link between a user's edX account and their account with an external authentication provider (like Google or LinkedIn). + ${_("Link")} + </a> % endif + </form> + </span> </div> % endfor diff --git a/lms/templates/login.html b/lms/templates/login.html index 293bd5d93473ee8ba694887729395ad80218b99c..9ab2e0e2fe08d6f35e2364d93e3481b10e4292d9 100644 --- a/lms/templates/login.html +++ b/lms/templates/login.html @@ -190,19 +190,17 @@ % if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): - <hr /> - - <p class="instructions"> - ## Developers: this is a sentence fragment, which is usually frowned upon. The design of the pags uses this fragment to provide an "else" clause underneath a number of choices. It's OK to leave it. - ## Translators: this is the last choice of a number of choices of how to log in to the site. - ${_('or, if you have connected one of these providers, log in below.')} - </p> + <span class="deco-divider"> + ## Developers: this is a sentence fragment, which is usually frowned upon. The design of the pags uses this fragment to provide an "else" clause underneath a number of choices. It's OK to leave it. + ## Translators: this is the last choice of a number of choices of how to log in to the site. + <span class="copy">${_('or')}</span> + </span> <div class="form-actions form-third-party-auth"> % for enabled in provider.Registry.enabled(): ## Translators: provider_name is the name of an external, third-party user authentication provider (like Google or LinkedIn). - <button type="submit" class="button button-primary" onclick="thirdPartySignin(event, '${pipeline.get_login_url(enabled.NAME, pipeline.AUTH_ENTRY_LOGIN)}');"><span class="icon ${enabled.ICON_CLASS}"></span>${_('Sign in with {provider_name}').format(provider_name=enabled.NAME)}</button> + <button type="submit" class="button button-primary button-${enabled.NAME}" onclick="thirdPartySignin(event, '${pipeline.get_login_url(enabled.NAME, pipeline.AUTH_ENTRY_LOGIN)}');"><span class="icon ${enabled.ICON_CLASS}"></span>${_('Sign in with {provider_name}').format(provider_name=enabled.NAME)}</button> % endfor </div> diff --git a/lms/templates/register-sidebar.html b/lms/templates/register-sidebar.html index 96f9d5d592fbaf4414665dcd4e6a286a7436455f..cd63b602c41359dd5f0e719526caaf4eac02df76 100644 --- a/lms/templates/register-sidebar.html +++ b/lms/templates/register-sidebar.html @@ -12,11 +12,11 @@ from django.core.urlresolvers import reverse % if has_extauth_info is UNDEFINED: -<div class="cta"> - <h3>${_("Already registered?")}</h3> +<div class="cta cta-login"> + <h3 class="title">${_("Already registered?")}</h3> <p class="instructions"> - <a href="${reverse('signin_user')}${login_query()}"> - ${_("Click here to log in.")} + <a class="cta-login-action" href="${reverse('signin_user')}${login_query()}"> + ${_("Log in")} </a> </p> </div> diff --git a/lms/templates/register.html b/lms/templates/register.html index 63a8a8cfa2503a0cd833ebae083c50aef27e566a..aa587951f0383faf024bd97ad5161ac192e58f5b 100644 --- a/lms/templates/register.html +++ b/lms/templates/register.html @@ -120,23 +120,27 @@ % if not running_pipeline: - <p class="instructions"> - ${_("Register to start learning today!")} - </p> - <div class="form-actions form-third-party-auth"> % for enabled in provider.Registry.enabled(): ## Translators: provider_name is the name of an external, third-party user authentication service (like Google or LinkedIn). - <button type="submit" class="button button-primary" onclick="thirdPartySignin(event, '${pipeline.get_login_url(enabled.NAME, pipeline.AUTH_ENTRY_REGISTER)}');"><span class="icon ${enabled.ICON_CLASS}"></span>${_('Sign in with {provider_name}').format(provider_name=enabled.NAME)}</button> + <button type="submit" class="button button-primary button-${enabled.NAME}" onclick="thirdPartySignin(event, '${pipeline.get_login_url(enabled.NAME, pipeline.AUTH_ENTRY_REGISTER)}');"><span class="icon ${enabled.ICON_CLASS}"></span>${_('Sign up with {provider_name}').format(provider_name=enabled.NAME)}</button> % endfor </div> + <span class="deco-divider"> + ## Developers: this is a sentence fragment, which is usually frowned upon. The design of the pags uses this fragment to provide an "else" clause underneath a number of choices. It's OK to leave it. + ## Translators: this is the last choice of a number of choices of how to log in to the site. + <span class="copy">${_('or')}</span> + </span> + <p class="instructions"> - ${_('or create your own {platform_name} account by completing all <strong>required*</strong> fields below.').format(platform_name=platform_name)} + ${_('Create your own {platform_name} account below').format(platform_name=platform_name)} + <span class="note">${_('Required fields are noted by <strong class="indicator">bold text and an asterisk (*)</strong>.')}</span> </p> + % else: <p class="instructions"> @@ -235,7 +239,7 @@ </div> <div class="group group-form group-form-secondary group-form-personalinformation"> - <h2 class="sr">${_("Extra Personal Information")}</h2> + <h2 class="sr">${_("Additional Personal Information")}</h2> <ol class="list-input"> % if settings.REGISTRATION_EXTRA_FIELDS['city'] != 'hidden': @@ -258,7 +262,7 @@ </li> % endif % if settings.REGISTRATION_EXTRA_FIELDS['level_of_education'] != 'hidden': - <li class="field-group"> + <li class="field-group field-education-level"> <div class="field ${settings.REGISTRATION_EXTRA_FIELDS['level_of_education']} select" id="field-education-level"> <label for="education-level">${_("Highest Level of Education Completed")}</label> <select id="education-level" name="level_of_education" ${'required aria-required="true"' if settings.REGISTRATION_EXTRA_FIELDS['level_of_education'] == 'required' else ''}> @@ -271,7 +275,7 @@ </li> % endif % if settings.REGISTRATION_EXTRA_FIELDS['gender'] != 'hidden': - <li class="field-group"> + <li class="field-group field-gender"> <div class="field ${settings.REGISTRATION_EXTRA_FIELDS['gender']} select" id="field-gender"> <label for="gender">${_("Gender")}</label> <select id="gender" name="gender" ${'required aria-required="true"' if settings.REGISTRATION_EXTRA_FIELDS['gender'] == 'required' else ''}> @@ -284,7 +288,7 @@ </li> % endif % if settings.REGISTRATION_EXTRA_FIELDS['year_of_birth'] != 'hidden': - <li class="field-group"> + <li class="field-group field-yob"> <div class="field ${settings.REGISTRATION_EXTRA_FIELDS['year_of_birth']} select" id="field-yob"> <label for="yob">${_("Year of Birth")}</label> <select id="yob" name="year_of_birth" ${'required aria-required="true"' if settings.REGISTRATION_EXTRA_FIELDS['year_of_birth'] == 'required' else ''}> @@ -300,8 +304,6 @@ </div> <div class="group group-form group-form-personalinformation2"> - <h2 class="sr">${_("Extra Personal Information")}</h2> - <ol class="list-input"> % if settings.REGISTRATION_EXTRA_FIELDS['mailing_address'] != 'hidden': <li class="field ${settings.REGISTRATION_EXTRA_FIELDS['mailing_address']} text" id="field-address-mailing"> diff --git a/lms/templates/widgets/segment-io.html b/lms/templates/widgets/segment-io.html index 5909ad64e34983a23aadd811e86ae24521d6272a..818fd74cc01d8a7316bfd9bc7daad02dc4ab4870 100644 --- a/lms/templates/widgets/segment-io.html +++ b/lms/templates/widgets/segment-io.html @@ -12,18 +12,8 @@ // Access the query string, stripping the leading "?" var queryString = window.location.search.substring(1); - if (queryString != "") { - // Convert the query string to a key/value object - var parameters = window.parseQueryString(queryString); + window.identifyUser("${user.id}", "${user.email}", "${user.username}"); - if ("signin" in parameters) { - window.assessUserSignIn(parameters, "${user.id}", "${user.email}", "${user.username}"); - } else { - window.identifyUser("${user.id}", "${user.email}", "${user.username}"); - } - } else { - window.identifyUser("${user.id}", "${user.email}", "${user.username}"); - } % endif // Get current page URL