diff --git a/lms/djangoapps/certificates/signals.py b/lms/djangoapps/certificates/signals.py index ff4a038ee5f2..7b2b038a93f7 100644 --- a/lms/djangoapps/certificates/signals.py +++ b/lms/djangoapps/certificates/signals.py @@ -71,7 +71,7 @@ def toggle_self_generated_certs(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 +def _listen_for_passing_grade(sender, user, course_key, **kwargs): # pylint: disable=unused-argument """ Listen for a learner passing a course, send cert generation task, downstream signal from COURSE_GRADE_CHANGED @@ -93,12 +93,10 @@ def _listen_for_passing_grade(sender, user, course_id, **kwargs): # pylint: dis elif waffle.waffle().is_enabled(waffle.INSTRUCTOR_PACED_ONLY): if courses.get_course_by_id(course_key, depth=0).self_paced: return - if GeneratedCertificate.certificate_for_student(self.user, self.course_id) is None: - generate_certificate.apply_async( - student=user, - course_key=course_id, - ) + if GeneratedCertificate.certificate_for_student(user, course_key) is None: + kwargs = dict(student=user.id, course_key=unicode(course_key),) + generate_certificate.apply_async(kwargs=kwargs) log.info(u'Certificate generation task initiated for {user} : {course} via passing grade'.format( user=user.id, - course=course_id + course=course_key )) diff --git a/lms/djangoapps/certificates/tasks.py b/lms/djangoapps/certificates/tasks.py index 9ccd36bb3e92..19f795cd7bdd 100644 --- a/lms/djangoapps/certificates/tasks.py +++ b/lms/djangoapps/certificates/tasks.py @@ -4,6 +4,9 @@ from celery_utils.logged_task import LoggedTask from celery_utils.persist_on_failure import PersistOnFailureTask +from django.contrib.auth.models import User +from opaque_keys.edx.keys import CourseKey + from .api import generate_user_certificates logger = getLogger(__name__) @@ -21,6 +24,6 @@ def generate_certificate(**kwargs): """ Generates a certificate for a single user. """ - student = kwargs.pop('student') - course_key = kwargs.pop('course_key') + student = User.objects.get(id=kwargs.pop('student')) + course_key = CourseKey.from_string(kwargs.pop('course_key')) generate_user_certificates(student=student, course_key=course_key, **kwargs) diff --git a/lms/djangoapps/grades/new/course_grade_factory.py b/lms/djangoapps/grades/new/course_grade_factory.py index 236d99af3504..252cb7965080 100644 --- a/lms/djangoapps/grades/new/course_grade_factory.py +++ b/lms/djangoapps/grades/new/course_grade_factory.py @@ -35,8 +35,10 @@ def create(self, user, course=None, collected_block_structure=None, course_struc course_data = CourseData(user, course, collected_block_structure, course_structure, course_key) try: course_grade, read_policy_hash = self._read(user, course_data) - if read_policy_hash == course_data.grading_policy_hash: - return course_grade + # BCW: this logic has to be removed in orde to allow cert generation on passing grade + # but probably adds to performance overhead + # if read_policy_hash == course_data.grading_policy_hash: + # return course_grade read_only = False # update the persisted grade since the policy changed; TODO(TNL-6786) remove soon except PersistentCourseGrade.DoesNotExist: if assume_zero_if_absent(course_data.course_key): @@ -218,7 +220,7 @@ def _update(user, course_data, read_only, force_update_subsections=False): COURSE_GRADE_NOW_PASSED.send_robust( sender=CourseGradeFactory, user=user, - course_key=course_data.course_key, + course_key=course_data.course_key ) log.info(