diff --git a/common/lib/xmodule/x_module.py b/common/lib/xmodule/x_module.py index 91d1bce1f4e85701740d432bf66ecf4be463f39b..a2019cd5bf10d70bde54591c720a6eed42ab68b1 100644 --- a/common/lib/xmodule/x_module.py +++ b/common/lib/xmodule/x_module.py @@ -213,6 +213,7 @@ class XModuleDescriptor(Plugin): # A list of metadata that this module can inherit from its parent module inheritable_metadata = ('graded', 'due', 'graceperiod', 'showanswer', 'rerandomize') + # ============================= STRUCTURAL MANIPULATION =========================== def __init__(self, system, definition=None, @@ -253,6 +254,43 @@ class XModuleDescriptor(Plugin): self._child_instances = None + def inherit_metadata(self, metadata): + """ + Updates this module with metadata inherited from a containing module. + Only metadata specified in self.inheritable_metadata will + be inherited + """ + # Set all inheritable metadata from kwargs that are + # in self.inheritable_metadata and aren't already set in metadata + for attr in self.inheritable_metadata: + if attr not in self.metadata and attr in metadata: + self.metadata[attr] = metadata[attr] + + def get_children(self): + """Returns a list of XModuleDescriptor instances for the children of this module""" + if self._child_instances is None: + self._child_instances = [] + for child_loc in self.definition.get('children', []): + child = self.system.load_item(child_loc) + child.inherit_metadata(self.metadata) + self._child_instances.append(child) + + return self._child_instances + + def xmodule_constructor(self, system): + """ + Returns a constructor for an XModule. This constructor takes two arguments: + instance_state and shared_state, and returns a fully nstantiated XModule + """ + return partial( + self.module_class, + system, + self.location, + self.definition, + metadata=self.metadata + ) + + # ================================= JSON PARSING =================================== @staticmethod def load_from_json(json_data, system, default_class=None): """ @@ -280,6 +318,7 @@ class XModuleDescriptor(Plugin): """ return cls(system=system, **json_data) + # ================================= XML PARSING ==================================== @staticmethod def load_from_xml(xml_data, system, @@ -315,6 +354,20 @@ class XModuleDescriptor(Plugin): """ raise NotImplementedError('Modules must implement from_xml to be parsable from xml') + def export_to_xml(self, resource_fs): + """ + Returns an xml string representing this module, and all modules underneath it. + May also write required resources out to resource_fs + + Assumes that modules have single parantage (that no module appears twice in the same course), + and that it is thus safe to nest modules as xml children as appropriate. + + The returned XML should be able to be parsed back into an identical XModuleDescriptor + using the from_xml method with the same system, org, and course + """ + raise NotImplementedError('Modules must implement export_to_xml to enable xml export') + + # ================================== HTML INTERFACE DEFINITIONS ====================== @classmethod def get_javascript(cls): """ @@ -334,49 +387,12 @@ class XModuleDescriptor(Plugin): """ return self.js_module - - def inherit_metadata(self, metadata): - """ - Updates this module with metadata inherited from a containing module. - Only metadata specified in self.inheritable_metadata will - be inherited - """ - # Set all inheritable metadata from kwargs that are - # in self.inheritable_metadata and aren't already set in metadata - for attr in self.inheritable_metadata: - if attr not in self.metadata and attr in metadata: - self.metadata[attr] = metadata[attr] - - def get_children(self): - """Returns a list of XModuleDescriptor instances for the children of this module""" - if self._child_instances is None: - self._child_instances = [] - for child_loc in self.definition.get('children', []): - child = self.system.load_item(child_loc) - child.inherit_metadata(self.metadata) - self._child_instances.append(child) - - return self._child_instances - def get_html(self): """ Return the html used to edit this module """ raise NotImplementedError("get_html() must be provided by specific modules") - def xmodule_constructor(self, system): - """ - Returns a constructor for an XModule. This constructor takes two arguments: - instance_state and shared_state, and returns a fully nstantiated XModule - """ - return partial( - self.module_class, - system, - self.location, - self.definition, - metadata=self.metadata - ) - class DescriptorSystem(object): def __init__(self, load_item, resources_fs):