diff --git a/lms/djangoapps/grades/services.py b/lms/djangoapps/grades/services.py index 6e7130fc6e..bd4abfb03c 100644 --- a/lms/djangoapps/grades/services.py +++ b/lms/djangoapps/grades/services.py @@ -105,7 +105,11 @@ class GradesService(object): course_key = _get_key(course_key_or_id, CourseKey) usage_key = _get_key(usage_key_or_id, UsageKey) - override = self.get_subsection_grade_override(user_id, course_key, usage_key) + try: + override = self.get_subsection_grade_override(user_id, course_key, usage_key) + except PersistentSubsectionGrade.DoesNotExist: + return + # Older rejected exam attempts that transition to verified might not have an override created if override is not None: override.delete() diff --git a/lms/djangoapps/grades/tests/test_services.py b/lms/djangoapps/grades/tests/test_services.py index f444ec8d1c..ba4a48f687 100644 --- a/lms/djangoapps/grades/tests/test_services.py +++ b/lms/djangoapps/grades/tests/test_services.py @@ -217,6 +217,25 @@ class GradesServiceTests(ModuleStoreTestCase): ) ) + @freeze_time('2018-01-01') + def test_undo_override_subsection_grade_without_grade(self): + """ + Test exception handling of `undo_override_subsection_grade` when PersistentSubsectionGrade + does not exist. + """ + + self.grade.delete() + try: + self.service.undo_override_subsection_grade( + user_id=self.user.id, + course_key_or_id=self.course.id, + usage_key_or_id=self.subsection.location, + ) + except PersistentSubsectionGrade.DoesNotExist: + assert False, 'Exception raised unexpectedly' + + self.assertFalse(self.mock_signal.called) + def test_should_override_grade_on_rejected_exam(self): self.assertTrue(self.service.should_override_grade_on_rejected_exam('course-v1:edX+DemoX+Demo_Course')) self.mock_waffle_flags.return_value = {