this appears to be a throttling method on first glance but is instead an async task handling hack, explain it and then provide a way to override it for tight control of timing while regenerating multiple certs
49 lines
2.2 KiB
Python
49 lines
2.2 KiB
Python
"""
|
|
Tasks that generate a course certificate for a user
|
|
"""
|
|
|
|
from logging import getLogger
|
|
|
|
from celery import shared_task
|
|
from celery_utils.persist_on_failure import LoggedPersistOnFailureTask
|
|
from django.contrib.auth import get_user_model
|
|
from edx_django_utils.monitoring import set_code_owner_attribute
|
|
from opaque_keys.edx.keys import CourseKey
|
|
|
|
from lms.djangoapps.certificates.data import CertificateStatuses
|
|
from lms.djangoapps.certificates.generation import generate_course_certificate
|
|
|
|
log = getLogger(__name__)
|
|
User = get_user_model()
|
|
|
|
# Certificate generation is delayed in case the caller is still completing their changes
|
|
# (for example a certificate regeneration reacting to a post save rather than post commit signal)
|
|
CERTIFICATE_DELAY_SECONDS = 2
|
|
|
|
|
|
@shared_task(base=LoggedPersistOnFailureTask, bind=True, default_retry_delay=30, max_retries=2)
|
|
@set_code_owner_attribute
|
|
def generate_certificate(self, **kwargs): # pylint: disable=unused-argument
|
|
"""
|
|
Generates a certificate for a single user.
|
|
|
|
kwargs:
|
|
- student: The student for whom to generate a certificate. Required.
|
|
- course_key: The course key for the course that the student is
|
|
receiving a certificate in. Required.
|
|
- status: Certificate status (value from the CertificateStatuses model). Defaults to 'downloadable'.
|
|
- enrollment_mode: User's enrollment mode (ex. verified). Required.
|
|
- course_grade: User's course grade. Defaults to ''.
|
|
- generation_mode: Used when emitting an event. Options are "self" (implying the user generated the cert
|
|
themself) and "batch" for everything else. Defaults to 'batch'.
|
|
"""
|
|
student = User.objects.get(id=kwargs.pop('student'))
|
|
course_key = CourseKey.from_string(kwargs.pop('course_key'))
|
|
status = kwargs.pop('status', CertificateStatuses.downloadable)
|
|
enrollment_mode = kwargs.pop('enrollment_mode')
|
|
course_grade = kwargs.pop('course_grade', '')
|
|
generation_mode = kwargs.pop('generation_mode', 'batch')
|
|
|
|
generate_course_certificate(user=student, course_key=course_key, status=status, enrollment_mode=enrollment_mode,
|
|
course_grade=course_grade, generation_mode=generation_mode)
|