From 21613ce0deb3a89b6f640620fbac72df8fa88951 Mon Sep 17 00:00:00 2001 From: Deimer Morales <105317492+DeimerM@users.noreply.github.com> Date: Tue, 20 Sep 2022 08:36:18 -0500 Subject: [PATCH] feat: adding event to handle persistent grades. (#99) New event triggered when a persistent grade is created or updated. --- CHANGELOG.rst | 5 ++++ .../event_bus/avro/tests/test_avro.py | 3 ++- openedx_events/learning/data.py | 26 +++++++++++++++++++ openedx_events/learning/signals.py | 12 +++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cc8802b8..7ed13787 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,11 @@ Change Log Unreleased ---------- +[0.13.0] - 2022-09-16 +--------------------- +Added +~~~~~ +* Added new event PERSISTENT_GRADE_SUMMARY_CHANGED. * Improvements in make upgrade command and requirements files. * Manually update requirements files to fix requirements bot issue with pip/setup tools. diff --git a/openedx_events/event_bus/avro/tests/test_avro.py b/openedx_events/event_bus/avro/tests/test_avro.py index 77c75337..17ed442b 100644 --- a/openedx_events/event_bus/avro/tests/test_avro.py +++ b/openedx_events/event_bus/avro/tests/test_avro.py @@ -34,7 +34,7 @@ def generate_test_event_data_for_data_type(data_type): """ Generates test data for use in the event bus test cases. - Builds data by filling in dummy data for basic data types (int/bool/str) + Builds data by filling in dummy data for basic data types (int/float/bool/str) and recursively breaks down the classes for nested classes into basic data types. Arguments: @@ -48,6 +48,7 @@ def generate_test_event_data_for_data_type(data_type): int: 1, bool: True, str: "default", + float: 1.0, CourseKey: CourseKey.from_string("course-v1:edX+DemoX.1+2014"), datetime: datetime.now(), } diff --git a/openedx_events/learning/data.py b/openedx_events/learning/data.py index 8935f88a..f6a675d6 100644 --- a/openedx_events/learning/data.py +++ b/openedx_events/learning/data.py @@ -191,3 +191,29 @@ class CourseDiscussionConfigurationData: unit_level_visibility = attr.ib(type=bool, default=False) plugin_configuration = attr.ib(type=dict, default={}) contexts = attr.ib(type=List[DiscussionTopicContext], factory=list) + + +@attr.s(frozen=True) +class PersistentCourseGradeData: + """ + Attributes defined for Open edX PersistentCourseGrade data object. + + Arguments: + user_id (int): identifier of the grade to which the grade belongs. + course (CourseData): Identifier of the course to which the grade belongs. + course_edited_timestamp (datetime): date the course was edited. + course_version (str): version of the course. + grading_policy_hash (str): grading policy hash of the course. + percent_grade (float): percentage of the grade. + letter_grade (str): grade in letter + passed_timestamp (datetime): date the course was passed. + """ + + user_id = attr.ib(type=int) + course = attr.ib(type=CourseData) + course_edited_timestamp = attr.ib(type=datetime) + course_version = attr.ib(type=str) + grading_policy_hash = attr.ib(type=str) + percent_grade = attr.ib(type=float) + letter_grade = attr.ib(type=str) + passed_timestamp = attr.ib(type=datetime) diff --git a/openedx_events/learning/signals.py b/openedx_events/learning/signals.py index 60bf4cd7..f0d3d185 100644 --- a/openedx_events/learning/signals.py +++ b/openedx_events/learning/signals.py @@ -13,6 +13,7 @@ CohortData, CourseDiscussionConfigurationData, CourseEnrollmentData, + PersistentCourseGradeData, UserData, ) from openedx_events.tooling import OpenEdxPublicSignal @@ -136,3 +137,14 @@ "configuration": CourseDiscussionConfigurationData } ) + +# .. event_type: org.openedx.learning.course.persistent_grade.summary.v1 +# .. event_name: PERSISTENT_GRADE_SUMMARY_CHANGED +# .. event_description: emitted when a grade changes in the course +# .. event_data: PersistentCourseGradeData +PERSISTENT_GRADE_SUMMARY_CHANGED = OpenEdxPublicSignal( + event_type="org.openedx.learning.course.persistent_grade_summary.changed.v1", + data={ + "grade": PersistentCourseGradeData, + } +)