Skip to content

Commit

Permalink
feat: set up certificate receiver
Browse files Browse the repository at this point in the history
  • Loading branch information
andrey-canon committed Aug 1, 2023
1 parent 0ed13e5 commit 78a3316
Show file tree
Hide file tree
Showing 8 changed files with 181 additions and 154 deletions.
5 changes: 5 additions & 0 deletions eox_nelp/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ class EoxNelpConfig(AppConfig):
'signal_path': 'openedx.core.djangoapps.signals.signals.COURSE_GRADE_CHANGED',
'dispatch_uid': 'course_grade_publisher_receiver',
},
{
'receiver_func_name': 'certificate_publisher',
'signal_path': 'openedx_events.learning.signals.CERTIFICATE_CREATED',
'dispatch_uid': 'certificate_publisher_receiver',
},
],
},
},
Expand Down
50 changes: 50 additions & 0 deletions eox_nelp/signals/receivers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,18 @@
Functions:
block_completion_progress_publisher: it will publish the user progress based on post_save signal.
course_grade_changed_progress_publisher: it will publish the user progress based on COURSE_GRADE_CHANGED signal.
create_course_notifications: this will create upcoming notifications based on the sub-section due dates.
certificate_publisher: Publish the user certificate data to the NELC certificates service.
"""
import logging

from django.conf import settings

from eox_nelp.notifications.tasks import create_course_notifications as create_course_notifications_task
from eox_nelp.signals.tasks import dispatch_futurex_progress

LOGGER = logging.getLogger(__name__)


def block_completion_progress_publisher(instance, **kwargs): # pylint: disable=unused-argument
"""This receiver is connected to the post_save BlockCompletion signal
Expand Down Expand Up @@ -53,3 +61,45 @@ def create_course_notifications(course_key, **kwargs): # pylint: disable=unused
course_key<CourseLocator>: Opaque keys locator used to identify a course.
"""
create_course_notifications_task.delay(course_id=str(course_key))


def certificate_publisher(certificate, **kwargs): # pylint: disable=unused-argument
"""
Receiver that is connected to the CERTIFICATE_CREATED signal from 'openedx_events.learning.signals'.
Basically this verifies that the publish action is active and validates the certificate mode in order
to publish just certificates with valid modes. That behavior is controlled by the following settings:
- ENABLE_CERTIFICATE_PUBLISHER<boolean>: If this is true the receiver will publish the certificate data,
default is False.
- CERTIFICATE_PUBLISHER_VALID_MODES<list[string]>: List of valid modes, default ['no-id-professional']
Args:
certificate<CertificateData>: This an instance of the class defined in this link
https://github.com/eduNEXT/openedx-events/blob/main/openedx_events/learning/data.py#L100
and will provide of the user certificate data.
"""
if not getattr(settings, "ENABLE_CERTIFICATE_PUBLISHER", False):
return

default_modes = [
"no-id-professional",
]
valid_modes = getattr(settings, "CERTIFICATE_PUBLISHER_VALID_MODES", default_modes)

if certificate.mode in valid_modes:
LOGGER.info(
"The %s certificate associated with the user <%s> and course <%s> has been already generated "
"and its data will be sent to the NELC certificate service.",
certificate.mode,
certificate.user.pii.username,
certificate.course.course_key,
)
else:
LOGGER.info(
"The %s certificate associated with the user <%s> and course <%s>"
"doesn't have a valid mode and therefore its data won't be published.",
certificate.mode,
certificate.user.pii.username,
certificate.course.course_key,
)
15 changes: 8 additions & 7 deletions requirements/base.in
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
# Main requirements of your plugin application.
-c constraints.txt

bs4
Django
django-filter
djangorestframework
djangorestframework-jsonapi==5.0.0
edx-drf-extensions
edx-i18n-tools
edx-opaque-keys
eox-core
eox-tenant
eox-theming
edx-i18n-tools
django-filter
djangorestframework
bs4
mako
edx-opaque-keys
openedx-events # Open edX Events from Hooks Extension Framework (OEP-50)
requests-oauthlib
social-auth-app-django
djangorestframework-jsonapi==5.0.0
edx-drf-extensions
103 changes: 46 additions & 57 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,29 @@ amqp==5.1.1
# via kombu
appdirs==1.4.4
# via fs
asgiref==3.6.0
asgiref==3.7.2
# via django
attrs==23.1.0
# via openedx-events
beautifulsoup4==4.12.2
# via bs4
billiard==3.6.4.0
billiard==4.1.0
# via celery
bs4==0.0.1
# via -r requirements/base.in
celery==5.2.7
celery==5.3.1
# via
# eox-core
# event-tracking
certifi==2022.12.7
certifi==2023.7.22
# via requests
cffi==1.15.1
# via
# cryptography
# pynacl
charset-normalizer==3.1.0
charset-normalizer==3.2.0
# via requests
click==8.1.3
click==8.1.6
# via
# celery
# click-didyoumean
Expand All @@ -42,15 +42,9 @@ click-didyoumean==0.3.0
# via celery
click-plugins==1.1.1
# via celery
click-repl==0.2.0
click-repl==0.3.0
# via celery
coreapi==2.3.3
# via drf-yasg
coreschema==0.0.4
# via
# coreapi
# drf-yasg
cryptography==40.0.2
cryptography==41.0.2
# via
# jwcrypto
# pyjwt
Expand All @@ -59,16 +53,17 @@ defusedxml==0.7.1
# via
# python3-openid
# social-auth-core
deprecated==1.2.13
deprecated==1.2.14
# via jwcrypto
django==3.2.19
django==3.2.20
# via
# -c requirements/constraints.txt
# -r requirements/base.in
# django-crum
# django-filter
# django-model-utils
# django-oauth-toolkit
# django-waffle
# djangorestframework
# djangorestframework-jsonapi
# drf-jwt
Expand Down Expand Up @@ -100,19 +95,19 @@ django-model-utils==4.3.1
# via
# edx-proctoring
# edx-when
django-oauth-toolkit==2.2.0
django-oauth-toolkit==2.3.0
# via eox-core
django-oauth2-provider==0.2.6.1
# via eox-core
django-simple-history==3.3.0
# via edx-proctoring
django-waffle==3.0.0
django-waffle==4.0.0
# via
# edx-django-utils
# edx-drf-extensions
# edx-proctoring
# eox-core
django-webpack-loader==1.8.1
django-webpack-loader==2.0.1
# via edx-proctoring
djangorestframework==3.12.4
# via
Expand All @@ -131,11 +126,11 @@ djangorestframework-jsonapi==5.0.0
# -r requirements/base.in
drf-jwt==1.19.2
# via edx-drf-extensions
drf-yasg==1.21.5
drf-yasg==1.21.7
# via edx-api-doc-tools
edx-api-doc-tools==1.6.0
edx-api-doc-tools==1.7.0
# via eox-core
edx-django-utils==5.4.0
edx-django-utils==5.6.0
# via
# edx-drf-extensions
# edx-rest-api-client
Expand All @@ -147,7 +142,7 @@ edx-drf-extensions==8.0.0
# -r requirements/base.in
# edx-proctoring
# edx-when
edx-i18n-tools==0.9.2
edx-i18n-tools==1.0.0
# via -r requirements/base.in
edx-opaque-keys[django]==2.3.0
# via
Expand All @@ -157,23 +152,23 @@ edx-opaque-keys[django]==2.3.0
# edx-when
# eox-core
# openedx-events
edx-proctoring==4.15.1
edx-proctoring==4.16.0
# via eox-core
edx-rest-api-client==5.5.0
edx-rest-api-client==5.6.0
# via edx-proctoring
edx-when==2.3.0
edx-when==2.4.0
# via edx-proctoring
eox-core==8.1.0
# via -r requirements/base.in
eox-tenant==9.0.0
eox-tenant==9.2.1
# via
# -r requirements/base.in
# eox-theming
eox-theming==5.0.0
# via -r requirements/base.in
event-tracking==2.1.0
# via edx-proctoring
fastavro==1.7.3
fastavro==1.8.2
# via openedx-events
fs==2.4.16
# via xblock
Expand All @@ -185,55 +180,52 @@ inflection==0.5.1
# via
# djangorestframework-jsonapi
# drf-yasg
itypes==1.2.0
# via coreapi
jinja2==3.1.2
# via coreschema
jsonfield==3.1.0
# via edx-proctoring
jwcrypto==1.4.2
jwcrypto==1.5.0
# via django-oauth-toolkit
kombu==5.2.4
kombu==5.3.1
# via celery
lxml==4.9.2
lxml==4.9.3
# via xblock
mako==1.2.4
# via -r requirements/base.in
markupsafe==2.1.2
markupsafe==2.1.3
# via
# jinja2
# mako
# xblock
newrelic==8.8.0
newrelic==8.9.0
# via edx-django-utils
oauthlib==3.2.2
# via
# django-oauth-toolkit
# requests-oauthlib
# social-auth-core
openedx-events==0.13.0
# via eox-core
# via
# -r requirements/base.in
# eox-core
packaging==23.1
# via drf-yasg
path==16.6.0
path==16.7.1
# via edx-i18n-tools
pbr==5.11.1
# via stevedore
polib==1.2.0
# via edx-i18n-tools
prompt-toolkit==3.0.38
prompt-toolkit==3.0.39
# via click-repl
psutil==5.9.5
# via edx-django-utils
pycparser==2.21
# via cffi
pycryptodomex==3.17
pycryptodomex==3.18.0
# via
# edx-proctoring
# pyjwkest
pyjwkest==1.4.2
# via edx-drf-extensions
pyjwt[crypto]==2.6.0
pyjwt[crypto]==2.8.0
# via
# drf-jwt
# edx-drf-extensions
Expand All @@ -248,26 +240,26 @@ pynacl==1.5.0
# via edx-django-utils
python-dateutil==2.8.2
# via
# celery
# edx-drf-extensions
# edx-proctoring
# xblock
python3-openid==3.2.0
# via social-auth-core
pytz==2023.3
# via
# celery
# django
# drf-yasg
# edx-proctoring
# event-tracking
# xblock
pyyaml==6.0
pyyaml==6.0.1
# via
# drf-yasg
# edx-i18n-tools
# xblock
requests==2.29.0
requests==2.31.0
# via
# coreapi
# django-oauth-toolkit
# edx-drf-extensions
# edx-rest-api-client
Expand All @@ -279,10 +271,6 @@ requests-oauthlib==1.3.1
# via
# -r requirements/base.in
# social-auth-core
ruamel-yaml==0.17.22
# via drf-yasg
ruamel-yaml-clib==0.2.7
# via ruamel-yaml
rules==3.3
# via edx-proctoring
semantic-version==2.10.0
Expand All @@ -291,7 +279,6 @@ shortuuid==1.0.11
# via django-oauth2-provider
six==1.16.0
# via
# click-repl
# edx-drf-extensions
# eox-core
# eox-theming
Expand All @@ -309,15 +296,17 @@ soupsieve==2.4.1
# via beautifulsoup4
sqlparse==0.4.4
# via django
stevedore==5.0.0
stevedore==5.1.0
# via
# edx-django-utils
# edx-opaque-keys
typing-extensions==4.7.1
# via asgiref
tzdata==2023.3
# via celery
uritemplate==4.1.1
# via
# coreapi
# drf-yasg
urllib3==1.26.15
# via drf-yasg
urllib3==2.0.4
# via requests
vine==5.0.0
# via
Expand Down
2 changes: 1 addition & 1 deletion requirements/django.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
django==3.2.19
django==3.2.20
Loading

0 comments on commit 78a3316

Please sign in to comment.