Commit 56d3fa01 by jsa

use COURSE_CERT_AWARDED signal for milestones + badges

parent 9d141ae7
...@@ -421,16 +421,13 @@ class CertificateInvalidation(TimeStampedModel): ...@@ -421,16 +421,13 @@ class CertificateInvalidation(TimeStampedModel):
return data return data
@receiver(post_save, sender=GeneratedCertificate) @receiver(COURSE_CERT_AWARDED, sender=GeneratedCertificate)
def handle_post_cert_generated(sender, instance, **kwargs): # pylint: disable=unused-argument def handle_course_cert_awarded(sender, user, course_key, **kwargs): # pylint: disable=unused-argument
""" """
Handles post_save signal of GeneratedCertificate, and mark user collected Mark a milestone entry if user has passed the course.
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'.
""" """
allowed_cert_states = [CertificateStatuses.generating, CertificateStatuses.downloadable] if is_prerequisite_courses_enabled():
if is_prerequisite_courses_enabled() and instance.status in allowed_cert_states: fulfill_course_milestone(course_key, user)
fulfill_course_milestone(instance.course_id, instance.user)
def certificate_status_for_student(student, course_id): def certificate_status_for_student(student, course_id):
...@@ -1085,25 +1082,25 @@ class CertificateTemplateAsset(TimeStampedModel): ...@@ -1085,25 +1082,25 @@ class CertificateTemplateAsset(TimeStampedModel):
app_label = "certificates" app_label = "certificates"
@receiver(post_save, sender=GeneratedCertificate) @receiver(COURSE_CERT_AWARDED, sender=GeneratedCertificate)
#pylint: disable=unused-argument #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. Standard signal hook to create badges when a certificate has been generated.
""" """
if not settings.FEATURES.get('ENABLE_OPENBADGES', False): if not settings.FEATURES.get('ENABLE_OPENBADGES', False):
return 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.") LOGGER.info("Course is not configured to issue badges.")
return 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.") LOGGER.info("Badge already exists for this user on this course.")
# Badge already exists. Skip. # Badge already exists. Skip.
return return
# Don't bake a badge until the certificate is available. Prevents user-facing requests from being paused for this # 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. # 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 return
from .badge_handler import BadgeHandler from .badge_handler import BadgeHandler
handler = BadgeHandler(instance.course_id) handler = BadgeHandler(course_key)
handler.award(instance.user) handler.award(user)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment