Skip to content

Commit d4b632f

Browse files
Fixed weight ignore issue on grade calculation
1 parent 1e8419b commit d4b632f

File tree

3 files changed

+30
-9
lines changed

3 files changed

+30
-9
lines changed

edx_sga/sga.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,9 @@ def enter_grade(self, request, suffix=''):
439439
state['staff_score'] = score
440440
state['comment'] = request.params.get('comment', '')
441441
module.state = json.dumps(state)
442+
# to fix score on edx progress page
443+
module.grade = score
444+
module.max_grade = self.max_score()
442445
module.save()
443446
log.info(
444447
"enter_grade for course:%s module:%s student:%s",
@@ -463,6 +466,7 @@ def remove_grade(self, request, suffix=''):
463466
self.block_id
464467
)
465468
module = self.get_student_module(request.params['module_id'])
469+
module.grade = 0
466470
state = json.loads(module.state)
467471
state['staff_score'] = None
468472
state['comment'] = ''
@@ -790,6 +794,7 @@ def student_state(self):
790794
"max_score": self.max_score(),
791795
"upload_allowed": self.upload_allowed(submission_data=submission),
792796
"solution": solution,
797+
'weight': self.weight,
793798
"base_asset_url": StaticContent.get_base_url_path_for_course_assets(self.location.course_key),
794799
}
795800

@@ -846,6 +851,7 @@ def get_student_data():
846851
return {
847852
'assignments': list(get_student_data()),
848853
'max_score': self.max_score(),
854+
'weight': self.weight,
849855
'display_name': force_text(self.display_name)
850856
}
851857

edx_sga/templates/staff_graded_assignment/show.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@
2929
</p>
3030
<p>
3131
<% if (graded) { %>
32-
{% blocktrans %}Your score is <%= graded.score %> / <%= max_score %>{% endblocktrans %}<br/>
32+
<% if (weight > 0) { %>
33+
{% blocktrans %}Your score is <%= (graded.score / max_score) * weight %> / <%= weight %>{% endblocktrans %}<br/>
34+
<% } else { %>
35+
{% blocktrans %}Your score is <%= graded.score %> / <%= max_score %>{% endblocktrans %}<br/>
36+
<% } %>
3337
<% if (graded.comment) { %>
3438
<b>{% trans "Instructor comment" %}</b> <%= graded.comment %><br/>
3539
<% } %>
@@ -100,8 +104,11 @@
100104
</td>
101105
<td>
102106
<% if (assignment.score !== null) { %>
103-
<%= assignment.score %> /
104-
<%= max_score %>
107+
<% if (weight > 0) { %>
108+
<%= (assignment.score / max_score) * weight %> / <%= weight %>
109+
<% } else { %>
110+
<%= assignment.score %> / <%= max_score %>
111+
<% } %>
105112
<% if (! assignment.approved) { %>
106113
({% trans "Awaiting instructor approval" %})
107114
<% } %>

edx_sga/tests/integration_tests.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ def make_one(self, display_name=None, **kw):
112112
"""
113113
Creates a XBlock SGA for testing purpose.
114114
"""
115+
weight = kw.get('weight', 0)
115116
field_data = DictFieldData(kw)
116117
block = StaffGradedAssignmentXBlock(self.runtime, field_data, self.scope_ids)
117118
block.location = Location(
@@ -126,6 +127,7 @@ def make_one(self, display_name=None, **kw):
126127
block.display_name = display_name
127128

128129
block.start = datetime.datetime(2010, 5, 12, 2, 42, tzinfo=pytz.utc)
130+
block.weight = weight
129131
modulestore().create_item(
130132
self.staff.username, block.location.course_key, block.location.block_type, block.location.block_id
131133
)
@@ -231,7 +233,7 @@ def test_student_view(self, fragment, render_template):
231233
"""
232234
Test student view renders correctly.
233235
"""
234-
block = self.make_one("Custom name")
236+
block = self.make_one("Custom name", weight=12)
235237
self.personalize(block, **self.make_student(block, 'fred'))
236238
fragment = block.student_view()
237239
render_template.assert_called_once()
@@ -254,6 +256,7 @@ def test_student_view(self, fragment, render_template):
254256
self.assertEqual(student_state['upload_allowed'], True)
255257
self.assertEqual(student_state['max_score'], 100)
256258
self.assertEqual(student_state['graded'], None)
259+
assert student_state['weight'] == 12
257260
fragment.add_css.assert_called_once_with(
258261
DummyResource("static/css/edx_sga.css"))
259262
fragment.initialize_js.assert_called_once_with(
@@ -385,7 +388,7 @@ def point_positive_int_test():
385388
block.save_sga(mock.Mock(body='{}'))
386389
self.assertEqual(block.display_name, "Staff Graded Assignment")
387390
self.assertEqual(block.points, 100)
388-
self.assertEqual(block.weight, None)
391+
self.assertEqual(block.weight, 0)
389392
block.save_sga(mock.Mock(method="POST", body=json.dumps({
390393
"display_name": "Test Block",
391394
"points": str(orig_score),
@@ -661,7 +664,7 @@ def test_get_staff_grading_data(self):
661664
"""
662665
Test fetch grading data for staff members.
663666
"""
664-
block = self.make_one()
667+
block = self.make_one(weight=15)
665668
barney = self.make_student(
666669
block, "barney",
667670
filename="foo.txt",
@@ -672,6 +675,7 @@ def test_get_staff_grading_data(self):
672675
block, "fred",
673676
filename="bar.txt")
674677
data = block.get_staff_grading_data(None).json_body # lint-amnesty, pylint: disable=redefined-outer-name
678+
assert data['weight'] == 15
675679
assignments = sorted(data['assignments'], key=lambda x: x['username'])
676680

677681
barney_assignment, fred_assignment = assignments
@@ -757,8 +761,10 @@ def test_enter_grade_staff(self):
757761
'submission_id': fred['submission']['uuid'],
758762
'grade': 9,
759763
'comment': "Good!"}))
760-
state = json.loads(StudentModule.objects.get(
761-
pk=fred['module'].id).state)
764+
student_module = StudentModule.objects.get(pk=fred['module'].id)
765+
state = json.loads(student_module.state)
766+
assert student_module.grade == 9
767+
assert student_module.max_grade == block.max_score()
762768
self.assertEqual(state['comment'], 'Good!')
763769
self.assertEqual(state['staff_score'], 9)
764770

@@ -802,7 +808,9 @@ def test_remove_grade(self):
802808
'student_id': item.student_id,
803809
})
804810
block.remove_grade(request)
805-
state = json.loads(StudentModule.objects.get(pk=module.id).state)
811+
student_module = StudentModule.objects.get(pk=module.id)
812+
state = json.loads(student_module.state)
813+
assert student_module.grade == 0
806814
self.assertEqual(block.get_score(item.student_id), None)
807815
self.assertEqual(state['comment'], '')
808816

0 commit comments

Comments
 (0)