From b73979dc72f236627fbc5d71fc0fd59d64ce2ff8 Mon Sep 17 00:00:00 2001 From: Zia Fazal Date: Wed, 18 Sep 2019 12:15:19 +0500 Subject: [PATCH 1/2] Added signal handler for COURSE_GRADE_NOW_PASSED Added signal handler for COURSE_GRADE_NOW_PASSED to trigger single learner data transmission task in edx-enterprise. Bumped edx-enterprise version to 1.10.7 Revert edx-enterprise version bump --- .../features/enterprise_support/signals.py | 14 +++++++++++ .../enterprise_support/tests/test_signals.py | 23 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/openedx/features/enterprise_support/signals.py b/openedx/features/enterprise_support/signals.py index f3af522dc8..63acc22948 100644 --- a/openedx/features/enterprise_support/signals.py +++ b/openedx/features/enterprise_support/signals.py @@ -13,6 +13,8 @@ from django.dispatch import receiver from email_marketing.tasks import update_user from enterprise.models import EnterpriseCourseEnrollment, EnterpriseCustomer, EnterpriseCustomerUser +from integrated_channels.integrated_channel.tasks import transmit_single_learner_data +from openedx.core.djangoapps.signals.signals import COURSE_GRADE_NOW_PASSED from openedx.features.enterprise_support.tasks import clear_enterprise_customer_data_consent_share_cache from openedx.features.enterprise_support.utils import clear_data_consent_share_cache @@ -64,3 +66,15 @@ def update_dsc_cache_on_enterprise_customer_update(sender, instance, **kwargs): task_id=result.task_id, kwargs=kwargs, )) + + +@receiver(COURSE_GRADE_NOW_PASSED, dispatch_uid="new_passing_enterprise_learner") +def handle_enterprise_learner_passing_grade(sender, user, course_id, **kwargs): # pylint: disable=unused-argument + """ + Listen for a learner passing a course, transmit data to relevant integrated channel + """ + kwargs = { + 'username': six.text_type(user.username), + 'course_run_id': six.text_type(course_id) + } + transmit_single_learner_data.apply_async(kwargs=kwargs) diff --git a/openedx/features/enterprise_support/tests/test_signals.py b/openedx/features/enterprise_support/tests/test_signals.py index e5fc14dd45..0e40e3b258 100644 --- a/openedx/features/enterprise_support/tests/test_signals.py +++ b/openedx/features/enterprise_support/tests/test_signals.py @@ -6,8 +6,12 @@ import logging import ddt from django.test import TestCase from mock import patch -from student.tests.factories import UserFactory + from edx_django_utils.cache import TieredCache +from opaque_keys.edx.keys import CourseKey + +from student.tests.factories import UserFactory +from openedx.core.djangoapps.signals.signals import COURSE_GRADE_NOW_PASSED from openedx.features.enterprise_support.tests.factories import ( EnterpriseCourseEnrollmentFactory, EnterpriseCustomerFactory, @@ -104,3 +108,20 @@ class EnterpriseSupportSignals(TestCase): enterprise_customer.save() self.assertFalse(self._is_dsc_cache_found(self.user.id, self.course_id)) + + def test_handle_enterprise_learner_passing_grade(self): + """ + Test to assert transmit_single_learner_data is called when COURSE_GRADE_NOW_PASSED signal is fired + """ + with patch( + 'integrated_channels.integrated_channel.tasks.transmit_single_learner_data.apply_async', + return_value=None + ) as mock_task_apply: + course_key = CourseKey.from_string(self.course_id) + COURSE_GRADE_NOW_PASSED.disconnect(dispatch_uid='new_passing_learner') + COURSE_GRADE_NOW_PASSED.send(sender=None, user=self.user, course_id=course_key) + task_kwargs = { + 'username': self.user.username, + 'course_run_id': self.course_id + } + mock_task_apply.assert_called_once_with(kwargs=task_kwargs) From 19436f8d3d4d43b0414d40af4b64c16a4417a835 Mon Sep 17 00:00:00 2001 From: Zia Fazal Date: Wed, 25 Sep 2019 14:42:09 +0500 Subject: [PATCH 2/2] Bumped edx-enterprise version to 1.10.7 Fixed broken unit test connected COURSE_GRADE_NOW_PASSED at the end added receiver to signal connect call --- lms/djangoapps/certificates/signals.py | 2 +- lms/djangoapps/grades/tests/test_course_grade_factory.py | 6 +++--- openedx/features/enterprise_support/tests/test_signals.py | 2 ++ requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/testing.txt | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lms/djangoapps/certificates/signals.py b/lms/djangoapps/certificates/signals.py index ad6f8a6f38..ef7eb03d7c 100644 --- a/lms/djangoapps/certificates/signals.py +++ b/lms/djangoapps/certificates/signals.py @@ -62,7 +62,7 @@ def _listen_for_certificate_whitelist_append(sender, instance, **kwargs): # pyl @receiver(COURSE_GRADE_NOW_PASSED, dispatch_uid="new_passing_learner") -def _listen_for_passing_grade(sender, user, course_id, **kwargs): # pylint: disable=unused-argument +def listen_for_passing_grade(sender, user, course_id, **kwargs): # pylint: disable=unused-argument """ Listen for a learner passing a course, send cert generation task, downstream signal from COURSE_GRADE_CHANGED diff --git a/lms/djangoapps/grades/tests/test_course_grade_factory.py b/lms/djangoapps/grades/tests/test_course_grade_factory.py index 40b593c835..b64ddee3e3 100644 --- a/lms/djangoapps/grades/tests/test_course_grade_factory.py +++ b/lms/djangoapps/grades/tests/test_course_grade_factory.py @@ -100,21 +100,21 @@ class TestCourseGradeFactory(GradeTestBase): with self.assertNumQueries(4), mock_get_score(1, 2): _assert_read(expected_pass=False, expected_percent=0) # start off with grade of 0 - num_queries = 47 + num_queries = 51 with self.assertNumQueries(num_queries), mock_get_score(1, 2): grade_factory.update(self.request.user, self.course, force_update_subsections=True) with self.assertNumQueries(5): _assert_read(expected_pass=True, expected_percent=0.5) # updated to grade of .5 - num_queries = 9 + num_queries = 13 with self.assertNumQueries(num_queries), mock_get_score(1, 4): grade_factory.update(self.request.user, self.course, force_update_subsections=False) with self.assertNumQueries(5): _assert_read(expected_pass=True, expected_percent=0.5) # NOT updated to grade of .25 - num_queries = 26 + num_queries = 30 with self.assertNumQueries(num_queries), mock_get_score(2, 2): grade_factory.update(self.request.user, self.course, force_update_subsections=True) diff --git a/openedx/features/enterprise_support/tests/test_signals.py b/openedx/features/enterprise_support/tests/test_signals.py index 0e40e3b258..da493d3b3b 100644 --- a/openedx/features/enterprise_support/tests/test_signals.py +++ b/openedx/features/enterprise_support/tests/test_signals.py @@ -10,6 +10,7 @@ from mock import patch from edx_django_utils.cache import TieredCache from opaque_keys.edx.keys import CourseKey +from lms.djangoapps.certificates.signals import listen_for_passing_grade from student.tests.factories import UserFactory from openedx.core.djangoapps.signals.signals import COURSE_GRADE_NOW_PASSED from openedx.features.enterprise_support.tests.factories import ( @@ -125,3 +126,4 @@ class EnterpriseSupportSignals(TestCase): 'course_run_id': self.course_id } mock_task_apply.assert_called_once_with(kwargs=task_kwargs) + COURSE_GRADE_NOW_PASSED.connect(listen_for_passing_grade, dispatch_uid='new_passing_learner') diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index d16d47358b..67efbae7d9 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -106,7 +106,7 @@ edx-django-release-util==0.3.1 edx-django-sites-extensions==2.3.1 edx-django-utils==2.0.0 edx-drf-extensions==2.4.0 -edx-enterprise==1.10.4 +edx-enterprise==1.10.7 edx-i18n-tools==0.4.8 edx-milestones==0.2.3 edx-oauth2-provider==1.3.1 diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index d2f2c51273..c50b47ea1f 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -129,7 +129,7 @@ edx-django-release-util==0.3.1 edx-django-sites-extensions==2.3.1 edx-django-utils==2.0.0 edx-drf-extensions==2.4.0 -edx-enterprise==1.10.4 +edx-enterprise==1.10.7 edx-i18n-tools==0.4.8 edx-lint==1.3.0 edx-milestones==0.2.3 diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index e5be639df2..9f8d5863c0 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -125,7 +125,7 @@ edx-django-release-util==0.3.1 edx-django-sites-extensions==2.3.1 edx-django-utils==2.0.0 edx-drf-extensions==2.4.0 -edx-enterprise==1.10.4 +edx-enterprise==1.10.7 edx-i18n-tools==0.4.8 edx-lint==1.3.0 edx-milestones==0.2.3