diff --git a/common/lib/xmodule/xmodule/abtest_module.py b/common/lib/xmodule/xmodule/abtest_module.py index c0a53d048f4f1cae54c64decec0c8e02caef7be1..06d4e0b2d245759901e4847d0aaeff8be18ee764 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 ca85065577e98214030e7a731054afff82d51704..fbc175b5b9778154a5f832b9397b54e1879e8f8c 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 6d664acbf6831a0a77fc0f45da21a4630507548a..cf6c2e3dce1759d06f337442f3bdc758657cd855 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 6dc2ac045bffe6922ab7aa7fe6ca0e158118dac8..68a0d65617c185853bc7a4c2e0146e814d53ad4b 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 62bfe5b586c62da7179c4eb0bb1e3473ad62a2f4..5a1091f6fb588dc44fa67293832a3f8c8c7ae064 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 e1714ff96b61453ff60ce63e9e4de620451f4ab6..655ff1911ab6160e2025fd982931e8511047da90 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/open_ended_grading_classes/combined_open_ended_modulev1.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py index 4a1715c48d93fd1d5a38dd393e975e39d100fc7f..72915eb7b36f5a46f464682228a4bfdf163d90fd 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py @@ -93,7 +93,6 @@ class CombinedOpenEndedV1Module(): Definition file should have one or many task blocks, a rubric block, and a prompt block. See DEFAULT_DATA in combined_open_ended_module for a sample. """ - self.instance_state = instance_state self.display_name = instance_state.get('display_name', "Open Ended") diff --git a/common/lib/xmodule/xmodule/randomize_module.py b/common/lib/xmodule/xmodule/randomize_module.py index 00baf3f140a2decae099b99009f9524b918b6589..71d23012d1a46daac72420e5fda102d337f7d8e1 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 291d7a1ea1553bd51c0b4faa16fdd9e962739144..62e93cb90e5e56e4dc413718077a31c87ae16877 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 889376ba4271b604a879613a0637029778bc573f..73d2eb111f6c80928364c54ad5a1d4074fdb5f69 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 b72eeab66b70f07ca5ef03151dccbadc91e55cc8..e1b2a4ebe241a90e17e2989fcf5719fc828890c1 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 @@ -726,31 +726,42 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): assessment = [0, 1] hint = "blah" - def setUp(self): - self.test_system = get_test_system() - self.test_system.open_ended_grading_interface = None - self.test_system.xqueue['interface'] = Mock( + def get_module_system(self, descriptor): + test_system = get_test_system() + test_system.open_ended_grading_interface = None + test_system.xqueue['interface'] = Mock( send_to_queue=Mock(side_effect=[1, "queued"]) ) + + return test_system + + def setUp(self): self.setup_modulestore(COURSE) + def _handle_ajax(self, dispatch, content): + # Load the module from persistence + module = self._module() + + # Call handle_ajax on the module + result = module.handle_ajax(dispatch, content) + + # Persist the state + module.save() + + return result + + def _module(self): + return self.get_module_from_location(self.problem_location, COURSE) + def test_open_ended_load_and_save(self): """ See if we can load the module and save an answer @return: """ - # Load the module - module = self.get_module_from_location(self.problem_location, COURSE) - # Try saving an answer - module.handle_ajax("save_answer", {"student_answer": self.answer}) - # Save our modifications to the underlying KeyValueStore so they can be persisted - module.save() - task_one_json = json.loads(module.task_states[0]) - self.assertEqual(task_one_json['child_history'][0]['answer'], self.answer) + self._handle_ajax("save_answer", {"student_answer": self.answer}) - module = self.get_module_from_location(self.problem_location, COURSE) - task_one_json = json.loads(module.task_states[0]) + task_one_json = json.loads(self._module().task_states[0]) self.assertEqual(task_one_json['child_history'][0]['answer'], self.answer) def test_open_ended_flow_reset(self): @@ -759,42 +770,37 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): @return: """ assessment = [0, 1] - module = self.get_module_from_location(self.problem_location, COURSE) # Simulate a student saving an answer - html = module.handle_ajax("get_html", {}) - module.save() - module.handle_ajax("save_answer", {"student_answer": self.answer}) - module.save() - html = module.handle_ajax("get_html", {}) - module.save() + self._handle_ajax("get_html", {}) + self._handle_ajax("save_answer", {"student_answer": self.answer}) + self._handle_ajax("get_html", {}) # Mock a student submitting an assessment assessment_dict = MultiDict({'assessment': sum(assessment)}) assessment_dict.extend(('score_list[]', val) for val in assessment) - module.handle_ajax("save_assessment", assessment_dict) - module.save() - task_one_json = json.loads(module.task_states[0]) + self._handle_ajax("save_assessment", assessment_dict) + + task_one_json = json.loads(self._module().task_states[0]) self.assertEqual(json.loads(task_one_json['child_history'][0]['post_assessment']), assessment) - rubric = module.handle_ajax("get_combined_rubric", {}) - module.save() + + self._handle_ajax("get_combined_rubric", {}) # Move to the next step in the problem - module.handle_ajax("next_problem", {}) - module.save() - self.assertEqual(module.current_task_number, 0) + self._handle_ajax("next_problem", {}) + self.assertEqual(self._module().current_task_number, 0) - html = module.render('student_view').content + html = self._module().render('student_view').content self.assertIsInstance(html, basestring) - rubric = module.handle_ajax("get_combined_rubric", {}) - module.save() + rubric = self._handle_ajax("get_combined_rubric", {}) self.assertIsInstance(rubric, basestring) - self.assertEqual(module.state, "assessing") - module.handle_ajax("reset", {}) - module.save() - self.assertEqual(module.current_task_number, 0) + + self.assertEqual(self._module().state, "assessing") + + self._handle_ajax("reset", {}) + self.assertEqual(self._module().current_task_number, 0) def test_open_ended_flow_correct(self): """ @@ -803,42 +809,36 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): @return: """ assessment = [1, 1] - # Load the module - module = self.get_module_from_location(self.problem_location, COURSE) # Simulate a student saving an answer - module.handle_ajax("save_answer", {"student_answer": self.answer}) - module.save() - status = module.handle_ajax("get_status", {}) - module.save() + self._handle_ajax("save_answer", {"student_answer": self.answer}) + status = self._handle_ajax("get_status", {}) self.assertIsInstance(status, basestring) # Mock a student submitting an assessment assessment_dict = MultiDict({'assessment': sum(assessment)}) assessment_dict.extend(('score_list[]', val) for val in assessment) - module.handle_ajax("save_assessment", assessment_dict) - module.save() - task_one_json = json.loads(module.task_states[0]) + self._handle_ajax("save_assessment", assessment_dict) + + task_one_json = json.loads(self._module().task_states[0]) self.assertEqual(json.loads(task_one_json['child_history'][0]['post_assessment']), assessment) # Move to the next step in the problem try: - module.handle_ajax("next_problem", {}) - module.save() + self._handle_ajax("next_problem", {}) except GradingServiceError: # This error is okay. We don't have a grading service to connect to! pass - self.assertEqual(module.current_task_number, 1) + self.assertEqual(self._module().current_task_number, 1) try: - module.render('student_view') + self._module().render('student_view') except GradingServiceError: # This error is okay. We don't have a grading service to connect to! pass # Try to get the rubric from the module - module.handle_ajax("get_combined_rubric", {}) - module.save() + self._handle_ajax("get_combined_rubric", {}) # Make a fake reply from the queue queue_reply = { @@ -856,29 +856,26 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore): }) } - module.handle_ajax("check_for_score", {}) - module.save() + self._handle_ajax("check_for_score", {}) # Update the module with the fake queue reply - module.handle_ajax("score_update", queue_reply) - module.save() + self._handle_ajax("score_update", queue_reply) + + module = self._module() self.assertFalse(module.ready_to_reset) self.assertEqual(module.current_task_number, 1) # Get html and other data client will request module.render('student_view') - module.handle_ajax("skip_post_assessment", {}) - module.save() + self._handle_ajax("skip_post_assessment", {}) # Get all results - module.handle_ajax("get_combined_rubric", {}) - module.save() + self._handle_ajax("get_combined_rubric", {}) # reset the problem - module.handle_ajax("reset", {}) - module.save() - self.assertEqual(module.state, "initial") + self._handle_ajax("reset", {}) + self.assertEqual(self._module().state, "initial") class OpenEndedModuleXmlAttemptTest(unittest.TestCase, DummyModulestore): @@ -890,14 +887,32 @@ class OpenEndedModuleXmlAttemptTest(unittest.TestCase, DummyModulestore): assessment = [0, 1] hint = "blah" - def setUp(self): - self.test_system = get_test_system() - self.test_system.open_ended_grading_interface = None - self.test_system.xqueue['interface'] = Mock( + def get_module_system(self, descriptor): + test_system = get_test_system() + test_system.open_ended_grading_interface = None + test_system.xqueue['interface'] = Mock( send_to_queue=Mock(side_effect=[1, "queued"]) ) + return test_system + + def setUp(self): self.setup_modulestore(COURSE) + def _handle_ajax(self, dispatch, content): + # Load the module from persistence + module = self._module() + + # Call handle_ajax on the module + result = module.handle_ajax(dispatch, content) + + # Persist the state + module.save() + + return result + + def _module(self): + return self.get_module_from_location(self.problem_location, COURSE) + def test_reset_fail(self): """ Test the flow of the module if we complete the self assessment step and then reset @@ -905,39 +920,32 @@ class OpenEndedModuleXmlAttemptTest(unittest.TestCase, DummyModulestore): @return: """ assessment = [0, 1] - module = self.get_module_from_location(self.problem_location, COURSE) - module.save() # Simulate a student saving an answer - module.handle_ajax("save_answer", {"student_answer": self.answer}) - module.save() + self._handle_ajax("save_answer", {"student_answer": self.answer}) # Mock a student submitting an assessment assessment_dict = MultiDict({'assessment': sum(assessment)}) assessment_dict.extend(('score_list[]', val) for val in assessment) - module.handle_ajax("save_assessment", assessment_dict) - module.save() - task_one_json = json.loads(module.task_states[0]) + self._handle_ajax("save_assessment", assessment_dict) + task_one_json = json.loads(self._module().task_states[0]) self.assertEqual(json.loads(task_one_json['child_history'][0]['post_assessment']), assessment) # Move to the next step in the problem - module.handle_ajax("next_problem", {}) - module.save() - self.assertEqual(module.current_task_number, 0) + self._handle_ajax("next_problem", {}) + self.assertEqual(self._module().current_task_number, 0) - html = module.render('student_view').content + html = self._module().render('student_view').content self.assertIsInstance(html, basestring) # Module should now be done - rubric = module.handle_ajax("get_combined_rubric", {}) - module.save() + rubric = self._handle_ajax("get_combined_rubric", {}) self.assertIsInstance(rubric, basestring) - self.assertEqual(module.state, "done") + self.assertEqual(self._module().state, "done") # Try to reset, should fail because only 1 attempt is allowed - reset_data = json.loads(module.handle_ajax("reset", {})) - module.save() + reset_data = json.loads(self._handle_ajax("reset", {})) self.assertEqual(reset_data['success'], False) class OpenEndedModuleXmlImageUploadTest(unittest.TestCase, DummyModulestore): @@ -951,13 +959,16 @@ class OpenEndedModuleXmlImageUploadTest(unittest.TestCase, DummyModulestore): answer_link = "http://www.edx.org" autolink_tag = "<a href=" - def setUp(self): - self.test_system = get_test_system() - self.test_system.open_ended_grading_interface = None - self.test_system.s3_interface = test_util_open_ended.S3_INTERFACE - self.test_system.xqueue['interface'] = Mock( + def get_module_system(self, descriptor): + test_system = get_test_system() + test_system.open_ended_grading_interface = None + test_system.s3_interface = test_util_open_ended.S3_INTERFACE + test_system.xqueue['interface'] = Mock( send_to_queue=Mock(side_effect=[1, "queued"]) ) + return test_system + + def setUp(self): self.setup_modulestore(COURSE) def test_file_upload_fail(self): diff --git a/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py b/common/lib/xmodule/xmodule/tests/test_crowdsource_hinter.py index d73c79035de05e3a4cd74e3d54cb65eec1036d75..33fc264ff996fd6194c7f132525b41b617f47032 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 c6d08b2026d2556a2acab19de6e59076f0f19932..66929c19d608c982b4ce462bb7147e04847d6e36 100644 --- a/common/lib/xmodule/xmodule/tests/test_peer_grading.py +++ b/common/lib/xmodule/xmodule/tests/test_peer_grading.py @@ -41,13 +41,16 @@ class PeerGradingModuleTest(unittest.TestCase, DummyModulestore): }) save_dict.extend(('rubric_scores[]', val) for val in (0, 1)) + def get_module_system(self, descriptor): + test_system = get_test_system() + test_system.open_ended_grading_interface = None + return test_system + def setUp(self): """ Create a peer grading module from a test system @return: """ - self.test_system = get_test_system() - self.test_system.open_ended_grading_interface = None self.setup_modulestore(COURSE) self.peer_grading = self.get_module_from_location(self.problem_location, COURSE) self.coe = self.get_module_from_location(self.coe_location, COURSE) @@ -173,13 +176,16 @@ class PeerGradingModuleScoredTest(unittest.TestCase, DummyModulestore): ["i4x", "edX", "open_ended", "peergrading", "PeerGradingScored"] ) + def get_module_system(self, descriptor): + test_system = get_test_system() + test_system.open_ended_grading_interface = None + return test_system + def setUp(self): """ Create a peer grading module from a test system @return: """ - self.test_system = get_test_system() - self.test_system.open_ended_grading_interface = None self.setup_modulestore(COURSE) def test_metadata_load(self): @@ -213,12 +219,15 @@ class PeerGradingModuleLinkedTest(unittest.TestCase, DummyModulestore): coe_location = Location(["i4x", "edX", "open_ended", "combinedopenended", "SampleQuestion"]) + def get_module_system(self, descriptor): + test_system = get_test_system() + test_system.open_ended_grading_interface = None + return test_system + def setUp(self): """ Create a peer grading module from a test system. """ - self.test_system = get_test_system() - self.test_system.open_ended_grading_interface = None self.setup_modulestore(COURSE) @property @@ -270,14 +279,15 @@ class PeerGradingModuleLinkedTest(unittest.TestCase, DummyModulestore): else: pg_descriptor.get_required_module_descriptors = lambda: [] + test_system = self.get_module_system(pg_descriptor) + # Initialize the peer grading module. peer_grading = PeerGradingModule( pg_descriptor, - self.test_system, + test_system, self.field_data, self.scope_ids, ) - self.test_system.xmodule_instance = peer_grading return peer_grading @@ -384,13 +394,16 @@ class PeerGradingModuleTrackChangesTest(unittest.TestCase, DummyModulestore): mock_track_changes_problem = Mock(side_effect=[MockedTrackChangesProblem()]) pgm_location = Location(["i4x", "edX", "open_ended", "peergrading", "PeerGradingSample"]) + def get_module_system(self, descriptor): + test_system = get_test_system() + test_system.open_ended_grading_interface = None + return test_system + def setUp(self): """ Create a peer grading module from a test system @return: """ - self.test_system = get_test_system() - self.test_system.open_ended_grading_interface = None self.setup_modulestore(COURSE) self.peer_grading = self.get_module_from_location(self.pgm_location, COURSE) diff --git a/common/lib/xmodule/xmodule/tests/test_util_open_ended.py b/common/lib/xmodule/xmodule/tests/test_util_open_ended.py index 939152251abb0224ee1ce852d7ca1467734d1722..bbb0653512e675d723ca8807b1176b508f83e049 100644 --- a/common/lib/xmodule/xmodule/tests/test_util_open_ended.py +++ b/common/lib/xmodule/xmodule/tests/test_util_open_ended.py @@ -78,7 +78,9 @@ class DummyModulestore(object): """ A mixin that allows test classes to have convenience functions to get a module given a location """ - get_test_system = get_test_system() + + def get_module_system(self, descriptor): + raise NotImplementedError("Sub-tests must specify how to generate a module-system") def setup_modulestore(self, name): self.modulestore = XMLModuleStore(DATA_DIR, course_dirs=[name]) @@ -93,7 +95,7 @@ class DummyModulestore(object): if not isinstance(location, Location): location = Location(location) descriptor = self.modulestore.get_instance(course.id, location, depth=None) - descriptor.xmodule_runtime = self.test_system + descriptor.xmodule_runtime = self.get_module_system(descriptor) return descriptor # Task state for a module with self assessment then instructor assessment. diff --git a/common/lib/xmodule/xmodule/timelimit_module.py b/common/lib/xmodule/xmodule/timelimit_module.py index e1c4042dc0b33d69c3a2b7fd995e5cd0018e11ec..73744b5e8bd75e9ec6efa7c69f98a6689cb98985 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 0879e3bba3ed131138540fbd52621449e7c74ab5..0053cb5ca17cb6ac61f0c83c98ce9d9cd858ca2f 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 055033a3bb0eef870642fac3b87f08e064f0af2f..e644185c8c1be7f989d7415fad9cb9026dfd3546 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'<x_module(id={0})>'.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('/?')