Commit 5333e5e1 by Vik Paruchuri

Refactoring to open ended child

parent d8f6e1fe
......@@ -69,7 +69,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild):
if self.created=="True" and self.state == self.ASSESSING:
self.created="False"
self.get_score(self.latest_answer(), system)
self.send_to_grader(self.latest_answer(), system)
self.created="False"
def _parse(self, oeparam, prompt, rubric, system):
......@@ -180,7 +180,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild):
return {'success' : success, 'msg' : "Successfully submitted your feedback."}
def get_score(self, submission, system):
def send_to_grader(self, submission, system):
# Prepare xqueue request
#------------------------------------------------------------
......@@ -228,7 +228,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild):
score_msg['feedback'] = 'Invalid grader reply. Please contact the course staff.'
self.record_latest_score(score_msg['score'])
self.record_latest_feedback(score_msg['feedback'])
self.record_latest_post_assessment(score_msg['feedback'])
self.state=self.POST_ASSESSMENT
return True
......@@ -461,7 +461,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild):
# add new history element with answer and empty score and hint.
self.new_history_entry(get['student_answer'])
self.get_score(get['student_answer'], system)
self.send_to_grader(get['student_answer'], system)
self.change_state(self.ASSESSING)
return {'success': True,}
......@@ -496,66 +496,16 @@ class OpenEndedModule(openendedchild.OpenEndedChild):
if self.state == self.DONE:
self.attempts += 1
def get_instance_state(self):
"""
Get the current score and state
"""
state = {
'version': self.STATE_VERSION,
'history': self.history,
'state': self.state,
'max_score': self._max_score,
'attempts': self.attempts,
'created' : "False",
}
return json.dumps(state)
def latest_answer(self):
"""None if not available"""
if not self.history:
return ""
return self.history[-1].get('answer', "")
def latest_score(self):
"""None if not available"""
if not self.history:
return ""
return self.history[-1].get('score', "")
def latest_feedback(self):
"""None if not available"""
if not self.history:
return ""
return self.history[-1].get('feedback', "")
def new_history_entry(self, answer):
self.history.append({'answer': answer})
def record_latest_score(self, score):
"""Assumes that state is right, so we're adding a score to the latest
history element"""
self.history[-1]['score'] = score
def record_latest_feedback(self, feedback):
"""Assumes that state is right, so we're adding a score to the latest
history element"""
self.history[-1]['feedback'] = feedback
def _allow_reset(self):
"""Can the module be reset?"""
return self.state == self.DONE and self.attempts < self.max_attempts
def get_html(self, system):
#set context variables and render template
if self.state != self.INITIAL:
latest = self.latest_answer()
previous_answer = latest if latest is not None else self.initial_display
feedback = self.latest_feedback()
post_assessment = self.latest_post_assessment()
score= self.latest_score()
correct = 'correct' if self.is_submission_correct(score) else 'incorrect'
else:
feedback=""
post_assessment=""
correct=""
previous_answer = self.initial_display
......@@ -567,7 +517,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild):
'rows' : 30,
'cols' : 80,
'id' : 'open_ended',
'msg' : feedback,
'msg' : post_assessment,
'child_type' : 'openended',
'correct' : correct,
}
......@@ -575,27 +525,13 @@ class OpenEndedModule(openendedchild.OpenEndedChild):
html = system.render_template('open_ended.html', context)
return html
def max_score(self):
"""
Return max_score
"""
return self._max_score
def get_score_value(self):
"""
Returns the last score in the list
"""
score = self.latest_score()
return {'score': score if score is not None else 0,
'total': self._max_score}
def get_progress(self):
'''
For now, just return last score / max_score
'''
if self._max_score > 0:
try:
return Progress(self.get_score_value()['score'], self._max_score)
return Progress(self.get_score()['score'], self._max_score)
except Exception as err:
log.exception("Got bad progress")
return None
......
......@@ -127,4 +127,84 @@ class OpenEndedChild():
self.setup_response(system, location, definition, descriptor)
def setup_response(self, system, location, definition, descriptor):
pass
\ No newline at end of file
pass
def latest_answer(self):
"""None if not available"""
if not self.history:
return ""
return self.history[-1].get('answer', "")
def latest_score(self):
"""None if not available"""
if not self.history:
return None
return self.history[-1].get('score')
def latest_post_assessment(self):
"""None if not available"""
if not self.history:
return ""
return self.history[-1].get('post_assessment', "")
def new_history_entry(self, answer):
self.history.append({'answer': answer})
def record_latest_score(self, score):
"""Assumes that state is right, so we're adding a score to the latest
history element"""
self.history[-1]['score'] = score
def record_latest_post_assessment(self, post_assessment):
"""Assumes that state is right, so we're adding a score to the latest
history element"""
self.history[-1]['post_assessment'] = post_assessment
def change_state(self, new_state):
"""
A centralized place for state changes--allows for hooks. If the
current state matches the old state, don't run any hooks.
"""
if self.state == new_state:
return
self.state = new_state
if self.state == self.DONE:
self.attempts += 1
def get_instance_state(self):
"""
Get the current score and state
"""
state = {
'version': self.STATE_VERSION,
'history': self.history,
'state': self.state,
'max_score': self._max_score,
'attempts': self.attempts,
'created' : "False",
}
return json.dumps(state)
def _allow_reset(self):
"""Can the module be reset?"""
return self.state == self.DONE and self.attempts < self.max_attempts
def max_score(self):
"""
Return max_score
"""
return self._max_score
def get_score(self):
"""
Returns the last score in the list
"""
score = self.latest_score()
return {'score': score if score is not None else 0,
'total': self._max_score}
......@@ -47,51 +47,6 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild):
self.submit_message = definition['submitmessage']
self.hint_prompt = definition['hintprompt']
def latest_answer(self):
"""None if not available"""
if not self.history:
return None
return self.history[-1].get('answer')
def latest_score(self):
"""None if not available"""
if not self.history:
return None
return self.history[-1].get('score')
def latest_hint(self):
"""None if not available"""
if not self.history:
return None
return self.history[-1].get('hint')
def new_history_entry(self, answer):
self.history.append({'answer': answer})
def record_latest_score(self, score):
"""Assumes that state is right, so we're adding a score to the latest
history element"""
self.history[-1]['score'] = score
def record_latest_hint(self, hint):
"""Assumes that state is right, so we're adding a score to the latest
history element"""
self.history[-1]['hint'] = hint
def change_state(self, new_state):
"""
A centralized place for state changes--allows for hooks. If the
current state matches the old state, don't run any hooks.
"""
if self.state == new_state:
return
self.state = new_state
if self.state == self.DONE:
self.attempts += 1
@staticmethod
def convert_state_to_current_format(old_state):
"""
......@@ -138,11 +93,6 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild):
student_answers, scores, hints)]
return new_state
def _allow_reset(self):
"""Can the module be reset?"""
return self.state == self.DONE and self.attempts < self.max_attempts
def get_html(self, system):
#set context variables and render template
if self.state != self.INITIAL:
......@@ -166,20 +116,6 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild):
html = system.render_template('self_assessment_prompt.html', context)
return html
def max_score(self):
"""
Return max_score
"""
return self._max_score
def get_score(self):
"""
Returns the last score in the list
"""
score = self.latest_score()
return {'score': score if score is not None else 0,
'total': self._max_score}
def get_progress(self):
'''
For now, just return last score / max_score
......@@ -207,7 +143,7 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild):
handlers = {
'save_answer': self.save_answer,
'save_assessment': self.save_assessment,
'save_post_assessment': self.save_hint,
'save_post_assessment': self.save_post_assessment,
}
if dispatch not in handlers:
......@@ -261,7 +197,7 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild):
if self.state == self.DONE:
# display the previous hint
latest = self.latest_hint()
latest = self.latest_post_assessment()
hint = latest if latest is not None else ''
else:
hint = ''
......@@ -376,7 +312,7 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild):
# the same number of hints and answers.
return self.out_of_sync_error(get)
self.record_latest_hint(get['hint'])
self.record_latest_post_assessment(get['hint'])
self.change_state(self.DONE)
return {'success': True,
......@@ -403,21 +339,6 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild):
return {'success': True}
def get_instance_state(self):
"""
Get the current score and state
"""
state = {
'version': self.STATE_VERSION,
'history': self.history,
'state': self.state,
'max_score': self._max_score,
'attempts': self.attempts,
'created' : "False",
}
return json.dumps(state)
class SelfAssessmentDescriptor(XmlDescriptor, EditingDescriptor):
"""
......
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