Commit 9dce9d1e by chrisndodge

Merge pull request #755 from edx/fix/cdodge/STUD-671

update the PDF textbook url paths as well as update wiki_slug when impor...
parents deb55380 596fed78
...@@ -1475,12 +1475,14 @@ class ContentStoreTest(ModuleStoreTestCase): ...@@ -1475,12 +1475,14 @@ class ContentStoreTest(ModuleStoreTestCase):
'run': target_location.name 'run': target_location.name
} }
target_course_id = '{0}/{1}/{2}'.format(target_location.org, target_location.course, target_location.name)
resp = self.client.post(reverse('create_new_course'), course_data) resp = self.client.post(reverse('create_new_course'), course_data)
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
data = parse_json(resp) data = parse_json(resp)
self.assertEqual(data['id'], target_location.url()) self.assertEqual(data['id'], target_location.url())
import_from_xml(module_store, 'common/test/data/', ['simple'], target_location_namespace=target_location) import_from_xml(module_store, 'common/test/data/', ['toy'], target_location_namespace=target_location)
modules = module_store.get_items(Location([ modules = module_store.get_items(Location([
target_location.tag, target_location.org, target_location.course, None, None, None])) target_location.tag, target_location.org, target_location.course, None, None, None]))
...@@ -1489,6 +1491,21 @@ class ContentStoreTest(ModuleStoreTestCase): ...@@ -1489,6 +1491,21 @@ class ContentStoreTest(ModuleStoreTestCase):
# we can't specify an exact number since it'll always be changing # we can't specify an exact number since it'll always be changing
self.assertGreater(len(modules), 10) self.assertGreater(len(modules), 10)
#
# test various re-namespacing elements
#
# first check PDF textbooks, to make sure the url paths got updated
course_module = module_store.get_instance(target_course_id, target_location)
self.assertEquals(len(course_module.pdf_textbooks), 1)
self.assertEquals(len(course_module.pdf_textbooks[0]["chapters"]), 2)
self.assertEquals(course_module.pdf_textbooks[0]["chapters"][0]["url"], '/c4x/MITx/999/asset/Chapter1.pdf')
self.assertEquals(course_module.pdf_textbooks[0]["chapters"][1]["url"], '/c4x/MITx/999/asset/Chapter2.pdf')
# check that URL slug got updated to new course slug
self.assertEquals(course_module.wiki_slug, '999')
def test_import_metadata_with_attempts_empty_string(self): def test_import_metadata_with_attempts_empty_string(self):
module_store = modulestore('direct') module_store = modulestore('direct')
import_from_xml(module_store, 'common/test/data/', ['simple']) import_from_xml(module_store, 'common/test/data/', ['simple'])
......
...@@ -59,6 +59,23 @@ class StaticContent(object): ...@@ -59,6 +59,23 @@ class StaticContent(object):
return None return None
@staticmethod @staticmethod
def is_c4x_path(path_string):
"""
Returns a boolean if a path is believed to be a c4x link based on the leading element
"""
return path_string.startswith('/{0}/'.format(XASSET_LOCATION_TAG))
@staticmethod
def renamespace_c4x_path(path_string, target_location):
"""
Returns an updated string which incorporates a new org/course in order to remap an asset path
to a new namespace
"""
location = StaticContent.get_location_from_path(path_string)
location = location.replace(org=target_location.org, course=target_location.course)
return StaticContent.get_url_path_from_location(location)
@staticmethod
def get_static_path_from_location(location): def get_static_path_from_location(location):
""" """
This utility static method will take a location identifier and create a 'durable' /static/.. URL representation of it. This utility static method will take a location identifier and create a 'durable' /static/.. URL representation of it.
......
...@@ -329,8 +329,28 @@ def remap_namespace(module, target_location_namespace): ...@@ -329,8 +329,28 @@ def remap_namespace(module, target_location_namespace):
module.location = module.location._replace(tag=target_location_namespace.tag, org=target_location_namespace.org, module.location = module.location._replace(tag=target_location_namespace.tag, org=target_location_namespace.org,
course=target_location_namespace.course) course=target_location_namespace.course)
else: else:
original_location = module.location
#
# module is a course module
#
module.location = module.location._replace(tag=target_location_namespace.tag, org=target_location_namespace.org, module.location = module.location._replace(tag=target_location_namespace.tag, org=target_location_namespace.org,
course=target_location_namespace.course, name=target_location_namespace.name) course=target_location_namespace.course, name=target_location_namespace.name)
#
# There is more re-namespacing work we have to do when importing course modules
#
# remap pdf_textbook urls
for entry in module.pdf_textbooks:
for chapter in entry.get('chapters', []):
if StaticContent.is_c4x_path(chapter.get('url', '')):
chapter['url'] = StaticContent.renamespace_c4x_path(chapter['url'], target_location_namespace)
# if there is a wiki_slug which is the same as the original location (aka default value),
# then remap that so the wiki doesn't point to the old Wiki.
if module.wiki_slug == original_location.course:
module.wiki_slug = target_location_namespace.course
module.save()
# then remap children pointers since they too will be re-namespaced # then remap children pointers since they too will be re-namespaced
if hasattr(module, 'children'): if hasattr(module, 'children'):
......
...@@ -12,7 +12,16 @@ ...@@ -12,7 +12,16 @@
{"type": "discussion", "name": "Discussion"}, {"type": "discussion", "name": "Discussion"},
{"type": "wiki", "name": "Wiki"}, {"type": "wiki", "name": "Wiki"},
{"type": "progress", "name": "Progress"} {"type": "progress", "name": "Progress"}
] ],
"pdf_textbooks": [
{
"tab_title": "Sample Multi Chapter Textbook",
"id": "MyTextbook",
"chapters": [
{ "url": "/c4x/edX/toy/asset/Chapter1.pdf", "title": "Chapter 1"},
{ "url": "/c4x/edX/toy/asset/Chapter2.pdf", "title": "Chapter 2"}
]
}]
}, },
"chapter/Overview": { "chapter/Overview": {
"display_name": "Overview" "display_name": "Overview"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment