diff --git a/common/lib/capa/capa/responsetypes.py b/common/lib/capa/capa/responsetypes.py
index c0c2651707..8517e71d04 100644
--- a/common/lib/capa/capa/responsetypes.py
+++ b/common/lib/capa/capa/responsetypes.py
@@ -2061,7 +2061,7 @@ class OpenEndedResponse(LoncapaResponse):
{value}
- """.format(feedback_type, value)
+ """.format(feedback_type=feedback_type, value=value)
# TODO (vshnayder): design and document the details of this format so
# that we can do proper escaping here (e.g. are the graders allowed to
@@ -2153,7 +2153,7 @@ class OpenEndedResponse(LoncapaResponse):
#Currently ignore msg and only return feedback (which takes the place of msg)
return ScoreMessage(valid=True, correct=correct,
- score=score_result['score'], msg=feedback)
+ points=score_result['score'], msg=feedback)
#-----------------------------------------------------------------------------
# TEMPORARY: List of all response subclasses
diff --git a/lms/djangoapps/instructor/staff_grading_service.py b/lms/djangoapps/instructor/staff_grading_service.py
index 33c1d875af..60449bd093 100644
--- a/lms/djangoapps/instructor/staff_grading_service.py
+++ b/lms/djangoapps/instructor/staff_grading_service.py
@@ -42,6 +42,17 @@ class MockStaffGradingService(object):
'max_score': 2 + self.cnt % 3,
'rubric': 'A rubric'})
+ def get_problem_list(self, course_id, grader_id):
+ self.cnt += 1
+ return json.dumps({'success': True,
+ 'problem_list': [
+ json.dumps({'location': 'i4x://MITx/3.091x/problem/open_ended_demo1', \
+ 'problem_name': "Problem 1", 'num_graded': 3, 'num_pending': 5, 'min_for_ml': 10}),
+ json.dumps({'location': 'i4x://MITx/3.091x/problem/open_ended_demo2', \
+ 'problem_name': "Problem 2", 'num_graded': 1, 'num_pending': 5, 'min_for_ml': 10})
+ ]})
+
+
def save_grade(self, course_id, grader_id, submission_id, score, feedback):
return self.get_next(course_id, 'fake location', grader_id)
@@ -274,7 +285,24 @@ def get_next(request, course_id):
def get_problem_list(request, course_id):
"""
Get all the problems for the given course id
- TODO: fill in all of this stuff
+
+ Returns a json dict with the following keys:
+ success: bool
+
+ problem_list: a list containing json dicts with the following keys:
+ each dict represents a different problem in the course
+
+ location: the location of the problem
+
+ problem_name: the name of the problem
+
+ num_graded: the number of responses that have been graded
+
+ num_pending: the number of responses that are sitting in the queue
+
+ min_for_ml: the number of responses that need to be graded before
+ the ml can be run
+
"""
_check_access(request.user, course_id)
try:
diff --git a/lms/djangoapps/instructor/tests.py b/lms/djangoapps/instructor/tests.py
index 4b5ab7e309..865a97951e 100644
--- a/lms/djangoapps/instructor/tests.py
+++ b/lms/djangoapps/instructor/tests.py
@@ -278,6 +278,14 @@ class TestStaffGradingService(ct.PageLoader):
d = json.loads(r.content)
self.assertTrue(d['success'])
self.assertEquals(d['submission_id'], self.mock_service.cnt)
+ self.assertIsNotNone(d['submission'])
+ self.assertIsNotNone(d['num_graded'])
+ self.assertIsNotNone(d['min_for_ml'])
+ self.assertIsNotNone(d['num_pending'])
+ self.assertIsNotNone(d['prompt'])
+ self.assertIsNotNone(d['ml_error_info'])
+ self.assertIsNotNone(d['max_score'])
+ self.assertIsNotNone(d['rubric'])
def test_save_grade(self):
@@ -294,4 +302,15 @@ class TestStaffGradingService(ct.PageLoader):
self.assertTrue(d['success'], str(d))
self.assertEquals(d['submission_id'], self.mock_service.cnt)
+ def test_get_problem_list(self):
+ self.login(self.instructor, self.password)
+
+ url = reverse('staff_grading_get_problem_list', kwargs={'course_id': self.course_id})
+ data = {}
+
+ r = self.check_for_post_code(200, url, data)
+ d = json.loads(r.content)
+ self.assertTrue(d['success'], str(d))
+ self.assertIsNotNone(d['problem_list'])
+