Commit a91a571f by Vik Paruchuri

update javascript

parent 947e6e6e
...@@ -580,76 +580,76 @@ class CapaModule(XModule): ...@@ -580,76 +580,76 @@ class CapaModule(XModule):
'contents': html, 'contents': html,
} }
def save_problem(self, get): def save_problem(self, get):
''' '''
Save the passed in answers. Save the passed in answers.
Returns a dict { 'success' : bool, ['error' : error-msg]}, Returns a dict { 'success' : bool, ['error' : error-msg]},
with the error key only present if success is False. with the error key only present if success is False.
''' '''
event_info = dict() event_info = dict()
event_info['state'] = self.lcp.get_state() event_info['state'] = self.lcp.get_state()
event_info['problem_id'] = self.location.url() event_info['problem_id'] = self.location.url()
answers = self.make_dict_of_responses(get) answers = self.make_dict_of_responses(get)
event_info['answers'] = answers event_info['answers'] = answers
# Too late. Cannot submit # Too late. Cannot submit
if self.closed(): if self.closed():
event_info['failure'] = 'closed' event_info['failure'] = 'closed'
self.system.track_function('save_problem_fail', event_info) self.system.track_function('save_problem_fail', event_info)
return {'success': False, return {'success': False,
'error': "Problem is closed"} 'error': "Problem is closed"}
# Problem submitted. Student should reset before saving
# again.
if self.lcp.done and self.rerandomize == "always":
event_info['failure'] = 'done'
self.system.track_function('save_problem_fail', event_info)
return {'success': False,
'error': "Problem needs to be reset prior to save."}
# Problem submitted. Student should reset before saving self.lcp.student_answers = answers
# again.
if self.lcp.done and self.rerandomize == "always": # TODO: should this be save_problem_fail? Looks like success to me...
event_info['failure'] = 'done'
self.system.track_function('save_problem_fail', event_info) self.system.track_function('save_problem_fail', event_info)
return {'success': False, return {'success': True}
'error': "Problem needs to be reset prior to save."}
self.lcp.student_answers = answers def reset_problem(self, get):
''' Changes problem state to unfinished -- removes student answers,
and causes problem to rerender itself.
# TODO: should this be save_problem_fail? Looks like success to me... Returns problem html as { 'html' : html-string }.
self.system.track_function('save_problem_fail', event_info) '''
return {'success': True} event_info = dict()
event_info['old_state'] = self.lcp.get_state()
event_info['problem_id'] = self.location.url()
def reset_problem(self, get): if self.closed():
''' Changes problem state to unfinished -- removes student answers, event_info['failure'] = 'closed'
and causes problem to rerender itself. self.system.track_function('reset_problem_fail', event_info)
return {'success': False,
'error': "Problem is closed"}
Returns problem html as { 'html' : html-string }. if not self.lcp.done:
''' event_info['failure'] = 'not_done'
event_info = dict() self.system.track_function('reset_problem_fail', event_info)
event_info['old_state'] = self.lcp.get_state() return {'success': False,
event_info['problem_id'] = self.location.url() 'error': "Refresh the page and make an attempt before resetting."}
if self.closed(): self.lcp.do_reset()
event_info['failure'] = 'closed' if self.rerandomize in ["always", "onreset"]:
self.system.track_function('reset_problem_fail', event_info) # reset random number generator seed (note the self.lcp.get_state()
return {'success': False, # in next line)
'error': "Problem is closed"} self.lcp.seed = None
if not self.lcp.done: self.lcp = LoncapaProblem(self.definition['data'],
event_info['failure'] = 'not_done' self.location.html_id(), self.lcp.get_state(),
self.system.track_function('reset_problem_fail', event_info) system=self.system)
return {'success': False,
'error': "Refresh the page and make an attempt before resetting."} event_info['new_state'] = self.lcp.get_state()
self.system.track_function('reset_problem', event_info)
self.lcp.do_reset()
if self.rerandomize in ["always", "onreset"]: return {'html': self.get_problem_html(encapsulate=False)}
# reset random number generator seed (note the self.lcp.get_state()
# in next line)
self.lcp.seed = None
self.lcp = LoncapaProblem(self.definition['data'],
self.location.html_id(), self.lcp.get_state(),
system=self.system)
event_info['new_state'] = self.lcp.get_state()
self.system.track_function('reset_problem', event_info)
return {'html': self.get_problem_html(encapsulate=False)}
class CapaDescriptor(RawDescriptor): class CapaDescriptor(RawDescriptor):
......
class @Problem show: =>
Logger.log 'sa_show', problem: @id
constructor: (element) -> $.postWithPrefix "#{@url}/sa_show", (response) =>
@el = $(element).find('.problems-wrapper') answers = response.answers
@id = @el.data('problem-id') $.each answers, (key, value) =>
@element_id = @el.attr('id') if $.isArray(value)
@url = @el.data('url') for choice in value
@render() @$("label[for='input_#{key}_#{choice}']").attr correct_answer: 'true'
else
$: (selector) -> answer = @$("#answer_#{key}, #solution_#{key}")
$(selector, @el) answer.html(value)
Collapsible.setCollapsibles(answer)
bind: =>
problem_prefix = @element_id.replace(/sa_/,'') @$('.show').val 'Hide Answer'
@inputs = @$("[id^=input_#{problem_prefix}_]") @el.addClass 'showed'
@$('section.action input.show').click @show save: =>
@$('section.action input.save').click @save Logger.log 'sa_save', @answers
$.postWithPrefix "#{@url}/sa_save", @answers, (response) =>
render: (content) -> if response.success
if content @$('p.rubric').replace(response.rubric)
@el.html(content)
JavascriptLoader.executeModuleScripts @el, () =>
@setupInputTypes()
@bind()
else
$.postWithPrefix "#{@url}/sa_get", (response) =>
@el.html(response.html)
JavascriptLoader.executeModuleScripts @el, () =>
@setupInputTypes()
@bind()
# TODO add hooks for problem types here by inspecting response.html and doing
# stuff if a div w a class is found
show: =>
Logger.log 'sa_show', problem: @id
$.postWithPrefix "#{@url}/sa_show", (response) =>
answers = response.answers
$.each answers, (key, value) =>
if $.isArray(value)
for choice in value
@$("label[for='input_#{key}_#{choice}']").attr correct_answer: 'true'
else
answer = @$("#answer_#{key}, #solution_#{key}")
answer.html(value)
Collapsible.setCollapsibles(answer)
@$('.show').val 'Hide Answer'
@el.addClass 'showed'
save: =>
Logger.log 'problem_save', @answers
$.postWithPrefix "#{@url}/problem_save", @answers, (response) =>
if response.success
saveMessage = "Your answers have been saved but not graded. Hit 'Check' to grade them."
@gentle_alert saveMessage
@updateProgress response
inputtypeShowAnswerMethods:
choicegroup: (element, display, answers) =>
element = $(element)
element.find('input').attr('disabled', 'disabled')
input_id = element.attr('id').replace(/inputtype_/,'')
answer = answers[input_id]
for choice in answer
element.find("label[for='input_#{input_id}_#{choice}']").addClass 'choicegroup_correct'
javascriptinput: (element, display, answers) =>
answer_id = $(element).attr('id').split("_")[1...].join("_")
answer = JSON.parse(answers[answer_id])
display.showAnswer(answer)
inputtypeHideAnswerMethods:
choicegroup: (element, display) =>
element = $(element)
element.find('input').attr('disabled', null)
element.find('label').removeClass('choicegroup_correct')
javascriptinput: (element, display) =>
display.hideAnswer()
...@@ -19,12 +19,12 @@ from xmodule.contentstore.content import XASSET_SRCREF_PREFIX, StaticContent ...@@ -19,12 +19,12 @@ from xmodule.contentstore.content import XASSET_SRCREF_PREFIX, StaticContent
log = logging.getLogger("mitx.courseware") log = logging.getLogger("mitx.courseware")
problem_form=('<form action="show()"><input type="text" name="answer" ' problem_form=('<form action="save()"><input type="text" name="answer" '
'id="answer"/><br/><input type="submit" value="Check"/></form>') 'id="answer"/><br/><input type="submit" value="Check" id ="save"/></form><p id="rubric"></p>')
rubric_form=('<form action="save()"><input type="radio" name="assessment" value="correct"/>Correct<br/>' rubric_form=('<form action="show()"><input type="radio" name="assessment" value="correct"/>Correct<br/>'
'<input type="radio" name="assessment" value="incorrect">' '<input type="radio" name="assessment" value="incorrect">'
'Incorrect<input type="submit" value="Submit"/></form>') 'Incorrect<input type="submit" value="Submit" id="show"/></form>')
def only_one(lst, default="", process=lambda x: x): def only_one(lst, default="", process=lambda x: x):
""" """
...@@ -46,7 +46,7 @@ class SelfAssessmentModule(XModule): ...@@ -46,7 +46,7 @@ class SelfAssessmentModule(XModule):
resource_string(__name__, 'js/src/selfassessment/display.coffee') resource_string(__name__, 'js/src/selfassessment/display.coffee')
] ]
} }
js_module_name = "SelfAssessmentModule" js_module_name = "SelfAssessment"
def get_html(self): def get_html(self):
# cdodge: perform link substitutions for any references to course static content (e.g. images) # cdodge: perform link substitutions for any references to course static content (e.g. images)
...@@ -71,17 +71,18 @@ class SelfAssessmentModule(XModule): ...@@ -71,17 +71,18 @@ class SelfAssessmentModule(XModule):
self.html = self.problem self.html = self.problem
def handle_ajax(self, dispatch, get): def handle_ajax(self, dispatch, get):
''' '''
This is called by courseware.module_render, to handle an AJAX call. This is called by courseware.module_render, to handle an AJAX call.
"get" is request.POST. "get" is request.POST.
Returns a json dictionary: Returns a json dictionary:
{ 'progress_changed' : True/False, { 'progress_changed' : True/False,
'progress' : 'none'/'in_progress'/'done', 'progress' : 'none'/'in_progress'/'done',
<other request-specific values here > } <other request-specific values here > }
''' '''
handlers = { handlers = {
'sa_get' : self.show_problem 'sa_get' : self.show_problem,
'sa_show': self.show_rubric, 'sa_show': self.show_rubric,
'sa_save': self.save_problem, 'sa_save': self.save_problem,
} }
...@@ -98,6 +99,19 @@ class SelfAssessmentModule(XModule): ...@@ -98,6 +99,19 @@ class SelfAssessmentModule(XModule):
}) })
return json.dumps(d, cls=ComplexEncoder) return json.dumps(d, cls=ComplexEncoder)
def save_problem(self, get):
'''
Save the passed in answers.
Returns a dict { 'success' : bool, ['error' : error-msg]},
with the error key only present if success is False.
'''
event_info = dict()
event_info['state'] = self.lcp.get_state()
event_info['problem_id'] = self.location.url()
return {'success': True, 'rubric' : self.rubric}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment