diff --git a/docs/decisions/0004-downstream-effect-events.rst b/docs/decisions/0004-downstream-effect-events.rst index 522372a8..5d4f3756 100644 --- a/docs/decisions/0004-downstream-effect-events.rst +++ b/docs/decisions/0004-downstream-effect-events.rst @@ -15,12 +15,13 @@ which edx-proctoring can call directly since it is a plugin that is installed di Decision -------- -We've decided to use an event driven architecture because unlike the legacy system (edx-porctoring), edx-exams is an independent service. +We've decided to use an event driven architecture because unlike the legacy system (edx-proctoring), edx-exams is an independent service. As such, we plan to use the event bus to send info to edx-platform services without needing a response as one would in a REST framework. -Below are lists of downstream effects of exam submission and review that we will or will not be translating into events in edx-exams as part of this decision. +Below are lists of downstream effects of exam submission and review that we will or will not be impementing as downstream effects that will be +triggered by events emitted in edx-exams per this decision. -Downstream effects to be implemented as events: +Downstream effects to be implemented: *********************************************** * Grades Override - A python API call to the grades app to generate a grade override when an exam attempt is rejected. @@ -56,21 +57,40 @@ Downstream effects that are not being implemented as part of this decision: * We will implement this later since we do not believe this to be an essential feature. -For easier visualization, here are all of the events we plan to implement, described from end to end: +For easier visualization, here are all of the downstream effects we plan to port, described from end to end: + +Downstream effects to be implemented as part of this decision: +************************************************************** + ====================================== ================================================================================================ ============================================ =============================================== ========================================================================= ====================================================================================== + Downstream Effect Context in which it's triggered Consumer Location Functions Called General Context for Calls Expected Result + ====================================== ================================================================================================ ============================================ =============================================== ========================================================================= ====================================================================================== + Grades Override When an exam attempt is rejected. lms/djangoapps/grades/signals.py override_subsection_grade in api.py When we need to override a grade from any service. A grade override object is created or modified in the grades service within the LMS. + Undo Grades Override When an exam attempt is verified after previously being rejected, OR when it is deleted/reset. lms/djangoapps/grades/signals.py undo_override_subsection_grade in services.py When we need to undo a grade override from any service. A grade override object is deleted in the grades service within the LMS. + Instructor Reset Subsection When an exam attempt is deleted/reset. lms/djangoapps/instructor/signals.py reset_student_attempts in enrollments.py When we need to reset a student’s state in a subsection. A learner's state for a subsection is reset. + Instructor Mark Subsection Completed When an exam attempt is completed. lms/djangoapps/instructor/signals.py update_exam_completion_task in tasks.py When we need to mark a subsection as completed. A subsection is marked completed for a learner. + Invalidate Certificate When an exam attempt is rejected. lms/djangoapps/certificates/signals.py invalidate_certificate in services.py When we need to invalidate a learner's certificate. A certificate object's status is set to "unavailable". + Set Credit Requirement Status When exam attempt is completed. openedx/core/djangoapps/credits/signals.py set_credit_requirement_status in services.py When we need to create or modify a learner's credit requirement status. A credit requirement status object is created or modified within the LMS. + ====================================== ================================================================================================ ============================================ =============================================== ========================================================================= ====================================================================================== + +Event Triggers: +*************** +We will define the events in edx-exams such that they are emitted whenever an exam attempt is submitted, rejected, verified, errored, or reset. +After these events are emitted, they will trigger their respective chosen downstream effects. + +For easier visualization, here are all of the events we plan to implement: Events to be implemented as part of this decision: ************************************************** - ====================================== ================================================================================================ =========================================================================================== ============================================ ================================================ ========================================================================= ====================================================================================== - Event Type Production Context Data sent Consumer Location Functions Called General Context for Calls Expected Result - ====================================== ================================================================================================ =========================================================================================== ============================================ ================================================ ========================================================================= ====================================================================================== - Grades Override When an exam attempt is rejected. user_id, course_key_or_id, usage_key_or_id, earned_all, earned_graded, overrider, comment lms/djangoapps/grades/signals.py override_subsection_grade in api.py When we need to override a grade from any service. A grade override object is created or modified in the grades service within the LMS. - Invalidate Certificate When an exam attempt is rejected. user_id, course_key_or_id lms/djangoapps/certificates/signals.py invalidate_certificate in services.py When we need to invalidate a learner's certificate. A certificate object's status is set to "unavailable". - Undo Grades Override When an exam attempt is verified after previously being rejected, OR when it is deleted/reset. user_id, course_key_or_id, usage_key_or_id lms/djangoapps/grades/signals.py undo_override_subsection_grade in services.py When we need to undo a grade override from any service. A grade override object is deleted in the grades service within the LMS. - Instructor Reset Subsection When an exam attempt is deleted/reset. username, course_id, content_id, requesting_user lms/djangoapps/instructor/signals.py reset_student_attempts in enrollments.py When we need to reset a student’s state in a subsection. A learner's state for a subsection is reset. - Remove Credit Requirement Status When an exam attempt is deleted/reset. user_id, course_key_or_id, req_namespace, req_name openedx/core/djangoapps/credits/signals.py remove_credit_requirement_status in services.py When we need to remove a learner's credit requirement status. A credit requirement status object is deleted within the LMS. - Set Credit Requirement Status When an exam attempt is completed. user_id, course_key_or_id, req_namespace, req_name, status openedx/core/djangoapps/credits/signals.py set_credit_requirement_status in services.py When we need to create or modify a learner's credit requirement status. A credit requirement status object is created or modified within the LMS. - Instructor Mark Subsection Completed When an exam attempt is completed. username, content_id lms/djangoapps/instructor/signals.py update_exam_completion_task in tasks.py When we need to mark a subsection as completed. A subsection is marked completed for a learner. - ====================================== ================================================================================================ =========================================================================================== ============================================ ================================================ ========================================================================= ====================================================================================== + ======================== ======================================== ======================================================================== + Event Type Context in which event is produced Downstream effects triggered + ======================== ======================================== ======================================================================== + Exam Attempt Submitted When an exam attempt is submitted. Instructor Mark Subsection Completed, Set Credit Requirement Status + Exam Attempt Rejected When an exam attempt is rejected. Set Credit Requirement Status, Grades Override, Invalidate Certificate + Exam Attempt Verified When an exam attempt is verified. Set Credit Requirement Status, Undo Grades Override + Exam Attempt Errored When exam attempt errors out. Set Credit Requirement Status + Exam Attempt Reset When an exam attempt is deleted/reset. Instructor Reset Subsection, Reset Credit Requirement Status + ======================== ======================================== ======================================================================== + Consequences ------------