diff --git a/lms/djangoapps/grades/signals/handlers.py b/lms/djangoapps/grades/signals/handlers.py index 8b64ddf2c3..4a5b4d5e26 100644 --- a/lms/djangoapps/grades/signals/handlers.py +++ b/lms/djangoapps/grades/signals/handlers.py @@ -57,6 +57,9 @@ def submissions_score_set_handler(sender, **kwargs): # pylint: disable=unused-a user = user_by_anonymous_id(kwargs['anonymous_user_id']) if user is None: return + if points_possible == 0: + # This scenario is known to not succeed, see TNL-6559 for details. + return PROBLEM_WEIGHTED_SCORE_CHANGED.send( sender=None, @@ -100,6 +103,7 @@ def submissions_score_reset_handler(sender, **kwargs): # pylint: disable=unused course_id=course_id, usage_id=usage_id, modified=kwargs['created_at'], + score_deleted=True, score_db_table=ScoreDatabaseTableEnum.submissions, ) diff --git a/lms/djangoapps/grades/tests/test_signals.py b/lms/djangoapps/grades/tests/test_signals.py index 0c2b65000b..896d18899c 100644 --- a/lms/djangoapps/grades/tests/test_signals.py +++ b/lms/djangoapps/grades/tests/test_signals.py @@ -130,9 +130,22 @@ class ScoreChangedSignalRelayTest(TestCase): 'modified': FROZEN_NOW_TIMESTAMP, 'score_db_table': 'submissions', } + if handler == submissions_score_reset_handler: + expected_set_kwargs['score_deleted'] = True self.signal_mock.assert_called_once_with(**expected_set_kwargs) self.get_user_mock.assert_called_once_with(kwargs['anonymous_user_id']) + def test_tnl_6599_zero_possible_bug(self): + """ + Ensure that, if coming from the submissions API, signals indicating a + a possible score of 0 are swallowed for reasons outlined in TNL-6559. + """ + local_kwargs = SUBMISSION_SET_KWARGS.copy() + local_kwargs['points_earned'] = 0 + local_kwargs['points_possible'] = 0 + submissions_score_set_handler(None, **local_kwargs) + self.signal_mock.assert_not_called() + @ddt.data( [submissions_score_set_handler, SUBMISSION_SET_KWARGS], [submissions_score_reset_handler, SUBMISSION_RESET_KWARGS]