diff --git a/cms/djangoapps/contentstore/tests/tests.py b/cms/djangoapps/contentstore/tests/tests.py index d0b8261908..2597ac64fd 100644 --- a/cms/djangoapps/contentstore/tests/tests.py +++ b/cms/djangoapps/contentstore/tests/tests.py @@ -350,6 +350,21 @@ class ContentStoreTest(TestCase): def test_edit_unit_full(self): self.check_edit_unit('full') + def test_about_overrides(self): + ''' + This test case verifies that a course can use specialized override for about data, e.g. /about/Fall_2012/effort.html + while there is a base definition in /about/effort.html + ''' + import_from_xml(modulestore(), 'common/test/data/', ['full']) + ms = modulestore('direct') + effort = ms.get_item(Location(['i4x','edX','full','about','effort', None])) + self.assertEqual(effort.definition['data'],'6 hours') + + # this one should be in a non-override folder + effort = ms.get_item(Location(['i4x','edX','full','about','end_date', None])) + self.assertEqual(effort.definition['data'],'TBD') + + def test_clone_course(self): import_from_xml(modulestore(), 'common/test/data/', ['full']) diff --git a/common/lib/xmodule/xmodule/modulestore/xml.py b/common/lib/xmodule/xmodule/modulestore/xml.py index 77cbc00f6e..b7f0c726e4 100644 --- a/common/lib/xmodule/xmodule/modulestore/xml.py +++ b/common/lib/xmodule/xmodule/modulestore/xml.py @@ -444,33 +444,39 @@ class XMLModuleStore(ModuleStoreBase): log.debug('========> Done with course import from {0}'.format(course_dir)) return course_descriptor - def load_extra_content(self, system, course_descriptor, category, base_dir, course_dir, url_name): - if url_name: - path = base_dir / url_name - if not os.path.exists(path): - path = base_dir + def load_extra_content(self, system, course_descriptor, category, base_dir, course_dir, url_name): + + self._load_extra_content(system, course_descriptor, category, base_dir, course_dir) + + # then look in a override folder based on the course run + if os.path.isdir(base_dir / url_name): + self._load_extra_content(system, course_descriptor, category, base_dir / url_name, course_dir) + + + def _load_extra_content(self, system, course_descriptor, category, path, course_dir): for filepath in glob.glob(path/ '*'): - with open(filepath) as f: - try: - html = f.read().decode('utf-8') - # tabs are referenced in policy.json through a 'slug' which is just the filename without the .html suffix - slug = os.path.splitext(os.path.basename(filepath))[0] - loc = Location('i4x', course_descriptor.location.org, course_descriptor.location.course, category, slug) - module = HtmlDescriptor(system, definition={'data' : html}, **{'location' : loc}) - # VS[compat]: - # Hack because we need to pull in the 'display_name' for static tabs (because we need to edit them) - # from the course policy - if category == "static_tab": - for tab in course_descriptor.tabs or []: - if tab.get('url_slug') == slug: - module.metadata['display_name'] = tab['name'] - module.metadata['data_dir'] = course_dir - self.modules[course_descriptor.id][module.location] = module - except Exception, e: - logging.exception("Failed to load {0}. Skipping... Exception: {1}".format(filepath, str(e))) - system.error_tracker("ERROR: " + str(e)) + if not os.path.isdir(filepath): + with open(filepath) as f: + try: + html = f.read().decode('utf-8') + # tabs are referenced in policy.json through a 'slug' which is just the filename without the .html suffix + slug = os.path.splitext(os.path.basename(filepath))[0] + loc = Location('i4x', course_descriptor.location.org, course_descriptor.location.course, category, slug) + module = HtmlDescriptor(system, definition={'data' : html}, **{'location' : loc}) + # VS[compat]: + # Hack because we need to pull in the 'display_name' for static tabs (because we need to edit them) + # from the course policy + if category == "static_tab": + for tab in course_descriptor.tabs or []: + if tab.get('url_slug') == slug: + module.metadata['display_name'] = tab['name'] + module.metadata['data_dir'] = course_dir + self.modules[course_descriptor.id][module.location] = module + except Exception, e: + logging.exception("Failed to load {0}. Skipping... Exception: {1}".format(filepath, str(e))) + system.error_tracker("ERROR: " + str(e)) def get_instance(self, course_id, location, depth=0): """ diff --git a/common/test/data/full/about/6.002_Spring_2012/effort.html b/common/test/data/full/about/6.002_Spring_2012/effort.html new file mode 100644 index 0000000000..3ef8bf8ce1 --- /dev/null +++ b/common/test/data/full/about/6.002_Spring_2012/effort.html @@ -0,0 +1 @@ +6 hours \ No newline at end of file diff --git a/common/test/data/full/about/effort.html b/common/test/data/full/about/effort.html new file mode 100644 index 0000000000..c983fdcb5c --- /dev/null +++ b/common/test/data/full/about/effort.html @@ -0,0 +1 @@ +12 hours \ No newline at end of file diff --git a/common/test/data/full/about/end_date.html b/common/test/data/full/about/end_date.html new file mode 100644 index 0000000000..2fd9f95700 --- /dev/null +++ b/common/test/data/full/about/end_date.html @@ -0,0 +1 @@ +TBD \ No newline at end of file