From 7944e6b4183aa8527d7a47d68f482c1a045a5945 Mon Sep 17 00:00:00 2001 From: David Ormsbee Date: Thu, 8 Aug 2019 20:36:21 -0400 Subject: [PATCH] Override theme with site_theme query param --- openedx/core/djangoapps/theming/middleware.py | 8 +++++++- .../djangoapps/theming/tests/test_middleware.py | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/openedx/core/djangoapps/theming/middleware.py b/openedx/core/djangoapps/theming/middleware.py index 2f082a1fed..05632183d0 100644 --- a/openedx/core/djangoapps/theming/middleware.py +++ b/openedx/core/djangoapps/theming/middleware.py @@ -21,9 +21,15 @@ class CurrentSiteThemeMiddleware(object): """ Set the request's 'site_theme' attribute based upon the current user. """ + # Specifying a "site_theme" querystring param takes precedence + qs_theme = request.GET.get('site_theme') + # Determine if the user has specified a preview site preview_site_theme = get_user_preview_site_theme(request) - if preview_site_theme: + + if qs_theme: + site_theme = SiteTheme(site=request.site, theme_dir_name=qs_theme) + elif preview_site_theme: site_theme = preview_site_theme else: default_theme = None diff --git a/openedx/core/djangoapps/theming/tests/test_middleware.py b/openedx/core/djangoapps/theming/tests/test_middleware.py index a71c648d42..72fa17bc5b 100644 --- a/openedx/core/djangoapps/theming/tests/test_middleware.py +++ b/openedx/core/djangoapps/theming/tests/test_middleware.py @@ -30,11 +30,16 @@ class TestCurrentSiteThemeMiddleware(TestCase): self.site_theme_middleware = CurrentSiteThemeMiddleware() self.user = UserFactory.create() - def create_mock_get_request(self): + def create_mock_get_request(self, qs_theme=None): """ Returns a mock GET request. """ - request = RequestFactory().get(TEST_URL) + if qs_theme: + test_url = "{}?site_theme={}".format(TEST_URL, qs_theme) + else: + test_url = TEST_URL + + request = RequestFactory().get(test_url) self.initialize_mock_request(request) return request @@ -87,7 +92,12 @@ class TestCurrentSiteThemeMiddleware(TestCase): self.initialize_mock_request(post_request) set_user_preview_site_theme(post_request, None) - # Finally verify that no theme is returned + # Verify that no theme is returned now get_request = self.create_mock_get_request() self.assertEqual(self.site_theme_middleware.process_request(get_request), None) self.assertIsNone(get_request.site_theme) + + # Verify that we can still force the theme with a querystring arg + get_request = self.create_mock_get_request(qs_theme=TEST_THEME_NAME) + self.assertEqual(self.site_theme_middleware.process_request(get_request), None) + self.assertEqual(get_request.site_theme.theme_dir_name, TEST_THEME_NAME)