From 5fe4e5c50b29a895601b2491b806baf4fdd7afef Mon Sep 17 00:00:00 2001
From: Justin Hynes <JHynes@edx.org>
Date: Wed, 28 Apr 2021 09:24:37 -0400
Subject: [PATCH] fix: fix issue where we were not generating a certificate
 `verify_uuid` when needed

[MICROBA-1181]
- change how we determine if we need to generate a verify_uuid for a learner's certificate record
---
 lms/djangoapps/certificates/generation.py       |  6 +++++-
 .../certificates/tests/test_generation.py       | 17 ++++++++++++++++-
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/lms/djangoapps/certificates/generation.py b/lms/djangoapps/certificates/generation.py
index be898d5f7f8..7c193131783 100644
--- a/lms/djangoapps/certificates/generation.py
+++ b/lms/djangoapps/certificates/generation.py
@@ -66,9 +66,13 @@ def _generate_certificate(user, course_key):
     course = modulestore().get_course(course_key, depth=0)
     course_grade = CourseGradeFactory().read(user, course)
     enrollment_mode, __ = CourseEnrollment.enrollment_mode_for_user(user, course_key)
+
     # Retain the `verify_uuid` from an existing certificate if possible, this will make it possible for the learner to
     # keep the existing URL to their certificate
-    uuid = getattr(existing_certificate, 'verify_uuid', uuid4().hex)
+    if existing_certificate and existing_certificate.verify_uuid:
+        uuid = existing_certificate.verify_uuid
+    else:
+        uuid = uuid4().hex
 
     cert, created = GeneratedCertificate.objects.update_or_create(
         user=user,
diff --git a/lms/djangoapps/certificates/tests/test_generation.py b/lms/djangoapps/certificates/tests/test_generation.py
index 9aa000cac48..74f77373f44 100644
--- a/lms/djangoapps/certificates/tests/test_generation.py
+++ b/lms/djangoapps/certificates/tests/test_generation.py
@@ -83,7 +83,6 @@ class CertificateTests(EventTestMixin, ModuleStoreTestCase):
         """
         Test that the `verify_uuid` value of a certificate does not change when it is revoked and re-awarded.
         """
-        # Create user, a course run, and an enrollment
         generated_cert = generate_course_certificate(self.u, self.key, self.gen_mode)
         assert generated_cert.status, CertificateStatuses.downloadable
 
@@ -104,3 +103,19 @@ class CertificateTests(EventTestMixin, ModuleStoreTestCase):
         generated_cert = generate_course_certificate(self.u, self.key, self.gen_mode)
         assert generated_cert.status, CertificateStatuses.downloadable
         assert generated_cert.verify_uuid, verify_uuid
+
+    def test_generation_creates_verify_uuid_when_needed(self):
+        """
+        Test that ensures we will create a verify_uuid when needed.
+        """
+        GeneratedCertificateFactory(
+            user=self.u,
+            course_id=self.key,
+            mode='verified',
+            status=CertificateStatuses.unverified,
+            verify_uuid=''
+        )
+
+        generated_cert = generate_course_certificate(self.u, self.key, self.gen_mode)
+        assert generated_cert.status, CertificateStatuses.downloadable
+        assert generated_cert.verify_uuid != ''
-- 
GitLab