From 1b1c7235d15393cdb147ecadc9d5f60dadf0235a Mon Sep 17 00:00:00 2001 From: Tyler Hallada Date: Mon, 6 Nov 2017 11:30:46 -0500 Subject: [PATCH 1/2] absolute_url returns given URL if already absolute --- openedx/core/djangoapps/schedules/template_context.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openedx/core/djangoapps/schedules/template_context.py b/openedx/core/djangoapps/schedules/template_context.py index d0b86f3d4b..344aaa2f5b 100644 --- a/openedx/core/djangoapps/schedules/template_context.py +++ b/openedx/core/djangoapps/schedules/template_context.py @@ -31,6 +31,13 @@ def encode_url(url): def absolute_url(site, relative_path): + """Add site.domain to the beginning of the given relative path. + + If the given URL is already absolute (has a netloc part), then it is just returned. + """ + if bool(urlparse(relative_path).netloc): + # Given URL is already absolute + return relative_path root = site.domain.rstrip('/') relative_path = relative_path.lstrip('/') return encode_url(u'https://{root}/{path}'.format(root=root, path=relative_path)) From 1f88d528bd1e30e3c0c8bb67311b02d542157fe7 Mon Sep 17 00:00:00 2001 From: Tyler Hallada Date: Mon, 6 Nov 2017 13:17:52 -0500 Subject: [PATCH 2/2] Add unit tests for absolute_url --- .../djangoapps/schedules/template_context.py | 3 ++- .../schedules/tests/test_template_context.py | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 openedx/core/djangoapps/schedules/tests/test_template_context.py diff --git a/openedx/core/djangoapps/schedules/template_context.py b/openedx/core/djangoapps/schedules/template_context.py index 344aaa2f5b..de70959d45 100644 --- a/openedx/core/djangoapps/schedules/template_context.py +++ b/openedx/core/djangoapps/schedules/template_context.py @@ -31,7 +31,8 @@ def encode_url(url): def absolute_url(site, relative_path): - """Add site.domain to the beginning of the given relative path. + """ + Add site.domain to the beginning of the given relative path. If the given URL is already absolute (has a netloc part), then it is just returned. """ diff --git a/openedx/core/djangoapps/schedules/tests/test_template_context.py b/openedx/core/djangoapps/schedules/tests/test_template_context.py new file mode 100644 index 0000000000..d116530c79 --- /dev/null +++ b/openedx/core/djangoapps/schedules/tests/test_template_context.py @@ -0,0 +1,23 @@ +from openedx.core.djangoapps.schedules.template_context import absolute_url +from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory +from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, skip_unless_lms + + +@skip_unless_lms +class TestTemplateContext(CacheIsolationTestCase): + def setUp(self): + self.site = SiteFactory.create() + self.site.domain = 'example.com' + + def test_absolute_url(self): + absolute = absolute_url(self.site, '/foo/bar') + self.assertEqual(absolute, 'https://example.com/foo/bar') + + def test_absolute_url_domain_lstrip(self): + self.site.domain = 'example.com/' + absolute = absolute_url(self.site, 'foo/bar') + self.assertEqual(absolute, 'https://example.com/foo/bar') + + def test_absolute_url_already_absolute(self): + absolute = absolute_url(self.site, 'https://some-cdn.com/foo/bar') + self.assertEqual(absolute, 'https://some-cdn.com/foo/bar')