Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,18 @@ def get_data_for_location(self, problem_location, student_id):
return self.try_to_decode(response)

def get_next_submission(self, problem_location, grader_id):
response = self.get(self.get_next_submission_url,
{'location': problem_location, 'grader_id': grader_id})
response = self.get(
self.get_next_submission_url,
{
'location': problem_location,
'grader_id': grader_id
}
)
return self.try_to_decode(self._render_rubric(response))

def save_grade(self, location, grader_id, submission_id, score, feedback, submission_key, rubric_scores,
submission_flagged):
data = {'grader_id': grader_id,
'submission_id': submission_id,
'score': score,
'feedback': feedback,
'submission_key': submission_key,
'location': location,
'rubric_scores': rubric_scores,
'rubric_scores_complete': True,
'submission_flagged': submission_flagged}
def save_grade(self, **kwargs):
data = kwargs
data.update({'rubric_scores_complete': True})
return self.try_to_decode(self.post(self.save_grade_url, data))

def is_student_calibrated(self, problem_location, grader_id):
Expand All @@ -62,16 +59,9 @@ def show_calibration_essay(self, problem_location, grader_id):
response = self.get(self.show_calibration_essay_url, params)
return self.try_to_decode(self._render_rubric(response))

def save_calibration_essay(self, problem_location, grader_id, calibration_essay_id, submission_key,
score, feedback, rubric_scores):
data = {'location': problem_location,
'student_id': grader_id,
'calibration_essay_id': calibration_essay_id,
'submission_key': submission_key,
'score': score,
'feedback': feedback,
'rubric_scores[]': rubric_scores,
'rubric_scores_complete': True}
def save_calibration_essay(self, **kwargs):
data = kwargs
data.update({'rubric_scores_complete': True})
return self.try_to_decode(self.post(self.save_calibration_essay_url, data))

def get_problem_list(self, course_id, grader_id):
Expand Down Expand Up @@ -100,16 +90,17 @@ def try_to_decode(self, text):

class MockPeerGradingService(object):
def get_next_submission(self, problem_location, grader_id):
return {'success': True,
'submission_id': 1,
'submission_key': "",
'student_response': 'fake student response',
'prompt': 'fake submission prompt',
'rubric': 'fake rubric',
'max_score': 4}

def save_grade(self, location, grader_id, submission_id,
score, feedback, submission_key, rubric_scores, submission_flagged):
return {
'success': True,
'submission_id': 1,
'submission_key': "",
'student_response': 'fake student response',
'prompt': 'fake submission prompt',
'rubric': 'fake rubric',
'max_score': 4
}

def save_grade(self, **kwargs):
return {'success': True}

def is_student_calibrated(self, problem_location, grader_id):
Expand All @@ -124,9 +115,7 @@ def show_calibration_essay(self, problem_location, grader_id):
'rubric': 'fake rubric',
'max_score': 4}

def save_calibration_essay(self, problem_location, grader_id,
calibration_essay_id, submission_key, score,
feedback, rubric_scores):
def save_calibration_essay(self, **kwargs):
return {'success': True, 'actual_score': 2}

def get_problem_list(self, course_id, grader_id):
Expand Down
62 changes: 26 additions & 36 deletions common/lib/xmodule/xmodule/peer_grading_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

EXTERNAL_GRADER_NO_CONTACT_ERROR = "Failed to contact external graders. Please notify course staff."


class PeerGradingFields(object):
use_for_single_location = Boolean(
display_name="Show Single Problem",
Expand Down Expand Up @@ -68,9 +69,11 @@ class PeerGradingFields(object):
scope=Scope.settings,
default="Peer Grading Interface"
)
data = String(help="Html contents to display for this module",
data = String(
help="Html contents to display for this module",
default='<peergrading></peergrading>',
scope=Scope.content)
scope=Scope.content
)


class PeerGradingModule(PeerGradingFields, XModule):
Expand All @@ -79,11 +82,14 @@ class PeerGradingModule(PeerGradingFields, XModule):
"""
_VERSION = 1

js = {'coffee': [resource_string(__name__, 'js/src/peergrading/peer_grading.coffee'),
resource_string(__name__, 'js/src/peergrading/peer_grading_problem.coffee'),
resource_string(__name__, 'js/src/collapsible.coffee'),
resource_string(__name__, 'js/src/javascript_loader.coffee'),
]}
js = {
'coffee': [
resource_string(__name__, 'js/src/peergrading/peer_grading.coffee'),
resource_string(__name__, 'js/src/peergrading/peer_grading_problem.coffee'),
resource_string(__name__, 'js/src/collapsible.coffee'),
resource_string(__name__, 'js/src/javascript_loader.coffee'),
]
}
js_module_name = "PeerGrading"

css = {'scss': [resource_string(__name__, 'css/combinedopenended/display.scss')]}
Expand Down Expand Up @@ -134,7 +140,6 @@ def _closed(self, timeinfo):
return True
return False


def _err_response(self, msg):
"""
Return a HttpResponse with a json dump with success=False, and the given error message.
Expand Down Expand Up @@ -308,31 +313,22 @@ def save_grade(self, data):
error: if there was an error in the submission, this is the error message
"""

required = set(['location', 'submission_id', 'submission_key', 'score', 'feedback', 'rubric_scores[]',
'submission_flagged'])
required = set(['location', 'submission_id', 'submission_key', 'score', 'feedback', 'rubric_scores[]', 'submission_flagged', 'answer_unknown'])
success, message = self._check_required(data, required)
if not success:
return self._err_response(message)
grader_id = self.system.anonymous_student_id

location = data.get('location')
submission_id = data.get('submission_id')
score = data.get('score')
feedback = data.get('feedback')
submission_key = data.get('submission_key')
rubric_scores = data.getlist('rubric_scores[]')
submission_flagged = data.get('submission_flagged')
data_dict = {k:data.get(k) for k in required}
data_dict['rubric_scores'] = data.getlist('rubric_scores[]')
data_dict['grader_id'] = self.system.anonymous_student_id

try:
response = self.peer_gs.save_grade(location, grader_id, submission_id,
score, feedback, submission_key, rubric_scores, submission_flagged)
response = self.peer_gs.save_grade(**data_dict)
return response
except GradingServiceError:
# This is a dev_facing_error
log.exception("""Error saving grade to open ended grading service. server url: {0}, location: {1}, submission_id:{2},
submission_key: {3}, score: {4}"""
.format(self.peer_gs.url,
location, submission_id, submission_key, score)
log.exception("""Error saving grade to open ended grading service. server url: {0}"""
.format(self.peer_gs.url)
)
# This is a student_facing_error
return {
Expand Down Expand Up @@ -451,27 +447,21 @@ def save_calibration_essay(self, data):
success, message = self._check_required(data, required)
if not success:
return self._err_response(message)
grader_id = self.system.anonymous_student_id

location = data.get('location')
calibration_essay_id = data.get('submission_id')
submission_key = data.get('submission_key')
score = data.get('score')
feedback = data.get('feedback')
rubric_scores = data.getlist('rubric_scores[]')
data_dict = {k:data.get(k) for k in required}
data_dict['rubric_scores'] = data.getlist('rubric_scores[]')
data_dict['student_id'] = self.system.anonymous_student_id
data_dict['calibration_essay_id'] = data_dict['submission_id']

try:
response = self.peer_gs.save_calibration_essay(location, grader_id, calibration_essay_id,
submission_key, score, feedback, rubric_scores)
response = self.peer_gs.save_calibration_essay(**data_dict)
if 'actual_rubric' in response:
rubric_renderer = combined_open_ended_rubric.CombinedOpenEndedRubric(self.system, True)
response['actual_rubric'] = rubric_renderer.render_rubric(response['actual_rubric'])['html']
return response
except GradingServiceError:
# This is a dev_facing_error
log.exception(
"Error saving calibration grade, location: {0}, submission_key: {1}, grader_id: {2}".format(
location, submission_key, grader_id))
log.exception("Error saving calibration grade")
# This is a student_facing_error
return self._err_response('There was an error saving your score. Please notify course staff.')

Expand Down
1 change: 1 addition & 0 deletions common/lib/xmodule/xmodule/tests/test_peer_grading.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class PeerGradingModuleTest(unittest.TestCase, DummyModulestore):
'feedback': "",
'rubric_scores[]': [0, 1],
'submission_flagged': False,
'answer_unknown' : False,
})

def setUp(self):
Expand Down
4 changes: 3 additions & 1 deletion lms/djangoapps/open_ended_grading/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,9 @@ def test_save_grade_success(self):
'submission_key': 'fake key',
'score': 2,
'feedback': 'feedback',
'submission_flagged': 'false'
'submission_flagged': 'false',
'answer_unknown': 'false',
'rubric_scores_complete' : 'true'
}

qdict = MagicMock()
Expand Down