From 56d3fa011d1ea9b3da5cf75ebff44762313ed94d Mon Sep 17 00:00:00 2001 From: jsa Date: Sun, 24 Jan 2016 15:42:58 -0500 Subject: [PATCH] use COURSE_CERT_AWARDED signal for milestones + badges --- lms/djangoapps/certificates/models.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index f177d230ea..818a3b2094 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -421,16 +421,13 @@ class CertificateInvalidation(TimeStampedModel): return data -@receiver(post_save, sender=GeneratedCertificate) -def handle_post_cert_generated(sender, instance, **kwargs): # pylint: disable=unused-argument +@receiver(COURSE_CERT_AWARDED, sender=GeneratedCertificate) +def handle_course_cert_awarded(sender, user, course_key, **kwargs): # pylint: disable=unused-argument """ - Handles post_save signal of GeneratedCertificate, and mark user collected - course milestone entry if user has passed the course. - User is assumed to have passed the course if certificate status is either 'generating' or 'downloadable'. + Mark a milestone entry if user has passed the course. """ - allowed_cert_states = [CertificateStatuses.generating, CertificateStatuses.downloadable] - if is_prerequisite_courses_enabled() and instance.status in allowed_cert_states: - fulfill_course_milestone(instance.course_id, instance.user) + if is_prerequisite_courses_enabled(): + fulfill_course_milestone(course_key, user) def certificate_status_for_student(student, course_id): @@ -1085,25 +1082,25 @@ class CertificateTemplateAsset(TimeStampedModel): app_label = "certificates" -@receiver(post_save, sender=GeneratedCertificate) +@receiver(COURSE_CERT_AWARDED, sender=GeneratedCertificate) #pylint: disable=unused-argument -def create_badge(sender, instance, **kwargs): +def create_badge(sender, user, course_key, status, **kwargs): """ Standard signal hook to create badges when a certificate has been generated. """ if not settings.FEATURES.get('ENABLE_OPENBADGES', False): return - if not modulestore().get_course(instance.course_id).issue_badges: + if not modulestore().get_course(course_key).issue_badges: LOGGER.info("Course is not configured to issue badges.") return - if BadgeAssertion.objects.filter(user=instance.user, course_id=instance.course_id): + if BadgeAssertion.objects.filter(user=user, course_id=course_key): LOGGER.info("Badge already exists for this user on this course.") # Badge already exists. Skip. return # Don't bake a badge until the certificate is available. Prevents user-facing requests from being paused for this # by making sure it only gets run on the callback during normal workflow. - if not instance.status == CertificateStatuses.downloadable: + if not status == CertificateStatuses.downloadable: return from .badge_handler import BadgeHandler - handler = BadgeHandler(instance.course_id) - handler.award(instance.user) + handler = BadgeHandler(course_key) + handler.award(user)