From 84754b65d1cae901cf64c42776db425ff203eca1 Mon Sep 17 00:00:00 2001 From: alangsto <46360176+alangsto@users.noreply.github.com> Date: Wed, 5 Jan 2022 09:31:03 -0500 Subject: [PATCH] feat: update cert language if integrity signature is enabled (#29618) MST-1190. If the integrity signature flag has been enabled for a course, update the verified certificate description. The flag value should also be accessible to cert templates, so it has been added to the context. --- .../certificates/tests/test_webview_views.py | 63 +++++++++++++++++++ lms/djangoapps/certificates/views/webview.py | 19 ++++-- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/lms/djangoapps/certificates/tests/test_webview_views.py b/lms/djangoapps/certificates/tests/test_webview_views.py index 17361a005e..a1dff65b99 100644 --- a/lms/djangoapps/certificates/tests/test_webview_views.py +++ b/lms/djangoapps/certificates/tests/test_webview_views.py @@ -237,6 +237,39 @@ class CommonCertificatesTestCase(ModuleStoreTestCase): ) template.save() + def _create_custom_template_with_verified_description(self, org_id=None, course_key=None, language=None): + """ + Creates a custom certificate template entry in DB. This custom certificate can be used to test + that the correct language is used if the integrity signature feature has been enabled for a course. + """ + template_html = """ + <%namespace name='static' file='static_content.html'/> + + + lang: ${LANGUAGE_CODE} + course name: ${accomplishment_copy_course_name} + mode: verified + ${accomplishment_copy_course_description} + ${certificate_type_description} + % if is_integrity_signature_enabled_for_course: +

Integrity signature enabled

+ %endif + ${twitter_url} + + + + """ + template = CertificateTemplate( + name='custom template', + template=template_html, + organization_id=org_id, + course_key=course_key, + mode='verified', + is_active=True, + language=language + ) + template.save() + def _add_certificate_date_override(self): """ Creates a mock CertificateDateOverride and adds it to the certificate @@ -1609,6 +1642,36 @@ class CertificatesViewsTests(CommonCertificatesTestCase, CacheIsolationTestCase) self.assertContains(response, self.user.profile.name) self.assertNotContains(response, verified_name) + @override_settings(FEATURES=FEATURES_WITH_CUSTOM_CERTS_ENABLED) + @patch('lms.djangoapps.certificates.views.webview.is_integrity_signature_enabled') + @ddt.data( + True, + False + ) + def test_verified_certificate_description(self, integrity_signature_enabled, mock_integrity_signature): + """ + Test that for a verified cert, the correct language is used when the integrity signature feature is enabled. + """ + mock_integrity_signature.return_value = integrity_signature_enabled + self._add_course_certificates(count=1, signatory_count=2, is_active=True) + self._create_custom_template_with_verified_description() + self.cert.mode = 'verified' + self.cert.save() + test_url = get_certificate_url( + user_id=self.user.id, + course_id=str(self.course.id), + uuid=self.cert.verify_uuid + ) + + response = self.client.get(test_url) + assert response.status_code == 200 + if not integrity_signature_enabled: + self.assertContains(response, 'identity of the learner has been checked and is valid') + self.assertNotContains(response, 'Integrity signature enabled') + else: + self.assertNotContains(response, 'identity of the learner has been checked and is valid') + self.assertContains(response, 'Integrity signature enabled') + class CertificateEventTests(CommonCertificatesTestCase, EventTrackingTestCase): """ diff --git a/lms/djangoapps/certificates/views/webview.py b/lms/djangoapps/certificates/views/webview.py index a34a2c5040..287d87f7c8 100644 --- a/lms/djangoapps/certificates/views/webview.py +++ b/lms/djangoapps/certificates/views/webview.py @@ -49,6 +49,7 @@ from lms.djangoapps.certificates.utils import ( get_certificate_url, get_preferred_certificate_name ) +from openedx.core.djangoapps.agreements.toggles import is_integrity_signature_enabled from openedx.core.djangoapps.catalog.api import get_course_run_details from openedx.core.djangoapps.content.course_overviews.api import get_course_overview_or_none from openedx.core.djangoapps.lang_pref.api import get_closest_released_language @@ -64,7 +65,7 @@ _ = translation.gettext INVALID_CERTIFICATE_TEMPLATE_PATH = 'certificates/invalid.html' -def get_certificate_description(mode, certificate_type, platform_name): +def get_certificate_description(mode, certificate_type, platform_name, course_key): """ :return certificate_type_description on the basis of current mode """ @@ -82,10 +83,13 @@ def get_certificate_description(mode, certificate_type, platform_name): certificate_type_description = _("A {cert_type} certificate signifies that a " "learner has agreed to abide by the honor code established by " "{platform_name} and has completed all of the required tasks for this course " - "under its guidelines. A {cert_type} certificate also indicates that the " - "identity of the learner has been checked and " - "is valid.").format(cert_type=certificate_type, - platform_name=platform_name) + "under its guidelines. ").format(cert_type=certificate_type, + platform_name=platform_name) + if not is_integrity_signature_enabled(course_key): + certificate_type_description += _("A {cert_type} certificate also indicates that the " + "identity of the learner has been checked and " + "is valid.").format(cert_type=certificate_type) + elif mode == 'xseries': # Translators: This text describes the 'XSeries' course certificate type. An XSeries is a collection of # courses related to each other in a meaningful way, such as a specific topic or theme, or even an organization @@ -146,7 +150,9 @@ def _update_certificate_context(context, course, course_overview, user_certifica platform_name=platform_name, certificate_type=context.get("certificate_type")) - certificate_type_description = get_certificate_description(user_certificate.mode, certificate_type, platform_name) + certificate_type_description = get_certificate_description( + user_certificate.mode, certificate_type, platform_name, course.location.course_key + ) if certificate_type_description: context['certificate_type_description'] = certificate_type_description @@ -247,6 +253,7 @@ def _update_course_context(request, context, course, platform_name): context['accomplishment_copy_course_name'] = accomplishment_copy_course_name course_number = course.display_coursenumber if course.display_coursenumber else course.number context['course_number'] = course_number + context['is_integrity_signature_enabled_for_course'] = is_integrity_signature_enabled(course.location.course_key) if context['organization_long_name']: # Translators: This text represents the description of course context['accomplishment_copy_course_description'] = _('a course of study offered by {partner_short_name}, '