From 2da6bf596dd316b2b0c020c957e804773dca4834 Mon Sep 17 00:00:00 2001 From: Omar Al-Ithawi Date: Wed, 20 Nov 2019 16:40:19 +0200 Subject: [PATCH] Make studio file uploads site aware --- cms/djangoapps/contentstore/views/assets.py | 14 ++++++- .../contentstore/views/tests/test_assets.py | 39 +++++++++++++------ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/cms/djangoapps/contentstore/views/assets.py b/cms/djangoapps/contentstore/views/assets.py index 773d4d9f9010..3f706dbce03a 100644 --- a/cms/djangoapps/contentstore/views/assets.py +++ b/cms/djangoapps/contentstore/views/assets.py @@ -28,6 +28,9 @@ from util.date_utils import get_default_time_display from util.json_request import JsonResponse +from openedx.core.djangoapps.appsembler.api.sites import get_site_for_course + + __all__ = ['assets_handler'] REQUEST_DEFAULTS = { @@ -572,7 +575,16 @@ def _get_asset_json(display_name, content_type, date, location, thumbnail_locati Helper method for formatting the asset information to send to client. ''' asset_url = StaticContent.serialize_asset_key_with_slash(location) - external_url = settings.LMS_BASE + asset_url + + domain = settings.LMS_BASE + site_for_course = get_site_for_course(location.course_key) + if site_for_course: + domain = site_for_course.domain + + external_url = '//{domain}{asset_url}'.format( + domain=domain, + asset_url=asset_url, + ) return { 'display_name': display_name, 'content_type': content_type, diff --git a/cms/djangoapps/contentstore/views/tests/test_assets.py b/cms/djangoapps/contentstore/views/tests/test_assets.py index 98ffa0b83b0f..fc9eb8e83a4a 100644 --- a/cms/djangoapps/contentstore/views/tests/test_assets.py +++ b/cms/djangoapps/contentstore/views/tests/test_assets.py @@ -410,29 +410,44 @@ class AssetToJsonTestCase(AssetsTestCase): Unit test for transforming asset information into something we can send out to the client via JSON. """ - @override_settings(LMS_BASE="lms_base_url") - def test_basic(self): - upload_date = datetime(2013, 6, 1, 10, 30, tzinfo=UTC) - content_type = 'image/jpg' - course_key = CourseLocator('org', 'class', 'run') - location = course_key.make_asset_key('asset', 'my_file_name.jpg') - thumbnail_location = course_key.make_asset_key('thumbnail', 'my_file_name_thumb.jpg') + upload_date = datetime(2013, 6, 1, 10, 30, tzinfo=UTC) + content_type = 'image/jpg' + course_key = CourseLocator('org', 'class', 'run') + location = course_key.make_asset_key('asset', 'my_file_name.jpg') + def make_asset(self): + thumbnail_location = self.course_key.make_asset_key('thumbnail', 'my_file_name_thumb.jpg') # pylint: disable=protected-access - output = assets._get_asset_json("my_file", content_type, upload_date, location, thumbnail_location, True) + return assets._get_asset_json( + "my_file", + self.content_type, + self.upload_date, + self.location, + thumbnail_location, + True, + ) + @override_settings(LMS_BASE="lms_base_url") + def test_basic(self): + output = self.make_asset() self.assertEquals(output["display_name"], "my_file") self.assertEquals(output["date_added"], "Jun 01, 2013 at 10:30 UTC") self.assertEquals(output["url"], "/asset-v1:org+class+run+type@asset+block@my_file_name.jpg") - self.assertEquals(output["external_url"], "lms_base_url/asset-v1:org+class+run+type@asset+block@my_file_name.jpg") + self.assertEquals(output["external_url"], "//lms_base_url/asset-v1:org+class+run+type@asset+block@my_file_name.jpg") self.assertEquals(output["portable_url"], "/static/my_file_name.jpg") self.assertEquals(output["thumbnail"], "/asset-v1:org+class+run+type@thumbnail+block@my_file_name_thumb.jpg") - self.assertEquals(output["id"], unicode(location)) + self.assertEquals(output["id"], unicode(self.location)) self.assertEquals(output['locked'], True) - - output = assets._get_asset_json("name", content_type, upload_date, location, None, False) + # pylint: disable=protected-access + output = assets._get_asset_json("name", self.content_type, self.upload_date, self.location, None, False) self.assertIsNone(output["thumbnail"]) + @override_settings(LMS_BASE="lms_base_url") + @patch('contentstore.views.assets.get_site_for_course', mock.Mock(return_value=mock.Mock(domain='site_domain'))) + def test_site_url(self): + output = self.make_asset() + assert output["external_url"] == "//site_domain/asset-v1:org+class+run+type@asset+block@my_file_name.jpg" + class LockAssetTestCase(AssetsTestCase): """