Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Events for exams IDA #268

Merged
merged 30 commits into from
Oct 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
a6bbecd
feat: add/remove course staff role events
ilee2u Sep 19, 2023
7379a41
fix: generated avro schemas
ilee2u Sep 19, 2023
0084f13
fix: quality
ilee2u Sep 19, 2023
d3fe305
feat: fixed language of signal
ilee2u Sep 19, 2023
382ca93
fix: avro.
ilee2u Sep 19, 2023
ef56279
fix: corrected signal descriptions
ilee2u Sep 20, 2023
f99c3b3
feat: signals complete
ilee2u Sep 19, 2023
8e858fa
feat: improved docstrings pt 1
ilee2u Sep 19, 2023
e39f330
feat: improved event defs + avro
ilee2u Sep 21, 2023
3ed95a5
fix: rebasing off main only
ilee2u Sep 21, 2023
e148d0f
fix: made signal purpose broader
ilee2u Sep 21, 2023
e61f729
fix: removed unecessary event param
ilee2u Sep 21, 2023
0615aaf
fix: avro
ilee2u Sep 21, 2023
0f31223
fix: removed unecessary docstring
ilee2u Sep 21, 2023
2e3de7a
chore: version bump
ilee2u Sep 21, 2023
6a2647f
feat: added exam_type to ExamAttemptData
ilee2u Sep 22, 2023
121f6ba
fix: corrected exam_type attr.ib
ilee2u Sep 27, 2023
c3074b8
feat: Added "Special" to data name
ilee2u Sep 28, 2023
8917946
chore: avro
ilee2u Sep 28, 2023
d3dbf5a
chore: move data import
ilee2u Sep 28, 2023
2de9b4a
chore: changelog correction
ilee2u Sep 29, 2023
d9f9e1b
chore: 8.70 -> 8.7.0
ilee2u Sep 29, 2023
2a2299a
docs: clarified signal name prefix EXAM_
ilee2u Sep 29, 2023
918a641
feat: removed "Special" from data name
ilee2u Sep 29, 2023
d3c6581
docs: Added ADR Draft
ilee2u Sep 29, 2023
c1a196d
chore: quality
ilee2u Sep 29, 2023
d7ce2e5
docs: removed non-event related decision info
ilee2u Sep 29, 2023
9e4744c
fix: improved ADR
ilee2u Oct 2, 2023
6304946
chore: nit
ilee2u Oct 2, 2023
80629ce
chore: Add ADR link to exam event data
ilee2u Oct 2, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ Changed
~~~~~~~
* Re-licensed this repository from AGPL 3.0 to Apache 2.0

[8.7.0] - 2023-09-29
--------------------
Added
~~~~~
* Added new ``EXAM_ATTEMPT_SUBMITTED``, ``EXAM_ATTEMPT_REJECTED``, ``EXAM_ATTEMPT_VERIFIED``, ``EXAM_ATTEMPT_RESET``, and ``EXAM_ATTEMPT_ERRORED`` in learning.

[8.6.0] - 2023-08-28
--------------------
Added
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
12. Event definitions for special exam post-submission and review
#################################################################

Status
******

**Draft** 2023-10-02

Context
Copy link
Contributor

@zacharis278 zacharis278 Sep 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the context section might be a good place to explain the meaning of exam / special exam.

Rough points to hit

  • course subsections with an exam_type have additional logic that governs completion, grading, credit requirements, and more based on the type of exam.
  • these sections are sometimes referred to as special exams
  • course subsections without an exam type configured may still have a grading policy named 'Exam'. This type of content does not have the exam user experience and is not governed by any exam specific logic.

*******

About Special Exams:
====================
* Course subsections that have an `exam_type` have additional logic that governs completion, grading, credit requirements, and more based on the `exam_type` value (e.g. timed, proctored, etc).
* These subsections are also known as **Special Exams**.
* NOTE: The events described in this document will only be produced/consumed in the context of **Special Exams**.
* Course subsections that do not have an `exam_type` configured may still have a grading policy named 'Exam'. This type of content does not have the exam user experience and is not governed by any exam specific logic.

The New Exams IDA:
==================
* A new backend for exams called `edx-exams` is being developed (See the `exams IDA ADR <https://github.com/openedx/edx-proctoring/blob/master/docs/decisions/0004-exam-ida.rst>`_ for more info).
* We are currently working to use the event bus to trigger the downstream effects whenever an exam attempt is submitted or reviewed.
* For example, when an exam attempt is submitted, we will want to make sure `edx-platform` knows to mark the exam subsection as completed.


Decision
********

Where these events will be produced/consumed:
=============================================

* `edx-exams` will produce these events.
* NOTE: There is no plan to have the legacy exams backend, `edx-proctoring`, produce these events.
* `edx-platform` will consume these events in order to handle all behavior as it pertains to the state of an exam subsection.

Event Definitions:
==================
* We will define the events that as planned in `the ADR for events in edx-exams <https://github.com/edx/edx-exams/blob/main/docs/decisions/0004-downstream-effect-events.rst>`_.

Note on the Event Data/Signal Names:
====================================
We are using the prefix "Exam" as opposed to the prefix "Special_Exam" for these events because **Special Exams** will likely be the only type of exam that will be of concern to developers in the context of events for the forseeable future.


Consequences
************

* `edx-exams` will emit events via the event bus to send information without needing a response.
* Since, `edx-exams` already recieves and responds to REST requests, we will avoid creating circular dependencies because `edx-exams` will not need to send REST requests itself.
* These events are dynamic, in that they can also be consumed by other services/applications as needed in the future.

1 change: 1 addition & 0 deletions docs/decisions/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ Architectural Decision Records (ADRs)
0010-multiple-event-types-per-topic
0011-depending-on-multiple-event-bus-implementations
0012-producing-to-event-bus-via-settings
0013-special-exam-submission-and-review-events
2 changes: 1 addition & 1 deletion openedx_events/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
more information about the project.
"""

__version__ = "8.6.0"
__version__ = "8.7.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"name": "CloudEvent",
"type": "record",
"doc": "Avro Event Format for CloudEvents created with openedx_events/schema",
"fields": [
{
"name": "exam_attempt",
"type": {
"name": "ExamAttemptData",
"type": "record",
"fields": [
{
"name": "student_user",
"type": {
"name": "UserData",
"type": "record",
"fields": [
{
"name": "id",
"type": "long"
},
{
"name": "is_active",
"type": "boolean"
},
{
"name": "pii",
"type": {
"name": "UserPersonalData",
"type": "record",
"fields": [
{
"name": "username",
"type": "string"
},
{
"name": "email",
"type": "string"
},
{
"name": "name",
"type": "string"
}
]
}
}
]
}
},
{
"name": "course_key",
"type": "string"
},
{
"name": "usage_key",
"type": "string"
},
{
"name": "exam_type",
"type": "string"
},
{
"name": "requesting_user",
"type": [
"null",
"UserData"
],
"default": null
}
]
}
}
],
"namespace": "org.openedx.learning.exam.attempt.errored.v1"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"name": "CloudEvent",
"type": "record",
"doc": "Avro Event Format for CloudEvents created with openedx_events/schema",
"fields": [
{
"name": "exam_attempt",
"type": {
"name": "ExamAttemptData",
"type": "record",
"fields": [
{
"name": "student_user",
"type": {
"name": "UserData",
"type": "record",
"fields": [
{
"name": "id",
"type": "long"
},
{
"name": "is_active",
"type": "boolean"
},
{
"name": "pii",
"type": {
"name": "UserPersonalData",
"type": "record",
"fields": [
{
"name": "username",
"type": "string"
},
{
"name": "email",
"type": "string"
},
{
"name": "name",
"type": "string"
}
]
}
}
]
}
},
{
"name": "course_key",
"type": "string"
},
{
"name": "usage_key",
"type": "string"
},
{
"name": "exam_type",
"type": "string"
},
{
"name": "requesting_user",
"type": [
"null",
"UserData"
],
"default": null
}
]
}
}
],
"namespace": "org.openedx.learning.exam.attempt.rejected.v1"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"name": "CloudEvent",
"type": "record",
"doc": "Avro Event Format for CloudEvents created with openedx_events/schema",
"fields": [
{
"name": "exam_attempt",
"type": {
"name": "ExamAttemptData",
"type": "record",
"fields": [
{
"name": "student_user",
"type": {
"name": "UserData",
"type": "record",
"fields": [
{
"name": "id",
"type": "long"
},
{
"name": "is_active",
"type": "boolean"
},
{
"name": "pii",
"type": {
"name": "UserPersonalData",
"type": "record",
"fields": [
{
"name": "username",
"type": "string"
},
{
"name": "email",
"type": "string"
},
{
"name": "name",
"type": "string"
}
]
}
}
]
}
},
{
"name": "course_key",
"type": "string"
},
{
"name": "usage_key",
"type": "string"
},
{
"name": "exam_type",
"type": "string"
},
{
"name": "requesting_user",
"type": [
"null",
"UserData"
],
"default": null
}
]
}
}
],
"namespace": "org.openedx.learning.exam.attempt.reset.v1"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"name": "CloudEvent",
"type": "record",
"doc": "Avro Event Format for CloudEvents created with openedx_events/schema",
"fields": [
{
"name": "exam_attempt",
"type": {
"name": "ExamAttemptData",
"type": "record",
"fields": [
{
"name": "student_user",
"type": {
"name": "UserData",
"type": "record",
"fields": [
{
"name": "id",
"type": "long"
},
{
"name": "is_active",
"type": "boolean"
},
{
"name": "pii",
"type": {
"name": "UserPersonalData",
"type": "record",
"fields": [
{
"name": "username",
"type": "string"
},
{
"name": "email",
"type": "string"
},
{
"name": "name",
"type": "string"
}
]
}
}
]
}
},
{
"name": "course_key",
"type": "string"
},
{
"name": "usage_key",
"type": "string"
},
{
"name": "exam_type",
"type": "string"
},
{
"name": "requesting_user",
"type": [
"null",
"UserData"
],
"default": null
}
]
}
}
],
"namespace": "org.openedx.learning.exam.attempt.submitted.v1"
}
Loading