diff --git a/lms/djangoapps/certificates/queue.py b/lms/djangoapps/certificates/queue.py index 1fda185830..db744e89d8 100644 --- a/lms/djangoapps/certificates/queue.py +++ b/lms/djangoapps/certificates/queue.py @@ -323,9 +323,11 @@ class XQueueCertInterface(object): # If this user's enrollment is not eligible to receive a # certificate, mark it as such for reporting and - # analytics. Only do this if the certificate is new -- we - # don't want to mark existing audit certs as ineligible. - if created and not is_eligible_for_certificate: + # analytics. Only do this if the certificate is new, or + # already marked as ineligible -- we don't want to mark + # existing audit certs as ineligible. + if (created or cert.status in (CertificateStatuses.audit_passing, CertificateStatuses.audit_notpassing)) \ + and not is_eligible_for_certificate: cert.status = CertificateStatuses.audit_passing if passing else CertificateStatuses.audit_notpassing cert.save() LOGGER.info( diff --git a/lms/djangoapps/certificates/tests/test_queue.py b/lms/djangoapps/certificates/tests/test_queue.py index 231dd673da..fa76262078 100644 --- a/lms/djangoapps/certificates/tests/test_queue.py +++ b/lms/djangoapps/certificates/tests/test_queue.py @@ -205,7 +205,14 @@ class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase): else: self.assertFalse(mock_send.called) - def test_regen_audit_certs_eligibility(self): + @ddt.data( + (CertificateStatuses.downloadable, 'Pass', CertificateStatuses.generating), + (CertificateStatuses.audit_passing, 'Pass', CertificateStatuses.audit_passing), + (CertificateStatuses.audit_notpassing, 'Pass', CertificateStatuses.audit_passing), + (CertificateStatuses.audit_notpassing, None, CertificateStatuses.audit_notpassing), + ) + @ddt.unpack + def test_regen_audit_certs_eligibility(self, status, grade, expected_status): """ Test that existing audit certificates remain eligible even if cert generation is re-run. @@ -221,19 +228,19 @@ class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase): user=self.user_2, course_id=self.course.id, grade='1.0', - status=CertificateStatuses.downloadable, + status=status, mode=GeneratedCertificate.MODES.audit, ) # Run grading/cert generation again - with patch('courseware.grades.grade', Mock(return_value={'grade': 'Pass', 'percent': 0.75})): + with patch('courseware.grades.grade', Mock(return_value={'grade': grade, 'percent': 0.75})): with patch.object(XQueueInterface, 'send_to_queue') as mock_send: mock_send.return_value = (0, None) self.xqueue.add_cert(self.user_2, self.course.id) self.assertEqual( GeneratedCertificate.objects.get(user=self.user_2, course_id=self.course.id).status, # pylint: disable=no-member - CertificateStatuses.generating + expected_status )