From 1f6585a837e17e2004273a0adde031884ef25beb Mon Sep 17 00:00:00 2001 From: mariagrimaldi Date: Fri, 16 Jul 2021 11:41:23 -0400 Subject: [PATCH] feat: add data attributes definition for learning subdomain --- CHANGELOG.rst | 3 +- openedx_events/learning/data.py | 137 ++++++++++++++++++++++++++++++++ requirements/base.in | 1 + requirements/base.txt | 8 ++ requirements/dev.txt | 7 ++ requirements/doc.txt | 7 ++ requirements/quality.txt | 7 ++ requirements/test.txt | 15 +++- 8 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 openedx_events/learning/data.py diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 285f99d7..82aa86e3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,7 +15,8 @@ Unreleased ~~~~~~~~~~ Added _____ -* Add tooling needed to create and trigger events in Open edX platform +* Add tooling needed to create and trigger events in Open edX platform. +* Add Data Attribute classes used as arguments by Open edX Events. [0.2.0] - 2021-07-28 diff --git a/openedx_events/learning/data.py b/openedx_events/learning/data.py new file mode 100644 index 00000000..f05d8e28 --- /dev/null +++ b/openedx_events/learning/data.py @@ -0,0 +1,137 @@ +""" +Data attributes for events within the architecture subdomain `learning`. + +These attributes follow the form of attr objects specified in OEP-49 data +pattern. +""" +from datetime import datetime + +import attr +from opaque_keys.edx.keys import CourseKey + + +@attr.s(frozen=True) +class UserNonPersonalData: + """ + Attributes defined for Open edX user object based on non-PII data. + + Arguments: + id (int): unique identifier for the Django User object. + is_active (bool): indicates whether the user is active. + """ + + id = attr.ib(type=int) + is_active = attr.ib(type=bool) + + +@attr.s(frozen=True) +class UserPersonalData: + """ + Attributes defined for Open edX user object based on PII data. + + Arguments: + username (str): username associated with the Open edX user. + email (str): email associated with the Open edX user. + name (str): email associated with the Open edX user's profile. + """ + + username = attr.ib(type=str) + email = attr.ib(type=str) + name = attr.ib(type=str, factory=str) + + +@attr.s(frozen=True) +class UserData(UserNonPersonalData): + """ + Attributes defined for Open edX user object. + + This class extends UserNonPersonalData to include PII data completing the + user object. + + Arguments: + pii (UserPersonalData): user's Personal Identifiable Information. + """ + + pii = attr.ib(type=UserPersonalData) + + +@attr.s(frozen=True) +class CourseData: + """ + Attributes defined for Open edX Course Overview object. + + Arguments: + course_key (str): identifier of the Course object. + display_name (str): display name associated with the course. + start (datetime): start date for the course. + end (datetime): end date for the course. + """ + + course_key = attr.ib(type=CourseKey) + display_name = attr.ib(type=str, factory=str) + start = attr.ib(type=datetime, default=None) + end = attr.ib(type=datetime, default=None) + + +@attr.s(frozen=True) +class CourseEnrollmentData: + """ + Attributes defined for Open edX Course Enrollment object. + + Arguments: + user (UserData): user associated with the Course Enrollment. + course (CourseData): course where the user is enrolled in. + mode (str): course mode associated with the course. + is_active (bool): whether the enrollment is active. + creation_date (datetime): creation date of the enrollment. + created_by (UserData): if available, who created the enrollment. + """ + + user = attr.ib(type=UserData) + course = attr.ib(type=CourseData) + mode = attr.ib(type=str) + is_active = attr.ib(type=bool) + creation_date = attr.ib(type=datetime) + created_by = attr.ib(type=UserData, default=None) + + +@attr.s(frozen=True) +class CertificateData: + """ + Attributes defined for Open edX Certificate data object. + + Arguments: + user (UserData): user associated with the Certificate. + course (CourseData): course where the user obtained the certificate. + mode (str): course mode associated with the course. + grade (str): user's grade in this course run. + current_status (str): current certificate status. + previous_status (str): if available, pre-event certificate status. + download_url (str): URL where the PDF version of the certificate. + name (str): user's name. + """ + + user = attr.ib(type=UserData) + course = attr.ib(type=CourseData) + mode = attr.ib(type=str) + grade = attr.ib(type=str) + download_url = attr.ib(type=str) + name = attr.ib(type=str) + current_status = attr.ib(type=str) + previous_status = attr.ib(type=str, factory=str) + + +@attr.s(frozen=True) +class CohortData: + """ + Attributes defined for Open edX Cohort Membership object. + + Arguments: + user (UserData): user assigned to the group. + course (CourseData): course associated with the course group. + name (str): name of the cohort group. + """ + + user = attr.ib(type=UserData) + course = attr.ib(type=CourseData) + name = attr.ib(type=str) diff --git a/requirements/base.in b/requirements/base.in index 0c4377c4..cc8f68b4 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -3,3 +3,4 @@ django attrs +edx-opaque-keys[django] diff --git a/requirements/base.txt b/requirements/base.txt index d8c1296f..78190cde 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -10,7 +10,15 @@ django==2.2.24 # via # -c requirements/constraints.txt # -r requirements/base.in +edx-opaque-keys[django]==2.2.2 + # via -r requirements/base.in +pbr==5.6.0 + # via stevedore +pymongo==3.11.4 + # via edx-opaque-keys pytz==2021.1 # via django sqlparse==0.4.1 # via django +stevedore==3.3.0 + # via edx-opaque-keys diff --git a/requirements/dev.txt b/requirements/dev.txt index 23adb671..315705f6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -88,6 +88,8 @@ docutils==0.17.1 # readme-renderer edx-lint==5.0.0 # via -r requirements/quality.txt +edx-opaque-keys[django]==2.2.2 + # via -r requirements/quality.txt filelock==3.0.12 # via # -r requirements/ci.txt @@ -213,6 +215,10 @@ pylint-plugin-utils==0.6 # -r requirements/quality.txt # pylint-celery # pylint-django +pymongo==3.11.4 + # via + # -r requirements/quality.txt + # edx-opaque-keys pyparsing==2.4.7 # via # -r requirements/ci.txt @@ -283,6 +289,7 @@ stevedore==3.3.0 # via # -r requirements/quality.txt # code-annotations + # edx-opaque-keys text-unidecode==1.3 # via # -r requirements/quality.txt diff --git a/requirements/doc.txt b/requirements/doc.txt index 9366d7ff..ed3441e8 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -42,6 +42,8 @@ docutils==0.17.1 # readme-renderer # restructuredtext-lint # sphinx +edx-opaque-keys[django]==2.2.2 + # via -r requirements/test.txt edx-sphinx-theme==3.0.0 # via -r requirements/doc.in idna==3.2 @@ -84,6 +86,10 @@ pygments==2.9.0 # doc8 # readme-renderer # sphinx +pymongo==3.11.4 + # via + # -r requirements/test.txt + # edx-opaque-keys pyparsing==2.4.7 # via # -r requirements/test.txt @@ -148,6 +154,7 @@ stevedore==3.3.0 # -r requirements/test.txt # code-annotations # doc8 + # edx-opaque-keys text-unidecode==1.3 # via # -r requirements/test.txt diff --git a/requirements/quality.txt b/requirements/quality.txt index 248c3c1e..b2f37497 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -51,6 +51,8 @@ docutils==0.17.1 # via readme-renderer edx-lint==5.0.0 # via -r requirements/quality.in +edx-opaque-keys[django]==2.2.2 + # via -r requirements/test.txt idna==3.2 # via requests importlib-metadata==4.6.1 @@ -124,6 +126,10 @@ pylint-plugin-utils==0.6 # via # pylint-celery # pylint-django +pymongo==3.11.4 + # via + # -r requirements/test.txt + # edx-opaque-keys pyparsing==2.4.7 # via # -r requirements/test.txt @@ -176,6 +182,7 @@ stevedore==3.3.0 # via # -r requirements/test.txt # code-annotations + # edx-opaque-keys text-unidecode==1.3 # via # -r requirements/test.txt diff --git a/requirements/test.txt b/requirements/test.txt index 828d7f5e..122123d1 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -20,6 +20,8 @@ django==2.2.24 # via # -c requirements/constraints.txt # -r requirements/base.txt +edx-opaque-keys[django]==2.2.2 + # via -r requirements/base.txt iniconfig==1.1.1 # via pytest jinja2==3.0.1 @@ -29,11 +31,17 @@ markupsafe==2.0.1 packaging==21.0 # via pytest pbr==5.6.0 - # via stevedore + # via + # -r requirements/base.txt + # stevedore pluggy==0.13.1 # via pytest py==1.10.0 # via pytest +pymongo==3.11.4 + # via + # -r requirements/base.txt + # edx-opaque-keys pyparsing==2.4.7 # via packaging pytest==6.2.4 @@ -57,7 +65,10 @@ sqlparse==0.4.1 # -r requirements/base.txt # django stevedore==3.3.0 - # via code-annotations + # via + # -r requirements/base.txt + # code-annotations + # edx-opaque-keys text-unidecode==1.3 # via python-slugify toml==0.10.2