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