From 6739c0eb555a6ff9cd4e59258128f83c8bc52727 Mon Sep 17 00:00:00 2001 From: Simon Chen Date: Fri, 18 Jan 2019 09:42:35 -0500 Subject: [PATCH] Make sure we return the right possible_grade value on grade APIs --- lms/djangoapps/grades/subsection_grade.py | 10 ++++++---- .../tests/test_subsection_grade_factory.py | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lms/djangoapps/grades/subsection_grade.py b/lms/djangoapps/grades/subsection_grade.py index 9d1fb462f0..d8aa4e3ff4 100644 --- a/lms/djangoapps/grades/subsection_grade.py +++ b/lms/djangoapps/grades/subsection_grade.py @@ -191,13 +191,15 @@ class NonZeroSubsectionGrade(SubsectionGradeBase): used instead. """ score_type = 'graded' if is_graded else 'all' - grade_object = grade_model + earned_value = getattr(grade_model, 'earned_{}'.format(score_type)) + possible_value = getattr(grade_model, 'possible_{}'.format(score_type)) if hasattr(grade_model, 'override'): score_type = 'graded_override' if is_graded else 'all_override' - grade_object = grade_model.override + earned_value = getattr(grade_model.override, 'earned_{}'.format(score_type)) or earned_value + possible_value = getattr(grade_model.override, 'possible_{}'.format(score_type)) or possible_value return AggregatedScore( - tw_earned=getattr(grade_object, 'earned_{}'.format(score_type)), - tw_possible=getattr(grade_object, 'possible_{}'.format(score_type)), + tw_earned=earned_value, + tw_possible=possible_value, graded=is_graded, first_attempted=grade_model.first_attempted, ) diff --git a/lms/djangoapps/grades/tests/test_subsection_grade_factory.py b/lms/djangoapps/grades/tests/test_subsection_grade_factory.py index 7d376326ff..95a3604b55 100644 --- a/lms/djangoapps/grades/tests/test_subsection_grade_factory.py +++ b/lms/djangoapps/grades/tests/test_subsection_grade_factory.py @@ -114,7 +114,14 @@ class TestSubsectionGradeFactory(ProblemSubmissionTestMixin, GradeTestBase): self.subsection_grade_factory.create(self.sequence) self.assertEqual(mock_read_saved_grade.called, feature_flag and course_setting) - def test_update_with_override(self): + @ddt.data( + (0, None), + (None, 3), + (None, None), + (0, 3), + ) + @ddt.unpack + def test_update_with_override(self, graded_earned_override, graded_possible_override): """ Tests that when a PersistentSubsectionGradeOverride exists, the update() method returns a CreateSubsectionGrade with scores that account @@ -134,8 +141,9 @@ class TestSubsectionGradeFactory(ProblemSubmissionTestMixin, GradeTestBase): PersistentSubsectionGradeOverride.update_or_create_override( UserFactory(), persistent_grade, - earned_graded_override=0, + earned_graded_override=graded_earned_override, earned_all_override=0, + possible_graded_override=graded_possible_override, feature=PersistentSubsectionGradeOverrideHistory.GRADEBOOK, ) @@ -143,4 +151,8 @@ class TestSubsectionGradeFactory(ProblemSubmissionTestMixin, GradeTestBase): # the subsection grade returned should be 0/3 due to the override. with mock_get_score(2, 3): grade = self.subsection_grade_factory.update(self.sequence) - self.assert_grade(grade, 0, 3) + self.assert_grade( + grade, + graded_earned_override or persistent_grade.earned_graded, + graded_possible_override or persistent_grade.possible_graded + )