Merge pull request #33412 from openedx/MichaelRoytman/MST-2107-EXAM_ATTEMPT_REJECTED-consumer
Add grades event bus event handler for rejected special exam.
This commit is contained in:
@@ -8,7 +8,7 @@ from logging import getLogger
|
||||
|
||||
from django.dispatch import receiver
|
||||
from opaque_keys.edx.keys import LearningContextKey
|
||||
from openedx_events.learning.signals import EXAM_ATTEMPT_VERIFIED
|
||||
from openedx_events.learning.signals import EXAM_ATTEMPT_REJECTED, EXAM_ATTEMPT_VERIFIED
|
||||
from submissions.models import score_reset, score_set
|
||||
from xblock.scorable import ScorableXBlockMixin, Score
|
||||
|
||||
@@ -322,3 +322,28 @@ def exam_attempt_verified_event_handler(sender, signal, **kwargs): # pylint: di
|
||||
|
||||
if should_override_grade_on_rejected_exam(course_key):
|
||||
undo_override_subsection_grade(user_data.id, course_key, usage_key, GradeOverrideFeatureEnum.proctoring)
|
||||
|
||||
|
||||
@receiver(EXAM_ATTEMPT_REJECTED)
|
||||
def exam_attempt_rejected_event_handler(sender, signal, **kwargs): # pylint: disable=unused-argument
|
||||
"""
|
||||
Consume `EXAM_ATTEMPT_REJECTED` events from the event bus. This will trigger a subsection override.
|
||||
"""
|
||||
from ..api import override_subsection_grade
|
||||
|
||||
event_data = kwargs.get('exam_attempt')
|
||||
override_grade_value = 0.0
|
||||
user_data = event_data.student_user
|
||||
course_key = event_data.course_key
|
||||
usage_key = event_data.usage_key
|
||||
|
||||
override_subsection_grade(
|
||||
user_data.id,
|
||||
course_key,
|
||||
usage_key,
|
||||
earned_all=override_grade_value,
|
||||
earned_graded=override_grade_value,
|
||||
feature=GradeOverrideFeatureEnum.proctoring,
|
||||
overrider=None,
|
||||
comment=None,
|
||||
)
|
||||
|
||||
@@ -10,10 +10,13 @@ from django.test import TestCase
|
||||
from opaque_keys.edx.keys import CourseKey, UsageKey
|
||||
from openedx_events.data import EventsMetadata
|
||||
from openedx_events.learning.data import ExamAttemptData, UserData, UserPersonalData
|
||||
from openedx_events.learning.signals import EXAM_ATTEMPT_VERIFIED
|
||||
from openedx_events.learning.signals import EXAM_ATTEMPT_REJECTED, EXAM_ATTEMPT_VERIFIED
|
||||
|
||||
from common.djangoapps.student.tests.factories import UserFactory
|
||||
from lms.djangoapps.grades.signals.handlers import exam_attempt_verified_event_handler
|
||||
from lms.djangoapps.grades.signals.handlers import (
|
||||
exam_attempt_rejected_event_handler,
|
||||
exam_attempt_verified_event_handler
|
||||
)
|
||||
from ..constants import GradeOverrideFeatureEnum
|
||||
|
||||
|
||||
@@ -101,3 +104,30 @@ class ExamCompletionEventBusTests(TestCase):
|
||||
)
|
||||
else:
|
||||
mock_undo_override.assert_not_called()
|
||||
|
||||
@mock.patch('lms.djangoapps.grades.api.override_subsection_grade')
|
||||
def test_exam_attempt_rejected_event_handler(self, mock_override):
|
||||
exam_event_data = self._get_exam_event_data(self.student_user,
|
||||
self.course_key,
|
||||
self.usage_key,
|
||||
exam_type='proctored')
|
||||
event_metadata = self._get_exam_event_metadata(EXAM_ATTEMPT_REJECTED)
|
||||
|
||||
event_kwargs = {
|
||||
'exam_attempt': exam_event_data,
|
||||
'metadata': event_metadata
|
||||
}
|
||||
exam_attempt_rejected_event_handler(None, EXAM_ATTEMPT_REJECTED, ** event_kwargs)
|
||||
|
||||
override_grade_value = 0.0
|
||||
|
||||
mock_override.assert_called_once_with(
|
||||
self.student_user.id,
|
||||
self.course_key,
|
||||
self.usage_key,
|
||||
earned_all=override_grade_value,
|
||||
earned_graded=override_grade_value,
|
||||
feature=GradeOverrideFeatureEnum.proctoring,
|
||||
overrider=None,
|
||||
comment=None,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user