From 7df91841ee54b874cee161c16a244242b7c26f26 Mon Sep 17 00:00:00 2001 From: Gregory Martin Date: Mon, 17 Jul 2017 15:44:29 -0400 Subject: [PATCH] cleanup --- cms/envs/common.py | 3 ++ lms/djangoapps/certificates/signals.py | 23 ---------- .../certificates/tests/test_signals.py | 2 +- lms/envs/common.py | 2 +- openedx/core/djangoapps/signals/handlers.py | 34 +++++++++++++++ openedx/core/djangoapps/signals/signals.py | 2 +- .../djangoapps/signals/tests/test_handlers.py | 43 +++++++++++++++++++ 7 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 openedx/core/djangoapps/signals/handlers.py create mode 100644 openedx/core/djangoapps/signals/tests/test_handlers.py diff --git a/cms/envs/common.py b/cms/envs/common.py index e423841eaa..3c730a2055 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -960,6 +960,9 @@ INSTALLED_APPS = ( # Country embargo support 'openedx.core.djangoapps.embargo', + # Signals + 'openedx.core.djangoapps.signals.apps.SignalConfig', + # Monitoring signals 'openedx.core.djangoapps.monitoring', diff --git a/lms/djangoapps/certificates/signals.py b/lms/djangoapps/certificates/signals.py index fb59a525f2..b41f156c3e 100644 --- a/lms/djangoapps/certificates/signals.py +++ b/lms/djangoapps/certificates/signals.py @@ -3,10 +3,8 @@ Signal handler for enabling/disabling self-generated certificates based on the c """ import logging -from celery.task import task from django.db.models.signals import post_save from django.dispatch import receiver -from opaque_keys.edx.keys import CourseKey from .config import waffle from certificates.models import \ @@ -16,7 +14,6 @@ from certificates.models import \ from certificates.tasks import generate_certificate from courseware import courses from lms.djangoapps.grades.new.course_grade_factory import CourseGradeFactory -from openedx.core.djangoapps.models.course_details import COURSE_PACING_CHANGE from openedx.core.djangoapps.signals.signals import COURSE_GRADE_NOW_PASSED, LEARNER_NOW_VERIFIED from student.models import CourseEnrollment @@ -54,26 +51,6 @@ def _listen_for_certificate_whitelist_append(sender, instance, **kwargs): # pyl )) -@receiver(COURSE_PACING_CHANGE, dispatch_uid="course_pacing_changed") -def _listen_for_course_pacing_changed(sender, course_key, course_self_paced, **kwargs): # pylint: disable=unused-argument - """ - Catches the signal that course pacing has changed and enable/disable - the self-generated certificates according to course-pacing. - """ - toggle_self_generated_certs.delay(unicode(course_key), course_self_paced) - log.info(u'Certificate Generation Setting Toggled for {course} via pacing change'.format( - course=course_key - )) - -@task() -def toggle_self_generated_certs(course_key, course_self_paced): - """ - Enable or disable self-generated certificates for a course according to pacing. - """ - course_key = CourseKey.from_string(course_key) - CertificateGenerationCourseSetting.set_enabled_for_course(course_key, course_self_paced) - - @receiver(COURSE_GRADE_NOW_PASSED, dispatch_uid="new_passing_learner") def _listen_for_passing_grade(sender, user, course_id, **kwargs): # pylint: disable=unused-argument """ diff --git a/lms/djangoapps/certificates/tests/test_signals.py b/lms/djangoapps/certificates/tests/test_signals.py index c475140344..31dd1ec0a0 100644 --- a/lms/djangoapps/certificates/tests/test_signals.py +++ b/lms/djangoapps/certificates/tests/test_signals.py @@ -11,7 +11,7 @@ from certificates.models import \ CertificateWhitelist, \ GeneratedCertificate, \ CertificateStatuses -from certificates.signals import _listen_for_course_pacing_changed +from openedx.core.djangoapps.signals.handlers import _listen_for_course_pacing_changed from lms.djangoapps.grades.new.course_grade_factory import CourseGradeFactory from lms.djangoapps.grades.tests.utils import mock_passing_grade from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification diff --git a/lms/envs/common.py b/lms/envs/common.py index 16155230d9..721f7d59f7 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -2030,7 +2030,7 @@ INSTALLED_APPS = ( 'branding', 'lms.djangoapps.grades.apps.GradesConfig', - # Signal + # Signals 'openedx.core.djangoapps.signals.apps.SignalConfig', # Student support tools diff --git a/openedx/core/djangoapps/signals/handlers.py b/openedx/core/djangoapps/signals/handlers.py new file mode 100644 index 0000000000..29aa1afda9 --- /dev/null +++ b/openedx/core/djangoapps/signals/handlers.py @@ -0,0 +1,34 @@ +""" +This module contains all general use or cross-use handlers. +""" +import logging + +from celery.task import task +from django.dispatch import receiver + +from certificates.models import CertificateGenerationCourseSetting +from opaque_keys.edx.keys import CourseKey +from signals import COURSE_PACING_CHANGE + +log = logging.getLogger(__name__) + + +@receiver(COURSE_PACING_CHANGE, dispatch_uid="course_pacing_changed") +def _listen_for_course_pacing_changed(sender, course_key, course_self_paced, **kwargs): # pylint: disable=unused-argument + """ + Catches the signal that course pacing has changed and enable/disable + the self-generated certificates according to course-pacing. + """ + toggle_self_generated_certs.delay(unicode(course_key), course_self_paced) + log.info(u'Certificate Generation Setting Toggled for {course} via pacing change'.format( + course=course_key + )) + + +@task() +def toggle_self_generated_certs(course_key, course_self_paced): + """ + Enable or disable self-generated certificates for a course according to pacing. + """ + course_key = CourseKey.from_string(course_key) + CertificateGenerationCourseSetting.set_enabled_for_course(course_key, course_self_paced) diff --git a/openedx/core/djangoapps/signals/signals.py b/openedx/core/djangoapps/signals/signals.py index ced8edb088..1fe73fee4e 100644 --- a/openedx/core/djangoapps/signals/signals.py +++ b/openedx/core/djangoapps/signals/signals.py @@ -1,5 +1,5 @@ """ -This module contains all signals. +This module contains all general use signals. """ from django.dispatch import Signal diff --git a/openedx/core/djangoapps/signals/tests/test_handlers.py b/openedx/core/djangoapps/signals/tests/test_handlers.py new file mode 100644 index 0000000000..872c66cea9 --- /dev/null +++ b/openedx/core/djangoapps/signals/tests/test_handlers.py @@ -0,0 +1,43 @@ +""" +Unit tests for enabling self-generated certificates for self-paced courses +and disabling for instructor-paced courses. +""" + +from certificates import api as certs_api +from certificates.models import CertificateGenerationConfiguration +from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory +from openedx.core.djangoapps.signals.handlers import _listen_for_course_pacing_changed + + +class SelfGeneratedCertsSignalTest(ModuleStoreTestCase): + """ + Tests for enabling/disabling self-generated certificates according to course-pacing. + """ + + def setUp(self): + super(SelfGeneratedCertsSignalTest, self).setUp() + SelfPacedConfiguration(enabled=True).save() + self.course = CourseFactory.create(self_paced=True) + # Enable the feature + CertificateGenerationConfiguration.objects.create(enabled=True) + + def test_cert_generation_flag_on_pacing_toggle(self): + """ + Verify that signal enables or disables self-generated certificates + according to course-pacing. + """ + #self-generation of cert disables by default + self.assertFalse(certs_api.cert_generation_enabled(self.course.id)) + + _listen_for_course_pacing_changed('store', self.course.id, self.course.self_paced) + #verify that self-generation of cert is enabled for self-paced course + self.assertTrue(certs_api.cert_generation_enabled(self.course.id)) + + self.course.self_paced = False + self.store.update_item(self.course, self.user.id) + + _listen_for_course_pacing_changed('store', self.course.id, self.course.self_paced) + # verify that self-generation of cert is disabled for instructor-paced course + self.assertFalse(certs_api.cert_generation_enabled(self.course.id))