From f4d68d77f671abf3e63e8788b68d6416b18d3287 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Tue, 19 Mar 2013 15:29:40 -0400 Subject: [PATCH] Add Javascript for new button and fix Python backend issues --- common/lib/capa/capa/capa_problem.py | 5 +-- common/lib/capa/capa/inputtypes.py | 24 +++++++--- .../lib/capa/capa/templates/matlabinput.html | 45 ++++++++++++++++++- common/lib/capa/capa/tests/__init__.py | 2 +- common/lib/capa/capa/tests/test_inputtypes.py | 4 +- common/lib/xmodule/xmodule/capa_module.py | 3 +- 6 files changed, 67 insertions(+), 16 deletions(-) diff --git a/common/lib/capa/capa/capa_problem.py b/common/lib/capa/capa/capa_problem.py index fbf911e500..911f210812 100644 --- a/common/lib/capa/capa/capa_problem.py +++ b/common/lib/capa/capa/capa_problem.py @@ -548,14 +548,11 @@ class LoncapaProblem(object): if self.student_answers and problemid in self.student_answers: value = self.student_answers[problemid] - if input_id not in self.input_state: - self.input_state[input_id] = {} - # do the rendering state = {'value': value, 'status': status, 'id': input_id, - 'input_state': self.input_state[input_id], + 'input_state': self.input_state, 'feedback': {'message': msg, 'hint': hint, 'hintmode': hintmode, }} diff --git a/common/lib/capa/capa/inputtypes.py b/common/lib/capa/capa/inputtypes.py index 303619c820..42865a01b5 100644 --- a/common/lib/capa/capa/inputtypes.py +++ b/common/lib/capa/capa/inputtypes.py @@ -162,7 +162,7 @@ class InputTypeBase(object): self.msg = feedback.get('message', '') self.hint = feedback.get('hint', '') self.hintmode = feedback.get('hintmode', None) - self.input_state = state.get('input_state', {}) + self.input_state_dict = state.get('input_state', {}) # put hint above msg if it should be displayed if self.hintmode == 'always': @@ -635,6 +635,11 @@ class MatlabInput(CodeInput): ''' Handle matlab-specific parsing ''' + # if we don't have state for this input type yet, make one + if self.id not in self.input_state_dict: + self.input_state_dict[self.id] = {} + + self.input_state = self.input_state_dict[self.id] xml = self.xml self.plot_payload = xml.findtext('./plot_payload') # if no student input yet, then use the default input given by the @@ -647,10 +652,13 @@ class MatlabInput(CodeInput): self.queuename = 'matlab' # Flag indicating that the problem has been queued, 'msg' is length of self.queue_msg = None + if 'queue_msg' in self.input_state: + self.queue_msg = self.input_state['queue_msg'] + if 'queued' in self.input_state and self.input_state['queuestate'] is not None: + self.status = 'queued' + self.queue_len = 1 # queue if self.status == 'incomplete': - if 'queue_msg' in self.input_state: - self.queue_msg = self.input_state['queue_msg'] self.status = 'queued' self.queue_len = self.msg self.msg = self.submitted_msg @@ -667,10 +675,11 @@ class MatlabInput(CodeInput): # check the queuekey against the saved queuekey if('queuestate' in self.input_state and self.input_state['queuestate'] == 'queued' and self.input_state['queuekey'] == queuekey): - msg = _parse_message(queue_msg) + msg = self._parse_data(queue_msg) # save the queue message so that it can be rendered later self.input_state['queue_msg'] = msg - self.input_state['queued'] = 'dequeued' + self.input_state['queuestate'] = None + self.input_state['queuekey'] = None def _extra_context(self): ''' Set up additional context variables''' @@ -733,8 +742,9 @@ class MatlabInput(CodeInput): (error, msg) = qinterface.send_to_queue(header=xheader, body = json.dumps(contents)) - return json.dumps({'success': error != 0, 'message': msg}) - return json.dumps({'success': False, 'message': 'Cannot connect to the queue'}) + + return {'success': error == 0, 'message': msg} + return {'success': False, 'message': 'Cannot connect to the queue'} registry.register(MatlabInput) diff --git a/common/lib/capa/capa/templates/matlabinput.html b/common/lib/capa/capa/templates/matlabinput.html index 07433f0a3a..cbfc4b119f 100644 --- a/common/lib/capa/capa/templates/matlabinput.html +++ b/common/lib/capa/capa/templates/matlabinput.html @@ -34,7 +34,7 @@
- +
diff --git a/common/lib/capa/capa/tests/__init__.py b/common/lib/capa/capa/tests/__init__.py index 7b1bffce62..72d82c683b 100644 --- a/common/lib/capa/capa/tests/__init__.py +++ b/common/lib/capa/capa/tests/__init__.py @@ -20,7 +20,7 @@ def calledback_url(dispatch = 'score_update'): return dispatch xqueue_interface = MagicMock() -xqueue_interface.send_to_queue.return_value = (1, 'Success!') +xqueue_interface.send_to_queue.return_value = (0, 'Success!') test_system = Mock( ajax_url='courses/course_id/modx/a_location', diff --git a/common/lib/capa/capa/tests/test_inputtypes.py b/common/lib/capa/capa/tests/test_inputtypes.py index 97e27d5ffc..b9da9df03f 100644 --- a/common/lib/capa/capa/tests/test_inputtypes.py +++ b/common/lib/capa/capa/tests/test_inputtypes.py @@ -357,7 +357,7 @@ class MatlabTest(unittest.TestCase): def test_rendering_with_state(self): state = {'value': 'print "good evening"', 'status': 'incomplete', - 'input_state': {'queue_msg': 'message'}, + 'input_state': {'prob_1_2': {'queue_msg': 'message'}}, 'feedback': {'message': '3'}, } elt = etree.fromstring(self.xml) @@ -383,7 +383,7 @@ class MatlabTest(unittest.TestCase): def test_plot_data(self): get = {'submission': 'x = 1234;'} - response = json.loads(self.the_input.handle_ajax("plot", get)) + response = self.the_input.handle_ajax("plot", get) test_system.xqueue['interface'].send_to_queue.assert_called_with(header=ANY, body=ANY) diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index 1bdd62f5b7..a522c796bb 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -460,6 +460,7 @@ class CapaModule(CapaFields, XModule): 'progress_changed': after != before, 'progress_status': Progress.to_js_status_str(after), }) + self.set_state_from_lcp() return json.dumps(d, cls=ComplexEncoder) def is_past_due(self): @@ -549,8 +550,8 @@ class CapaModule(CapaFields, XModule): score_msg = get['xqueue_body'] # pass along the xqueue message to the problem self.lcp.ungraded_response(score_msg, queuekey) - self.set_state_from_lcp() + return dict() def get_answer(self, get): '''