From e1bd970b468d22334607d04cff79b6a524846ae5 Mon Sep 17 00:00:00 2001
From: Jeff Chaves <58956521+chavesj@users.noreply.github.com>
Date: Fri, 24 Jul 2020 17:40:42 -0400
Subject: [PATCH] ENT-2894: Use new welcome template when redirected from
enterprise proxy login view (#24587)
* using new welcome template when redirected from enterprise proxy login view
* enabling safe redirects to enterprise learner portal from login in devstack
* ading admin portal to login redirect whitelist
* running make upgrade to version bump edx-enterprise
---
lms/envs/common.py | 7 ++---
lms/envs/devstack.py | 19 ++++++++++---
lms/envs/test.py | 3 +++
.../djangoapps/user_authn/views/login_form.py | 1 -
.../views/tests/test_logistration.py | 27 ++++++++++++-------
openedx/features/enterprise_support/api.py | 2 +-
openedx/features/enterprise_support/utils.py | 19 ++++++++-----
requirements/constraints.txt | 2 +-
requirements/edx/base.txt | 4 +--
requirements/edx/coverage.txt | 2 +-
requirements/edx/development.txt | 8 +++---
requirements/edx/testing.txt | 8 +++---
12 files changed, 67 insertions(+), 35 deletions(-)
diff --git a/lms/envs/common.py b/lms/envs/common.py
index e32e009f2a..27b82867d0 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -3655,6 +3655,10 @@ ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE = _(
u'{line_break}Please note that {platform_name} has a different {privacy_policy_link_start}Privacy Policy'
u'{privacy_policy_link_end} from {enterprise_name}.'
)
+ENTERPRISE_PROXY_LOGIN_WELCOME_TEMPLATE = _(
+ u'{start_bold}{enterprise_name}{end_bold} has partnered with {start_bold}{platform_name}{end_bold} '
+ u'to offer you high-quality learning opportunities from the world\'s best institutions and universities.'
+)
ENTERPRISE_TAGLINE = ''
ENTERPRISE_EXCLUDED_REGISTRATION_FIELDS = {
'age',
@@ -3915,9 +3919,6 @@ BLOCKSTORE_API_URL = 'http://localhost:18250/api/v1/'
# in the blockstore-based XBlock runtime
XBLOCK_RUNTIME_V2_EPHEMERAL_DATA_CACHE = 'default'
-########################## LEARNER PORTAL ##############################
-LEARNER_PORTAL_URL_ROOT = 'http://localhost:8734'
-
######################### MICROSITE ###############################
MICROSITE_ROOT_DIR = '/edx/app/edxapp/edx-microsite'
MICROSITE_CONFIGURATION = {}
diff --git a/lms/envs/devstack.py b/lms/envs/devstack.py
index 88461904d5..7dde2ab955 100644
--- a/lms/envs/devstack.py
+++ b/lms/envs/devstack.py
@@ -251,6 +251,17 @@ CREDENTIALS_PUBLIC_SERVICE_URL = 'http://localhost:18150'
############################### BLOCKSTORE #####################################
BLOCKSTORE_API_URL = "http://edx.devstack.blockstore:18250/api/v1/"
+########################## PROGRAMS LEARNER PORTAL ##############################
+LEARNER_PORTAL_URL_ROOT = 'http://localhost:8734'
+
+########################## ENTERPRISE LEARNER PORTAL ##############################
+ENTERPRISE_LEARNER_PORTAL_NETLOC = 'localhost:8734'
+ENTERPRISE_LEARNER_PORTAL_BASE_URL = 'http://' + ENTERPRISE_LEARNER_PORTAL_NETLOC
+
+########################## ENTERPRISE ADMIN PORTAL ##############################
+ENTERPRISE_ADMIN_PORTAL_NETLOC = 'localhost:1991'
+ENTERPRISE_ADMIN_PORTAL_BASE_URL = 'http://' + ENTERPRISE_ADMIN_PORTAL_NETLOC
+
###################### Cross-domain requests ######################
FEATURES['ENABLE_CORS_HEADERS'] = True
CORS_ALLOW_CREDENTIALS = True
@@ -260,7 +271,11 @@ CORS_ALLOW_HEADERS = corsheaders_default_headers + (
'use-jwt-cookie',
)
-LOGIN_REDIRECT_WHITELIST = [CMS_BASE]
+LOGIN_REDIRECT_WHITELIST = [
+ CMS_BASE,
+ ENTERPRISE_LEARNER_PORTAL_NETLOC,
+ ENTERPRISE_ADMIN_PORTAL_NETLOC,
+]
###################### JWTs ######################
JWT_AUTH.update({
@@ -360,8 +375,6 @@ MKTG_URLS = {
'WHAT_IS_VERIFIED_CERT': '/verified-certificate',
}
-ENTERPRISE_LEARNER_PORTAL_BASE_URL = 'http://localhost:8734'
-
ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS = {}
CREDENTIALS_SERVICE_USERNAME = 'credentials_worker'
diff --git a/lms/envs/test.py b/lms/envs/test.py
index 38d0e394f7..04eef4ee13 100644
--- a/lms/envs/test.py
+++ b/lms/envs/test.py
@@ -500,6 +500,9 @@ FRONTEND_LOGIN_URL = '/login'
FRONTEND_LOGOUT_URL = '/logout'
FRONTEND_REGISTER_URL = '/register'
+# Programs Learner Portal URL
+LEARNER_PORTAL_URL_ROOT = 'http://localhost:8734'
+
ECOMMERCE_API_URL = 'https://ecommerce.example.com/api/v2/'
ECOMMERCE_PUBLIC_URL_ROOT = None
ENTERPRISE_API_URL = 'http://enterprise.example.com/enterprise/api/v1/'
diff --git a/openedx/core/djangoapps/user_authn/views/login_form.py b/openedx/core/djangoapps/user_authn/views/login_form.py
index adabf22f02..4323de52a8 100644
--- a/openedx/core/djangoapps/user_authn/views/login_form.py
+++ b/openedx/core/djangoapps/user_authn/views/login_form.py
@@ -232,7 +232,6 @@ def login_and_registration_form(request, initial_mode="login"):
settings.FEATURES['ENABLE_COMBINED_LOGIN_REGISTRATION_FOOTER']
),
}
-
enterprise_customer = enterprise_customer_for_request(request)
update_logistration_context_for_enterprise(request, context, enterprise_customer)
diff --git a/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py b/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py
index fbdab0bf1a..bd20182ef3 100644
--- a/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py
+++ b/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py
@@ -424,15 +424,17 @@ class LoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMixin, ModuleSto
@mock.patch('openedx.core.djangoapps.user_authn.views.login_form.enterprise_customer_for_request')
@ddt.data(
- ('signin_user', False, None, None),
- ('register_user', False, None, None),
- ('signin_user', True, 'Fake EC', 'http://logo.com/logo.jpg'),
- ('register_user', True, 'Fake EC', 'http://logo.com/logo.jpg'),
- ('signin_user', True, 'Fake EC', None),
- ('register_user', True, 'Fake EC', None),
+ ('signin_user', False, None, None, False),
+ ('register_user', False, None, None, False),
+ ('signin_user', True, 'Fake EC', 'http://logo.com/logo.jpg', False),
+ ('register_user', True, 'Fake EC', 'http://logo.com/logo.jpg', False),
+ ('signin_user', True, 'Fake EC', 'http://logo.com/logo.jpg', True),
+ ('register_user', True, 'Fake EC', 'http://logo.com/logo.jpg', True),
+ ('signin_user', True, 'Fake EC', None, False),
+ ('register_user', True, 'Fake EC', None, False),
)
@ddt.unpack
- def test_enterprise_register(self, url_name, ec_present, ec_name, logo_url, mock_get_ec):
+ def test_enterprise_register(self, url_name, ec_present, ec_name, logo_url, is_proxy, mock_get_ec):
"""
Verify that when an EnterpriseCustomer is received on the login and register views,
the appropriate sidebar is rendered.
@@ -445,7 +447,11 @@ class LoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMixin, ModuleSto
else:
mock_get_ec.return_value = None
- response = self.client.get(reverse(url_name), HTTP_ACCEPT="text/html")
+ params = []
+ if is_proxy:
+ params.append(("proxy_login", "True"))
+
+ response = self.client.get(reverse(url_name), params, HTTP_ACCEPT="text/html")
enterprise_sidebar_div_id = u'enterprise-content-container'
@@ -453,7 +459,10 @@ class LoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMixin, ModuleSto
self.assertNotContains(response, text=enterprise_sidebar_div_id)
else:
self.assertContains(response, text=enterprise_sidebar_div_id)
- welcome_message = settings.ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE
+ if is_proxy:
+ welcome_message = settings.ENTERPRISE_PROXY_LOGIN_WELCOME_TEMPLATE
+ else:
+ welcome_message = settings.ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE
expected_message = Text(welcome_message).format(
start_bold=HTML(''),
end_bold=HTML(''),
diff --git a/openedx/features/enterprise_support/api.py b/openedx/features/enterprise_support/api.py
index 6c3a501b3b..6aef2315ba 100644
--- a/openedx/features/enterprise_support/api.py
+++ b/openedx/features/enterprise_support/api.py
@@ -450,7 +450,7 @@ def enterprise_customer_for_request(request):
Check all the context clues of the request to determine if
the request being made is tied to a particular EnterpriseCustomer.
"""
- if 'enterprise_customer' in request.session:
+ if 'enterprise_customer' in request.session and request.session['enterprise_customer']:
return enterprise_customer_from_cache(request=request)
else:
enterprise_customer = enterprise_customer_from_api(request)
diff --git a/openedx/features/enterprise_support/utils.py b/openedx/features/enterprise_support/utils.py
index 91d102d08b..62c95dab14 100644
--- a/openedx/features/enterprise_support/utils.py
+++ b/openedx/features/enterprise_support/utils.py
@@ -51,7 +51,8 @@ def update_logistration_context_for_enterprise(request, context, enterprise_cust
"""
sidebar_context = {}
if enterprise_customer:
- sidebar_context = get_enterprise_sidebar_context(enterprise_customer)
+ is_proxy_login = request.GET.get('proxy_login')
+ sidebar_context = get_enterprise_sidebar_context(enterprise_customer, is_proxy_login)
if sidebar_context:
context['data']['registration_form_desc']['fields'] = enterprise_fields_only(
@@ -67,7 +68,7 @@ def update_logistration_context_for_enterprise(request, context, enterprise_cust
update_third_party_auth_context_for_enterprise(request, context, enterprise_customer)
-def get_enterprise_sidebar_context(enterprise_customer):
+def get_enterprise_sidebar_context(enterprise_customer, is_proxy_login):
"""
Get context information for enterprise sidebar for the given enterprise customer.
@@ -84,10 +85,16 @@ def get_enterprise_sidebar_context(enterprise_customer):
branding_configuration = enterprise_customer.get('branding_configuration', {})
logo_url = branding_configuration.get('logo', '') if isinstance(branding_configuration, dict) else ''
- branded_welcome_template = configuration_helpers.get_value(
- 'ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE',
- settings.ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE
- )
+ if is_proxy_login:
+ branded_welcome_template = configuration_helpers.get_value(
+ 'ENTERPRISE_PROXY_LOGIN_WELCOME_TEMPLATE',
+ settings.ENTERPRISE_PROXY_LOGIN_WELCOME_TEMPLATE
+ )
+ else:
+ branded_welcome_template = configuration_helpers.get_value(
+ 'ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE',
+ settings.ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE
+ )
branded_welcome_string = Text(branded_welcome_template).format(
start_bold=HTML(''),
diff --git a/requirements/constraints.txt b/requirements/constraints.txt
index 0955b63059..8ac580ddcb 100644
--- a/requirements/constraints.txt
+++ b/requirements/constraints.txt
@@ -40,7 +40,7 @@ drf-yasg<1.17.1
# The team that owns this package will manually bump this package rather than having it pulled in automatically.
# This is to allow them to better control its deployment and to do it in a process that works better
# for them.
-edx-enterprise==3.4.27
+edx-enterprise==3.4.28
# Upgrading to 2.12.0 breaks several test classes due to API changes, need to update our code accordingly
factory-boy==2.8.1
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index b01acaf1b3..72897368bf 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -99,7 +99,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.5.0 # via -r requirements/edx/base.in, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-when
edx-drf-extensions==6.1.1 # via -r requirements/edx/base.in, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval
-edx-enterprise==3.4.27 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.in
+edx-enterprise==3.4.28 # via -c requirements/edx/../constraints.txt, -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.1 # 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
@@ -165,7 +165,7 @@ nodeenv==1.4.0 # via -r requirements/edx/base.in
numpy==1.18.5 # via -c requirements/edx/../constraints.txt, chem, openedx-calc, scipy
oauthlib==3.0.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.in, django-oauth-toolkit, lti-consumer-xblock, requests-oauthlib, social-auth-core
openedx-calc==1.0.9 # via -r requirements/edx/base.in
-ora2==2.8.8 # via -r requirements/edx/base.in
+ora2==2.8.9 # via -r requirements/edx/base.in
packaging==20.4 # via bleach, drf-yasg
path.py==12.4.0 # via edx-enterprise, edx-i18n-tools, ora2, xmodule
path==13.1.0 # via -c requirements/edx/../constraints.txt, -r requirements/edx/paver.txt, path.py
diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt
index 2276c00f93..4d921836b4 100644
--- a/requirements/edx/coverage.txt
+++ b/requirements/edx/coverage.txt
@@ -4,7 +4,7 @@
#
# make upgrade
#
-coverage==5.2 # via -r requirements/edx/coverage.in
+coverage==5.2.1 # via -r requirements/edx/coverage.in
diff-cover==3.0.1 # via -r requirements/edx/coverage.in
importlib-metadata==1.7.0 # via inflect, pluggy
inflect==3.0.2 # via -c requirements/edx/../constraints.txt, jinja2-pluralize
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index fed4d32430..97dc882a46 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -48,7 +48,7 @@ colorama==0.4.1 # via -r requirements/edx/testing.txt, radon
contextlib2==0.6.0.post1 # via -r requirements/edx/testing.txt
coreapi==2.3.3 # via -r requirements/edx/testing.txt, drf-yasg
coreschema==0.0.4 # via -r requirements/edx/testing.txt, coreapi, drf-yasg
-coverage==5.2 # via -r requirements/edx/testing.txt, pytest-cov
+coverage==5.2.1 # via -r requirements/edx/testing.txt, pytest-cov
git+https://github.com/nedbat/coverage_pytest_plugin.git@29de030251471e200ff255eb9e549218cd60e872#egg=coverage_pytest_plugin==0.0 # via -r requirements/edx/testing.txt
crowdsourcehinter-xblock==0.6 # via -r requirements/edx/testing.txt
cryptography==3.0 # via -r requirements/edx/testing.txt, django-fernet-fields, edx-enterprise, pdfminer.six, pyjwt, social-auth-core
@@ -111,7 +111,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.5.0 # via -r requirements/edx/testing.txt, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-when
edx-drf-extensions==6.1.1 # via -r requirements/edx/testing.txt, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval
-edx-enterprise==3.4.27 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt
+edx-enterprise==3.4.28 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt
edx-i18n-tools==0.5.3 # via -r requirements/edx/testing.txt, ora2
edx-lint==1.5.0 # via -r requirements/edx/testing.txt
edx-milestones==0.3.0 # via -r requirements/edx/testing.txt
@@ -200,7 +200,7 @@ nodeenv==1.4.0 # via -r requirements/edx/testing.txt
numpy==1.18.5 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt, chem, openedx-calc, scipy
oauthlib==3.0.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt, django-oauth-toolkit, lti-consumer-xblock, requests-oauthlib, social-auth-core
openedx-calc==1.0.9 # via -r requirements/edx/testing.txt
-ora2==2.8.8 # via -r requirements/edx/testing.txt
+ora2==2.8.9 # via -r requirements/edx/testing.txt
packaging==20.4 # via -r requirements/edx/testing.txt, bleach, drf-yasg, pytest, sphinx, tox
path.py==12.4.0 # via -r requirements/edx/testing.txt, edx-enterprise, edx-i18n-tools, ora2, xmodule
path==13.1.0 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt, path.py
@@ -314,7 +314,7 @@ unidiff==0.6.0 # via -r requirements/edx/testing.txt, coverage-pytest
uritemplate==3.0.1 # via -r requirements/edx/testing.txt, coreapi, drf-yasg
urllib3==1.25.10 # via -r requirements/edx/testing.txt, elasticsearch, geoip2, requests, selenium, transifex-client
user-util==0.2 # via -r requirements/edx/testing.txt
-virtualenv==20.0.27 # via -r requirements/edx/testing.txt, tox
+virtualenv==20.0.28 # via -r requirements/edx/testing.txt, tox
voluptuous==0.11.7 # via -r requirements/edx/testing.txt, ora2
vulture==1.5 # via -r requirements/edx/development.in
watchdog==0.10.3 # via -r requirements/edx/testing.txt
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index 956d9b5d51..ca03a483ec 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -47,7 +47,7 @@ colorama==0.4.1 # via radon
contextlib2==0.6.0.post1 # via -r requirements/edx/base.txt
coreapi==2.3.3 # via -r requirements/edx/base.txt, drf-yasg
coreschema==0.0.4 # via -r requirements/edx/base.txt, coreapi, drf-yasg
-coverage==5.2 # via -r requirements/edx/coverage.txt, pytest-cov
+coverage==5.2.1 # via -r requirements/edx/coverage.txt, pytest-cov
git+https://github.com/nedbat/coverage_pytest_plugin.git@29de030251471e200ff255eb9e549218cd60e872#egg=coverage_pytest_plugin==0.0 # via -r requirements/edx/testing.in
crowdsourcehinter-xblock==0.6 # via -r requirements/edx/base.txt
cryptography==3.0 # via -r requirements/edx/base.txt, django-fernet-fields, edx-enterprise, pdfminer.six, pyjwt, social-auth-core
@@ -108,7 +108,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.5.0 # via -r requirements/edx/base.txt, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-when
edx-drf-extensions==6.1.1 # via -r requirements/edx/base.txt, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval
-edx-enterprise==3.4.27 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt
+edx-enterprise==3.4.28 # via -c requirements/edx/../constraints.txt, -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.5.0 # via -r requirements/edx/testing.in
edx-milestones==0.3.0 # via -r requirements/edx/base.txt
@@ -192,7 +192,7 @@ nodeenv==1.4.0 # via -r requirements/edx/base.txt
numpy==1.18.5 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, chem, openedx-calc, scipy
oauthlib==3.0.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, django-oauth-toolkit, lti-consumer-xblock, requests-oauthlib, social-auth-core
openedx-calc==1.0.9 # via -r requirements/edx/base.txt
-ora2==2.8.8 # via -r requirements/edx/base.txt
+ora2==2.8.9 # via -r requirements/edx/base.txt
packaging==20.4 # via -r requirements/edx/base.txt, bleach, drf-yasg, pytest, tox
path.py==12.4.0 # via -r requirements/edx/base.txt, edx-enterprise, edx-i18n-tools, ora2, xmodule
path==13.1.0 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, path.py
@@ -293,7 +293,7 @@ unidiff==0.6.0 # via -r requirements/edx/testing.in, coverage-pytest-
uritemplate==3.0.1 # via -r requirements/edx/base.txt, coreapi, drf-yasg
urllib3==1.25.10 # via -r requirements/edx/base.txt, elasticsearch, geoip2, requests, selenium, transifex-client
user-util==0.2 # via -r requirements/edx/base.txt
-virtualenv==20.0.27 # via tox
+virtualenv==20.0.28 # via tox
voluptuous==0.11.7 # via -r requirements/edx/base.txt, ora2
watchdog==0.10.3 # via -r requirements/edx/base.txt
wcwidth==0.2.5 # via pytest