diff --git a/lms/djangoapps/certificates/api.py b/lms/djangoapps/certificates/api.py index 774647f295..5ec18c5185 100644 --- a/lms/djangoapps/certificates/api.py +++ b/lms/djangoapps/certificates/api.py @@ -158,6 +158,11 @@ def generate_user_certificates(student, course_key, course=None, insecure=False, generate_pdf=generate_pdf, forced_grade=forced_grade ) + # If cert_status is not present in certificate valid_statuses (for example unverified) then + # add_cert returns None and raises AttributeError while accesing cert attributes. + if cert is None: + return + if CertificateStatuses.is_passing_status(cert.status): emit_certificate_event('created', student, course_key, course, { 'user_id': student.id, diff --git a/lms/djangoapps/certificates/tests/test_api.py b/lms/djangoapps/certificates/tests/test_api.py index dc65f50ffe..7b4580d5be 100644 --- a/lms/djangoapps/certificates/tests/test_api.py +++ b/lms/djangoapps/certificates/tests/test_api.py @@ -348,6 +348,23 @@ class GenerateUserCertificatesTest(EventTestMixin, WebCertificateTestMixin, Modu self.assertEqual(cert.status, 'error') self.assertIn(self.ERROR_REASON, cert.error_reason) + def test_generate_user_certificates_with_unverified_cert_status(self): + """ + Generate user certificate will not raise exception in case of certificate is None. + """ + # generate certificate with unverified status. + GeneratedCertificateFactory.create( + user=self.student, + course_id=self.course.id, + status=CertificateStatuses.unverified, + mode='verified' + ) + + with self._mock_passing_grade(): + with self._mock_queue(is_successful=False): + status = certs_api.generate_user_certificates(self.student, self.course.id) + self.assertEqual(status, None) + @patch.dict(settings.FEATURES, {'CERTIFICATES_HTML_VIEW': True}) def test_new_cert_requests_returns_generating_for_html_certificate(self): """