From 64c472ba69652fbbebf76411955e2fe788a2f236 Mon Sep 17 00:00:00 2001 From: Troy Sankey Date: Tue, 30 Jul 2024 15:32:06 -0700 Subject: [PATCH] feat: Add enterprise signal for learner credit fulfillment revokation ENT-9213 --- openedx_events/enterprise/data.py | 64 +++++++++ openedx_events/enterprise/signals.py | 15 +- ...t_course_enrollment+revoked+v1_schema.avsc | 135 ++++++++++++++++++ 3 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 openedx_events/event_bus/avro/tests/schemas/org+openedx+enterprise+learner_credit_course_enrollment+revoked+v1_schema.avsc diff --git a/openedx_events/enterprise/data.py b/openedx_events/enterprise/data.py index c3b3d1f6..103e2309 100644 --- a/openedx_events/enterprise/data.py +++ b/openedx_events/enterprise/data.py @@ -94,3 +94,67 @@ class LedgerTransaction(BaseLedgerTransaction): parent_content_key = attr.ib(type=str, default=None) fulfillment_identifier = attr.ib(type=str, default=None) reversal = attr.ib(type=LedgerTransactionReversal, default=None) + + +@attr.s(frozen=True) +class EnterpriseCustomerUser: + """ + Defines the common attributes of enterprise fulfillment classes. + """ + id = attr.ib(type=int) + created = attr.ib(type=datetime) + modified = attr.ib(type=datetime) + enterprise_customer_uuid = attr.ib(type=UUID) + user_id = attr.ib(type=int) + active = attr.ib(type=bool) + linked = attr.ib(type=bool) + is_relinkable = attr.ib(type=bool) + invite_key = attr.ib(type=UUID) + should_inactivate_other_customers = attr.ib(type=bool) + + +@attr.s(frozen=True) +class EnterpriseCourseEnrollment: + """ + Defines the common attributes of enterprise fulfillment classes. + """ + id = attr.ib(type=int) + created = attr.ib(type=datetime) + modified = attr.ib(type=datetime) + enterprise_customer_user = attr.ib(type=EnterpriseCustomerUser) + course_id = attr.ib(type=CourseKey) + saved_for_later = attr.ib(type=bool) + source_slug = attr.ib(type=str) + unenrolled = attr.ib(type=bool) + unenrolled_at = attr.ib(type=datetime) + + +@attr.s(frozen=True) +class BaseEnterpriseFulfillment: + """ + Defines the common attributes of enterprise fulfillment classes, i.e. attributes of an + ``enterprise.EnterpriseFulfillmentSource`` record. + """ + uuid = attr.ib(type=UUID) + created = attr.ib(type=datetime) + modified = attr.ib(type=datetime) + fulfillment_type = attr.ib(type=str) + enterprise_course_entitlement_uuid = attr.ib(type=UUID) + enterprise_course_enrollment = attr.ib(type=EnterpriseCourseEnrollment) + is_revoked = attr.ib(type=bool) + + +@attr.s(frozen=True) +class LearnerCreditEnterpriseCourseEnrollment(BaseEnterpriseFulfillment): + """ + Attributes of an ``enterprise.LearnerCreditEnterpriseCourseEnrollment`` record. + """ + transaction_id = attr.ib(type=UUID) + + +@attr.s(frozen=True) +class LicensedEnterpriseCourseEnrollment(BaseEnterpriseFulfillment): + """ + Attributes of an ``enterprise.LicensedEnterpriseCourseEnrollment`` record. + """ + license_uuid = attr.ib(type=UUID) diff --git a/openedx_events/enterprise/signals.py b/openedx_events/enterprise/signals.py index 50c8a3b7..ee16b910 100644 --- a/openedx_events/enterprise/signals.py +++ b/openedx_events/enterprise/signals.py @@ -8,7 +8,7 @@ docs/decisions/0003-events-payload.rst """ -from openedx_events.enterprise.data import LedgerTransaction, SubsidyRedemption +from openedx_events.enterprise.data import LearnerCreditEnterpriseCourseEnrollment, LedgerTransaction, SubsidyRedemption from openedx_events.tooling import OpenEdxPublicSignal # .. event_type: org.openedx.enterprise.subsidy.redeemed.v1 @@ -84,3 +84,16 @@ "ledger_transaction": LedgerTransaction, } ) + + +# .. event_type: org.openedx.enterprise.learner_credit_course_enrollment.revoked.v1 +# .. event_name: LEARNER_CREDIT_COURSE_ENROLLMENT_REVOKED +# .. event_description: emitted when a LearnerCreditEnterpriseCourseEnrollment is revoked. This most often happens when +# an enterprise learner unenrolls from a course which was LC-subsidized. +# .. event_data: LearnerCreditEnterpriseCourseEnrollment +LEARNER_CREDIT_COURSE_ENROLLMENT_REVOKED = OpenEdxPublicSignal( + event_type="org.openedx.enterprise.learner_credit_course_enrollment.revoked.v1", + data={ + "learner_credit_course_enrollment": LearnerCreditEnterpriseCourseEnrollment, + } +) diff --git a/openedx_events/event_bus/avro/tests/schemas/org+openedx+enterprise+learner_credit_course_enrollment+revoked+v1_schema.avsc b/openedx_events/event_bus/avro/tests/schemas/org+openedx+enterprise+learner_credit_course_enrollment+revoked+v1_schema.avsc new file mode 100644 index 00000000..75fb19ef --- /dev/null +++ b/openedx_events/event_bus/avro/tests/schemas/org+openedx+enterprise+learner_credit_course_enrollment+revoked+v1_schema.avsc @@ -0,0 +1,135 @@ +{ + "name": "CloudEvent", + "type": "record", + "doc": "Avro Event Format for CloudEvents created with openedx_events/schema", + "fields": [ + { + "name": "learner_credit_course_enrollment", + "type": { + "name": "LearnerCreditEnterpriseCourseEnrollment", + "type": "record", + "fields": [ + { + "name": "uuid", + "type": "string" + }, + { + "name": "created", + "type": "string" + }, + { + "name": "modified", + "type": "string" + }, + { + "name": "fulfillment_type", + "type": "string" + }, + { + "name": "enterprise_course_entitlement_uuid", + "type": "string" + }, + { + "name": "enterprise_course_enrollment", + "type": { + "name": "EnterpriseCourseEnrollment", + "type": "record", + "fields": [ + { + "name": "id", + "type": "long" + }, + { + "name": "created", + "type": "string" + }, + { + "name": "modified", + "type": "string" + }, + { + "name": "enterprise_customer_user", + "type": { + "name": "EnterpriseCustomerUser", + "type": "record", + "fields": [ + { + "name": "id", + "type": "long" + }, + { + "name": "created", + "type": "string" + }, + { + "name": "modified", + "type": "string" + }, + { + "name": "enterprise_customer_uuid", + "type": "string" + }, + { + "name": "user_id", + "type": "long" + }, + { + "name": "active", + "type": "boolean" + }, + { + "name": "linked", + "type": "boolean" + }, + { + "name": "is_relinkable", + "type": "boolean" + }, + { + "name": "invite_key", + "type": "string" + }, + { + "name": "should_inactivate_other_customers", + "type": "boolean" + } + ] + } + }, + { + "name": "course_id", + "type": "string" + }, + { + "name": "saved_for_later", + "type": "boolean" + }, + { + "name": "source_slug", + "type": "string" + }, + { + "name": "unenrolled", + "type": "boolean" + }, + { + "name": "unenrolled_at", + "type": "string" + } + ] + } + }, + { + "name": "is_revoked", + "type": "boolean" + }, + { + "name": "transaction_id", + "type": "string" + } + ] + } + } + ], + "namespace": "org.openedx.enterprise.learner_credit_course_enrollment.revoked.v1" +} \ No newline at end of file