From c51dc9db206c218664f6c5c6cf12e94ad0df9cb3 Mon Sep 17 00:00:00 2001 From: "hasnain.naveed" <hasnain.naveed123@gmail.com> Date: Wed, 20 May 2020 13:33:56 +0500 Subject: [PATCH] ENT-2818 | Added enterprise slug login's url on edx login page. --- .../js/spec/student_account/login_spec.js | 11 +++++++- .../js/student_account/views/AccessView.js | 4 ++- .../js/student_account/views/LoginView.js | 11 +++++++- .../student_account/form_field.underscore | 1 + .../djangoapps/user_authn/views/login_form.py | 6 +++-- openedx/features/enterprise_support/utils.py | 27 +++++++++++++++++++ requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/testing.txt | 2 +- 9 files changed, 58 insertions(+), 8 deletions(-) diff --git a/lms/static/js/spec/student_account/login_spec.js b/lms/static/js/spec/student_account/login_spec.js index e162dc125d3..678d1b6b212 100644 --- a/lms/static/js/spec/student_account/login_spec.js +++ b/lms/static/js/spec/student_account/login_spec.js @@ -18,6 +18,7 @@ requests = null, authComplete = false, PLATFORM_NAME = 'edX', + ENTERPRISE_SLUG_LOGIN_URL = 'enterprise/login', USER_DATA = { email: 'xsy@edx.org', password: 'xsyisawesome', @@ -88,7 +89,8 @@ model: model, resetModel: resetModel, thirdPartyAuth: THIRD_PARTY_AUTH, - platformName: PLATFORM_NAME + platformName: PLATFORM_NAME, + enterpriseSlugLoginURL: ENTERPRISE_SLUG_LOGIN_URL }); // Spy on AJAX requests @@ -198,6 +200,13 @@ expect($('.forgot-password')).toBeVisible(); }); + it('displays a link to the enterprise slug login', function() { + createLoginView(this); + + // Verify that the enterprise login link is displayed + expect($('.enterprise-login')).toBeVisible(); + }); + it('displays password reset success message after password reset request', function() { createLoginView(this); diff --git a/lms/static/js/student_account/views/AccessView.js b/lms/static/js/student_account/views/AccessView.js index 6e2193618e9..1289e73095e 100644 --- a/lms/static/js/student_account/views/AccessView.js +++ b/lms/static/js/student_account/views/AccessView.js @@ -78,6 +78,7 @@ this.hideAuthWarnings = options.hide_auth_warnings || false; this.pipelineUserDetails = options.third_party_auth.pipeline_user_details; this.enterpriseName = options.enterprise_name || ''; + this.enterpriseSlugLoginURL = options.enterprise_slug_login_url || ''; this.isAccountRecoveryFeatureEnabled = options.is_account_recovery_feature_enabled || false; this.isMultipleUserEnterprisesFeatureEnabled = options.is_multiple_user_enterprises_feature_enabled || false; @@ -160,7 +161,8 @@ createAccountOption: this.createAccountOption, hideAuthWarnings: this.hideAuthWarnings, pipelineUserDetails: this.pipelineUserDetails, - enterpriseName: this.enterpriseName + enterpriseName: this.enterpriseName, + enterpriseSlugLoginURL: this.enterpriseSlugLoginURL }); // Listen for 'password-help' event to toggle sub-views diff --git a/lms/static/js/student_account/views/LoginView.js b/lms/static/js/student_account/views/LoginView.js index 9997817636b..703ed4f6c73 100644 --- a/lms/static/js/student_account/views/LoginView.js +++ b/lms/static/js/student_account/views/LoginView.js @@ -23,7 +23,8 @@ events: { 'click .js-login': 'submitForm', 'click .forgot-password': 'forgotPassword', - 'click .login-provider': 'thirdPartyAuth' + 'click .login-provider': 'thirdPartyAuth', + 'click .enterprise-login': 'enterpriseSlugLogin' }, formType: 'login', requiredStr: '', @@ -54,6 +55,7 @@ this.hideAuthWarnings = data.hideAuthWarnings; this.pipelineUserDetails = data.pipelineUserDetails; this.enterpriseName = data.enterpriseName; + this.enterpriseSlugLoginURL = data.enterpriseSlugLoginURL; this.listenTo(this.model, 'sync', this.saveSuccess); this.listenTo(this.resetModel, 'sync', this.resetEmail); @@ -137,6 +139,13 @@ this.clearPasswordResetSuccess(); }, + enterpriseSlugLogin: function(event) { + event.preventDefault(); + if (this.enterpriseSlugLoginURL) { + window.location.href = this.enterpriseSlugLoginURL; + } + }, + postFormSubmission: function() { this.clearPasswordResetSuccess(); }, diff --git a/lms/templates/student_account/form_field.underscore b/lms/templates/student_account/form_field.underscore index 6350d77bdf0..8e6f3713fcc 100644 --- a/lms/templates/student_account/form_field.underscore +++ b/lms/templates/student_account/form_field.underscore @@ -134,5 +134,6 @@ <% if( form === 'login' && name === 'password' ) { %> <button type="button" class="forgot-password field-link"><%- gettext("Need help logging in?") %></button> + <button type="button" class="enterprise-login field-link"><%- gettext("Sign in with your company or school") %></button> <% } %> </div> diff --git a/openedx/core/djangoapps/user_authn/views/login_form.py b/openedx/core/djangoapps/user_authn/views/login_form.py index 0d850eae304..f45ecd874bc 100644 --- a/openedx/core/djangoapps/user_authn/views/login_form.py +++ b/openedx/core/djangoapps/user_authn/views/login_form.py @@ -28,7 +28,8 @@ from openedx.core.djangoapps.user_authn.views.registration_form import Registrat from openedx.features.enterprise_support.api import enterprise_customer_for_request from openedx.features.enterprise_support.utils import ( handle_enterprise_cookies_for_logistration, - update_logistration_context_for_enterprise + get_enterprise_slug_login_url, + update_logistration_context_for_enterprise, ) from student.helpers import get_next_url_for_login_page from third_party_auth import pipeline @@ -211,7 +212,8 @@ def login_and_registration_form(request, initial_mode="login"): 'account_creation_allowed': configuration_helpers.get_value( 'ALLOW_PUBLIC_ACCOUNT_CREATION', settings.FEATURES.get('ALLOW_PUBLIC_ACCOUNT_CREATION', True)), 'is_account_recovery_feature_enabled': is_secondary_email_feature_enabled(), - 'is_multiple_user_enterprises_feature_enabled': is_multiple_user_enterprises_feature_enabled() + 'is_multiple_user_enterprises_feature_enabled': is_multiple_user_enterprises_feature_enabled(), + 'enterprise_slug_login_url': get_enterprise_slug_login_url() }, 'login_redirect_url': redirect_to, # This gets added to the query string of the "Sign In" button in header 'responsive': True, diff --git a/openedx/features/enterprise_support/utils.py b/openedx/features/enterprise_support/utils.py index 2e99348cfd8..b58d1649251 100644 --- a/openedx/features/enterprise_support/utils.py +++ b/openedx/features/enterprise_support/utils.py @@ -7,6 +7,7 @@ import json from crum import get_current_request from django.conf import settings +from django.urls import NoReverseMatch, reverse from django.utils.translation import ugettext as _ from edx_django_utils.cache import TieredCache, get_cache_key from enterprise.models import EnterpriseCustomerUser @@ -17,6 +18,7 @@ from lms.djangoapps.branding.api import get_privacy_url from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.user_authn.cookies import standard_cookie_settings from openedx.core.djangolib.markup import HTML, Text +from student.helpers import get_next_url_for_login_page def get_data_consent_share_cache_key(user_id, course_id): @@ -315,3 +317,28 @@ def is_enterprise_learner(user): (bool): True if given user is an enterprise learner. """ return EnterpriseCustomerUser.objects.filter(user_id=user.id).exists() + + +def get_enterprise_slug_login_url(): + """ + Return the enterprise slug login's URL (enterprise/login) if it exists otherwise None + """ + try: + return reverse('enterprise_slug_login') + except NoReverseMatch: + return None + + +def get_provider_login_url(request, provider_id, redirect_url=None): + """ + Return the given provider's login URL. + + This method is here to avoid the importing of pipeline and student app in enterprise. + """ + + provider_login_url = third_party_auth.pipeline.get_login_url( + provider_id, + third_party_auth.pipeline.AUTH_ENTRY_LOGIN, + redirect_url=redirect_url if redirect_url else get_next_url_for_login_page(request) + ) + return provider_login_url diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index a9e6dc68a40..0d14ff37f38 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -103,7 +103,7 @@ edx-django-release-util==0.4.4 # via -r requirements/edx/base.in edx-django-sites-extensions==2.5.1 # via -r requirements/edx/base.in edx-django-utils==3.2.2 # via -r requirements/edx/base.in, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-when edx-drf-extensions==6.0.0 # via -r requirements/edx/base.in, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval -edx-enterprise==3.2.17 # via -r requirements/edx/base.in +edx-enterprise==3.2.18 # via -r requirements/edx/base.in edx-i18n-tools==0.5.3 # via ora2 edx-milestones==0.3.0 # via -r requirements/edx/base.in edx-opaque-keys[django]==2.1.0 # via -r requirements/edx/paver.txt, edx-bulk-grades, edx-ccx-keys, edx-completion, edx-drf-extensions, edx-enterprise, edx-milestones, edx-organizations, edx-proctoring, edx-user-state-client, edx-when, xmodule diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 9b55bae19ee..f83a99546d7 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -115,7 +115,7 @@ edx-django-release-util==0.4.4 # via -r requirements/edx/testing.txt edx-django-sites-extensions==2.5.1 # via -r requirements/edx/testing.txt edx-django-utils==3.2.2 # via -r requirements/edx/testing.txt, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-when edx-drf-extensions==6.0.0 # via -r requirements/edx/testing.txt, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval -edx-enterprise==3.2.17 # via -r requirements/edx/testing.txt +edx-enterprise==3.2.18 # via -r requirements/edx/testing.txt edx-i18n-tools==0.5.3 # via -r requirements/edx/testing.txt, ora2 edx-lint==1.4.1 # via -r requirements/edx/testing.txt edx-milestones==0.3.0 # via -r requirements/edx/testing.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 1f264d68f29..513e4127f13 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -112,7 +112,7 @@ edx-django-release-util==0.4.4 # via -r requirements/edx/base.txt edx-django-sites-extensions==2.5.1 # via -r requirements/edx/base.txt edx-django-utils==3.2.2 # via -r requirements/edx/base.txt, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-when edx-drf-extensions==6.0.0 # via -r requirements/edx/base.txt, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval -edx-enterprise==3.2.17 # via -r requirements/edx/base.txt +edx-enterprise==3.2.18 # via -r requirements/edx/base.txt edx-i18n-tools==0.5.3 # via -r requirements/edx/base.txt, -r requirements/edx/testing.in, ora2 edx-lint==1.4.1 # via -r requirements/edx/testing.in edx-milestones==0.3.0 # via -r requirements/edx/base.txt -- GitLab