From bd188f92ef59b23235a396bbc139aa6362bd99e0 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Wed, 20 Feb 2013 16:20:39 -0500 Subject: [PATCH] put back the inheritable_metadata list into the XModuleDescriptor class. Also extend the metadata_inheritance test case --- .../contentstore/tests/test_contentstore.py | 17 +++++++++++ .../lib/xmodule/xmodule/modulestore/mongo.py | 4 +-- common/lib/xmodule/xmodule/x_module.py | 30 +++++++++---------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index f2a3443648..45a57f6156 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -431,6 +431,11 @@ class ContentStoreTest(ModuleStoreTestCase): verticals = ms.get_items(['i4x', 'edX', 'full', 'vertical', None, None]) + # let's assert on the metadata_inheritance on an existing vertical + for vertical in verticals: + self.assertIn('xqa_key', vertical.metadata) + self.assertEqual(course.metadata['xqa_key'], vertical.metadata['xqa_key']) + self.assertGreater(len(verticals), 0) new_component_location = Location('i4x', 'edX', 'full', 'html', 'new_component') @@ -450,6 +455,18 @@ class ContentStoreTest(ModuleStoreTestCase): self.assertEqual(course.metadata['graceperiod'], new_module.metadata['graceperiod']) + # + # now let's define an override at the leaf node level + # + new_module.metadata['graceperiod'] = '1 day' + ms.update_metadata(new_module.location, new_module.metadata) + + # flush the cache and refetch + ms.get_cached_metadata_inheritance_tree(new_component_location, -1) + new_module = ms.get_item(new_component_location) + + self.assertIn('graceperiod', new_module.metadata) + self.assertEqual('1 day', new_module.metadata['graceperiod']) class TemplateTestCase(ModuleStoreTestCase): diff --git a/common/lib/xmodule/xmodule/modulestore/mongo.py b/common/lib/xmodule/xmodule/modulestore/mongo.py index 3a889be201..86540571d1 100644 --- a/common/lib/xmodule/xmodule/modulestore/mongo.py +++ b/common/lib/xmodule/xmodule/modulestore/mongo.py @@ -11,7 +11,7 @@ from datetime import datetime, timedelta from importlib import import_module from xmodule.errortracker import null_error_tracker, exc_info_to_str -from xmodule.x_module import XModuleDescriptor, inheritable_metadata +from xmodule.x_module import XModuleDescriptor from xmodule.mako_module import MakoDescriptorSystem from xmodule.error_module import ErrorDescriptor @@ -185,7 +185,7 @@ class MongoModuleStore(ModuleStoreBase): def _compute_inherited_metadata(url): my_metadata = results_by_url[url]['metadata'] for key in my_metadata.keys(): - if key not in inheritable_metadata: + if key not in XModuleDescriptor.inheritable_metadata: del my_metadata[key] results_by_url[url]['metadata'] = my_metadata diff --git a/common/lib/xmodule/xmodule/x_module.py b/common/lib/xmodule/xmodule/x_module.py index 0dd5488495..42a94d2d44 100644 --- a/common/lib/xmodule/xmodule/x_module.py +++ b/common/lib/xmodule/xmodule/x_module.py @@ -411,20 +411,6 @@ class ResourceTemplates(object): return templates -# A list of metadata that this module can inherit from its parent module -inheritable_metadata = ( - 'graded', 'start', 'due', 'graceperiod', 'showanswer', 'rerandomize', - # TODO (ichuang): used for Fall 2012 xqa server access - 'xqa_key', - # TODO: This is used by the XMLModuleStore to provide for locations for - # static files, and will need to be removed when that code is removed - 'data_dir', - # How many days early to show a course element to beta testers (float) - # intended to be set per-course, but can be overridden in for specific - # elements. Can be a float. - 'days_early_for_beta' -) - class XModuleDescriptor(Plugin, HTMLSnippet, ResourceTemplates): """ An XModuleDescriptor is a specification for an element of a course. This @@ -446,6 +432,20 @@ class XModuleDescriptor(Plugin, HTMLSnippet, ResourceTemplates): # It should respond to max_score() and grade(). It can be graded or ungraded # (like a practice problem). + # A list of metadata that this module can inherit from its parent module + inheritable_metadata = ( + 'graded', 'start', 'due', 'graceperiod', 'showanswer', 'rerandomize', + # TODO (ichuang): used for Fall 2012 xqa server access + 'xqa_key', + # TODO: This is used by the XMLModuleStore to provide for locations for + # static files, and will need to be removed when that code is removed + 'data_dir', + # How many days early to show a course element to beta testers (float) + # intended to be set per-course, but can be overridden in for specific + # elements. Can be a float. + 'days_early_for_beta' + ) + # cdodge: this is a list of metadata names which are 'system' metadata # and should not be edited by an end-user system_metadata_fields = ['data_dir', 'published_date', 'published_by', 'is_draft'] @@ -589,7 +589,7 @@ class XModuleDescriptor(Plugin, HTMLSnippet, ResourceTemplates): """ # Set all inheritable metadata from kwargs that are # in inheritable_metadata and aren't already set in metadata - for attr in inheritable_metadata: + for attr in self.inheritable_metadata: if attr not in self.metadata and attr in metadata: self._inherited_metadata.add(attr) self.metadata[attr] = metadata[attr]