From 6305fbdfb6d488be994a6730275e982396cf4b30 Mon Sep 17 00:00:00 2001 From: Giovanni Cimolin da Silva Date: Wed, 1 May 2019 20:39:57 -0300 Subject: [PATCH] Add mktg links override capability This commit adds a feature that allows overriding any marketing URL, either by configuration on lms.env.json or SiteConfiguration, regardless if a marketing website is set up. The links can be set by passing MKTG_URL_OVERRIDES to either `lms.env.json` or `SiteConfiguration`. --- cms/envs/common.py | 1 + cms/envs/production.py | 1 + common/djangoapps/edxmako/shortcuts.py | 16 ++++++++++++++++ common/djangoapps/edxmako/tests.py | 26 ++++++++++++++++++++++++++ lms/envs/common.py | 1 + lms/envs/production.py | 3 ++- 6 files changed, 47 insertions(+), 1 deletion(-) diff --git a/cms/envs/common.py b/cms/envs/common.py index a3b10000a2..2665927f21 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -1443,6 +1443,7 @@ EDXMKTG_USER_INFO_COOKIE_NAME = 'edx-user-info' EDXMKTG_USER_INFO_COOKIE_VERSION = 1 MKTG_URLS = {} +MKTG_URL_OVERRIDES = {} MKTG_URL_LINK_MAP = { } diff --git a/cms/envs/production.py b/cms/envs/production.py index 23a09c6ed7..eb89b8bde4 100644 --- a/cms/envs/production.py +++ b/cms/envs/production.py @@ -258,6 +258,7 @@ ADMINS = ENV_TOKENS.get('ADMINS', ADMINS) SERVER_EMAIL = ENV_TOKENS.get('SERVER_EMAIL', SERVER_EMAIL) MKTG_URLS = ENV_TOKENS.get('MKTG_URLS', MKTG_URLS) MKTG_URL_LINK_MAP.update(ENV_TOKENS.get('MKTG_URL_LINK_MAP', {})) +MKTG_URL_OVERRIDES.update(ENV_TOKENS.get('MKTG_URL_OVERRIDES', MKTG_URL_OVERRIDES)) TECH_SUPPORT_EMAIL = ENV_TOKENS.get('TECH_SUPPORT_EMAIL', TECH_SUPPORT_EMAIL) for name, value in ENV_TOKENS.get("CODE_JAIL", {}).items(): diff --git a/common/djangoapps/edxmako/shortcuts.py b/common/djangoapps/edxmako/shortcuts.py index 4aaea4b0b4..6c1160ae4c 100644 --- a/common/djangoapps/edxmako/shortcuts.py +++ b/common/djangoapps/edxmako/shortcuts.py @@ -21,6 +21,8 @@ from django.http import HttpResponse from django.template import engines from django.urls import reverse from six.moves.urllib.parse import urljoin +from django.core.validators import URLValidator +from django.core.exceptions import ValidationError from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.theming.helpers import is_request_in_themed_site @@ -50,6 +52,20 @@ def marketing_link(name): 'MKTG_URLS', settings.MKTG_URLS ) + marketing_url_overrides = configuration_helpers.get_value( + 'MKTG_URL_OVERRIDES', + settings.MKTG_URL_OVERRIDES + ) + + if name in marketing_url_overrides: + validate = URLValidator() + url = marketing_url_overrides.get(name) + try: + validate(url) + return url + except ValidationError as err: + log.debug("Invalid link set for link %s: %s", name, err) + return '#' if enable_mktg_site and name in marketing_urls: # special case for when we only want the root marketing URL diff --git a/common/djangoapps/edxmako/tests.py b/common/djangoapps/edxmako/tests.py index defd7d31ce..37eaa24a89 100644 --- a/common/djangoapps/edxmako/tests.py +++ b/common/djangoapps/edxmako/tests.py @@ -72,6 +72,32 @@ class ShortcutsTests(UrlResetMixin, TestCase): # return any cms url name return 'organizations' + @override_settings(MKTG_URLS={'ROOT': 'https://dummy-root', 'TOS': '/tos'}) + @override_settings(MKTG_URL_OVERRIDES={'TOS': 'https://edx.org'}) + def test_override_marketing_link_valid(self): + expected_link = 'https://edx.org' + # test marketing site on + with patch.dict('django.conf.settings.FEATURES', {'ENABLE_MKTG_SITE': True}): + link = marketing_link('TOS') + self.assertEquals(link, expected_link) + # test marketing site off + with patch.dict('django.conf.settings.FEATURES', {'ENABLE_MKTG_SITE': False}): + link = marketing_link('TOS') + self.assertEquals(link, expected_link) + + @override_settings(MKTG_URLS={'ROOT': 'https://dummy-root', 'TOS': '/tos'}) + @override_settings(MKTG_URL_OVERRIDES={'TOS': '123456'}) + def test_override_marketing_link_invalid(self): + expected_link = '#' + # test marketing site on + with patch.dict('django.conf.settings.FEATURES', {'ENABLE_MKTG_SITE': True}): + link = marketing_link('TOS') + self.assertEquals(link, expected_link) + # test marketing site off + with patch.dict('django.conf.settings.FEATURES', {'ENABLE_MKTG_SITE': False}): + link = marketing_link('TOS') + self.assertEquals(link, expected_link) + class AddLookupTests(TestCase): """ diff --git a/lms/envs/common.py b/lms/envs/common.py index 020fe37e45..4505dada16 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -2562,6 +2562,7 @@ EDXMKTG_USER_INFO_COOKIE_NAME = 'edx-user-info' EDXMKTG_USER_INFO_COOKIE_VERSION = 1 MKTG_URLS = {} +MKTG_URL_OVERRIDES = {} MKTG_URL_LINK_MAP = { 'ABOUT': 'about', 'CONTACT': 'contact', diff --git a/lms/envs/production.py b/lms/envs/production.py index 4c67ec2d93..d973db31ea 100644 --- a/lms/envs/production.py +++ b/lms/envs/production.py @@ -342,12 +342,13 @@ COMPREHENSIVE_THEME_LOCALE_PATHS = ENV_TOKENS.get('COMPREHENSIVE_THEME_LOCALE_PA DEFAULT_SITE_THEME = ENV_TOKENS.get('DEFAULT_SITE_THEME', DEFAULT_SITE_THEME) ENABLE_COMPREHENSIVE_THEMING = ENV_TOKENS.get('ENABLE_COMPREHENSIVE_THEMING', ENABLE_COMPREHENSIVE_THEMING) -# Marketing link overrides MKTG_URL_LINK_MAP.update(ENV_TOKENS.get('MKTG_URL_LINK_MAP', {})) ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS = ENV_TOKENS.get( 'ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS', ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS ) +# Marketing link overrides +MKTG_URL_OVERRIDES.update(ENV_TOKENS.get('MKTG_URL_OVERRIDES', MKTG_URL_OVERRIDES)) # Intentional defaults. SUPPORT_SITE_LINK = ENV_TOKENS.get('SUPPORT_SITE_LINK', SUPPORT_SITE_LINK)