From b4a1840344bbeeff095ef4a214c6d693831bb408 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Wed, 20 Nov 2013 09:36:25 -0500 Subject: [PATCH] Move xmodule_runtime.xmodule_instance registration earlier This allows XModules (specifically CombinedOpenEnded) to use ajax_url during their init functions (which would, before, have thrown an exception). [LMS-1493] --- common/lib/xmodule/xmodule/abtest_module.py | 2 +- common/lib/xmodule/xmodule/annotatable_module.py | 2 +- common/lib/xmodule/xmodule/capa_module.py | 2 +- common/lib/xmodule/xmodule/combined_open_ended_module.py | 2 +- common/lib/xmodule/xmodule/crowdsource_hinter.py | 2 +- common/lib/xmodule/xmodule/foldit_module.py | 2 +- common/lib/xmodule/xmodule/randomize_module.py | 2 +- common/lib/xmodule/xmodule/seq_module.py | 2 +- common/lib/xmodule/xmodule/tests/test_capa_module.py | 1 - common/lib/xmodule/xmodule/tests/test_combined_open_ended.py | 5 +---- common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py | 1 - common/lib/xmodule/xmodule/tests/test_peer_grading.py | 1 - common/lib/xmodule/xmodule/timelimit_module.py | 3 --- common/lib/xmodule/xmodule/vertical_module.py | 3 --- common/lib/xmodule/xmodule/x_module.py | 4 +++- 15 files changed, 12 insertions(+), 22 deletions(-) diff --git a/common/lib/xmodule/xmodule/abtest_module.py b/common/lib/xmodule/xmodule/abtest_module.py index c0a53d048f..06d4e0b2d2 100644 --- a/common/lib/xmodule/xmodule/abtest_module.py +++ b/common/lib/xmodule/xmodule/abtest_module.py @@ -45,7 +45,7 @@ class ABTestModule(ABTestFields, XModule): """ def __init__(self, *args, **kwargs): - XModule.__init__(self, *args, **kwargs) + super(ABTestModule, self).__init__(*args, **kwargs) if self.group is None: self.group = group_from_value( diff --git a/common/lib/xmodule/xmodule/annotatable_module.py b/common/lib/xmodule/xmodule/annotatable_module.py index ca85065577..fbc175b5b9 100644 --- a/common/lib/xmodule/xmodule/annotatable_module.py +++ b/common/lib/xmodule/xmodule/annotatable_module.py @@ -50,7 +50,7 @@ class AnnotatableModule(AnnotatableFields, XModule): icon_class = 'annotatable' def __init__(self, *args, **kwargs): - XModule.__init__(self, *args, **kwargs) + super(AnnotatableModule, self).__init__(*args, **kwargs) xmltree = etree.fromstring(self.data) diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index 6d664acbf6..cf6c2e3dce 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -190,7 +190,7 @@ class CapaModule(CapaFields, XModule): """ Accepts the same arguments as xmodule.x_module:XModule.__init__ """ - XModule.__init__(self, *args, **kwargs) + super(CapaModule, self).__init__(*args, **kwargs) due_date = self.due diff --git a/common/lib/xmodule/xmodule/combined_open_ended_module.py b/common/lib/xmodule/xmodule/combined_open_ended_module.py index 6dc2ac045b..68a0d65617 100644 --- a/common/lib/xmodule/xmodule/combined_open_ended_module.py +++ b/common/lib/xmodule/xmodule/combined_open_ended_module.py @@ -412,7 +412,7 @@ class CombinedOpenEndedModule(CombinedOpenEndedFields, XModule): See DEFAULT_DATA for a sample. """ - XModule.__init__(self, *args, **kwargs) + super(CombinedOpenEndedModule, self).__init__(*args, **kwargs) self.system.set('location', self.location) diff --git a/common/lib/xmodule/xmodule/crowdsource_hinter.py b/common/lib/xmodule/xmodule/crowdsource_hinter.py index 62bfe5b586..5a1091f6fb 100644 --- a/common/lib/xmodule/xmodule/crowdsource_hinter.py +++ b/common/lib/xmodule/xmodule/crowdsource_hinter.py @@ -75,7 +75,7 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): js_module_name = "Hinter" def __init__(self, *args, **kwargs): - XModule.__init__(self, *args, **kwargs) + super(CrowdsourceHinterModule, self).__init__(*args, **kwargs) # We need to know whether we are working with a FormulaResponse problem. try: responder = self.get_display_items()[0].lcp.responders.values()[0] diff --git a/common/lib/xmodule/xmodule/foldit_module.py b/common/lib/xmodule/xmodule/foldit_module.py index e1714ff96b..655ff1911a 100644 --- a/common/lib/xmodule/xmodule/foldit_module.py +++ b/common/lib/xmodule/xmodule/foldit_module.py @@ -39,7 +39,7 @@ class FolditModule(FolditFields, XModule): required_sublevel_half_credit="3" show_leaderboard="false"/> """ - XModule.__init__(self, *args, **kwargs) + super(FolditModule, self).__init__(*args, **kwargs) self.due_time = self.due def is_complete(self): diff --git a/common/lib/xmodule/xmodule/randomize_module.py b/common/lib/xmodule/xmodule/randomize_module.py index 00baf3f140..71d23012d1 100644 --- a/common/lib/xmodule/xmodule/randomize_module.py +++ b/common/lib/xmodule/xmodule/randomize_module.py @@ -39,7 +39,7 @@ class RandomizeModule(RandomizeFields, XModule): modules. """ def __init__(self, *args, **kwargs): - XModule.__init__(self, *args, **kwargs) + super(RandomizeModule, self).__init__(*args, **kwargs) # NOTE: calling self.get_children() creates a circular reference-- # it calls get_child_descriptors() internally, but that doesn't work until diff --git a/common/lib/xmodule/xmodule/seq_module.py b/common/lib/xmodule/xmodule/seq_module.py index 291d7a1ea1..62e93cb90e 100644 --- a/common/lib/xmodule/xmodule/seq_module.py +++ b/common/lib/xmodule/xmodule/seq_module.py @@ -38,7 +38,7 @@ class SequenceModule(SequenceFields, XModule): def __init__(self, *args, **kwargs): - XModule.__init__(self, *args, **kwargs) + super(SequenceModule, self).__init__(*args, **kwargs) # if position is specified in system, then use that instead if getattr(self.system, 'position', None) is not None: diff --git a/common/lib/xmodule/xmodule/tests/test_capa_module.py b/common/lib/xmodule/xmodule/tests/test_capa_module.py index 889376ba42..73d2eb111f 100644 --- a/common/lib/xmodule/xmodule/tests/test_capa_module.py +++ b/common/lib/xmodule/xmodule/tests/test_capa_module.py @@ -133,7 +133,6 @@ class CapaFactory(object): DictFieldData(field_data), ScopeIds(None, None, location, location), ) - system.xmodule_instance = module if correct: # TODO: probably better to actually set the internal state properly, but... diff --git a/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py b/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py index 07e0a9183e..e1b2a4ebe2 100644 --- a/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py +++ b/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py @@ -664,7 +664,6 @@ class CombinedOpenEndedModuleTest(unittest.TestCase): static_data=self.static_data, metadata=self.metadata, instance_state=instance_state) - self.test_system.xmodule_instance = module return combinedoe def ai_state_reset(self, task_state, task_number=None): @@ -717,6 +716,7 @@ class CombinedOpenEndedModuleTest(unittest.TestCase): def test_state_pe_single(self): self.ai_state_success(TEST_STATE_PE_SINGLE, iscore=0, tasks=[self.task_xml2]) + class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): """ Test the student flow in the combined open ended xmodule @@ -764,7 +764,6 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): task_one_json = json.loads(self._module().task_states[0]) self.assertEqual(task_one_json['child_history'][0]['answer'], self.answer) - @unittest.expectedFailure def test_open_ended_flow_reset(self): """ Test the flow of the module if we complete the self assessment step and then reset @@ -803,7 +802,6 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): self._handle_ajax("reset", {}) self.assertEqual(self._module().current_task_number, 0) - @unittest.expectedFailure def test_open_ended_flow_correct(self): """ Test a two step problem where the student first goes through the self assessment step, and then the @@ -915,7 +913,6 @@ class OpenEndedModuleXmlAttemptTest(unittest.TestCase, DummyModulestore): def _module(self): return self.get_module_from_location(self.problem_location, COURSE) - @unittest.expectedFailure def test_reset_fail(self): """ Test the flow of the module if we complete the self assessment step and then reset diff --git a/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py b/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py index d73c79035d..33fc264ff9 100644 --- a/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py +++ b/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py @@ -143,7 +143,6 @@ class CHModuleFactory(object): return capa_module system.get_module = fake_get_module module = CrowdsourceHinterModule(descriptor, system, DictFieldData(field_data), Mock()) - system.xmodule_instance = module return module diff --git a/common/lib/xmodule/xmodule/tests/test_peer_grading.py b/common/lib/xmodule/xmodule/tests/test_peer_grading.py index e7f820d7f0..66929c19d6 100644 --- a/common/lib/xmodule/xmodule/tests/test_peer_grading.py +++ b/common/lib/xmodule/xmodule/tests/test_peer_grading.py @@ -288,7 +288,6 @@ class PeerGradingModuleLinkedTest(unittest.TestCase, DummyModulestore): self.field_data, self.scope_ids, ) - test_system.xmodule_instance = peer_grading return peer_grading diff --git a/common/lib/xmodule/xmodule/timelimit_module.py b/common/lib/xmodule/xmodule/timelimit_module.py index e1c4042dc0..73744b5e8b 100644 --- a/common/lib/xmodule/xmodule/timelimit_module.py +++ b/common/lib/xmodule/xmodule/timelimit_module.py @@ -31,9 +31,6 @@ class TimeLimitModule(TimeLimitFields, XModule): Wrapper module which imposes a time constraint for the completion of its child. ''' - def __init__(self, *args, **kwargs): - XModule.__init__(self, *args, **kwargs) - # For a timed activity, we are only interested here # in time-related accommodations, and these should be disjoint. # (For proctored exams, it is possible to have multiple accommodations diff --git a/common/lib/xmodule/xmodule/vertical_module.py b/common/lib/xmodule/xmodule/vertical_module.py index 0879e3bba3..0053cb5ca1 100644 --- a/common/lib/xmodule/xmodule/vertical_module.py +++ b/common/lib/xmodule/xmodule/vertical_module.py @@ -16,9 +16,6 @@ class VerticalFields(object): class VerticalModule(VerticalFields, XModule): ''' Layout module for laying out submodules vertically.''' - def __init__(self, *args, **kwargs): - XModule.__init__(self, *args, **kwargs) - def student_view(self, context): fragment = Fragment() contents = [] diff --git a/common/lib/xmodule/xmodule/x_module.py b/common/lib/xmodule/xmodule/x_module.py index 055033a3bb..e644185c8c 100644 --- a/common/lib/xmodule/xmodule/x_module.py +++ b/common/lib/xmodule/xmodule/x_module.py @@ -392,6 +392,7 @@ class XModule(XModuleMixin, HTMLSnippet, XBlock): # pylint: disable=abstract-me super(XModule, self).__init__(*args, **kwargs) self._loaded_children = None self.system = self.runtime + self.runtime.xmodule_instance = self def __unicode__(self): return u''.format(self.id) @@ -737,7 +738,7 @@ class XModuleDescriptor(XModuleMixin, HTMLSnippet, ResourceTemplates, XBlock): assert self.xmodule_runtime.error_descriptor_class is not None if self.xmodule_runtime.xmodule_instance is None: try: - self.xmodule_runtime.xmodule_instance = self.xmodule_runtime.construct_xblock_from_class( + self.xmodule_runtime.construct_xblock_from_class( self.module_class, descriptor=self, scope_ids=self.scope_ids, @@ -1041,6 +1042,7 @@ class ModuleSystem(ConfigurableFragmentWrapper, Runtime): # pylint: disable=abs """ The url prefix to be used by XModules to call into handle_ajax """ + assert self.xmodule_instance is not None return self.handler_url(self.xmodule_instance, 'xmodule_handler', '', '').rstrip('/?')