From 0dd319a089b8ae9691c46b786b7bcf3e2ab9b032 Mon Sep 17 00:00:00 2001 From: Justin Hynes <JHynes@edx.org> Date: Thu, 15 Jul 2021 14:29:52 -0400 Subject: [PATCH] feat!: Remove `AUDIT_CERT_CUTOFF_DATE` configuration setting [MICROBA-1351][DEPR-159] * Remove `AUDIT_CERT_CUTOFF_DATE` --- lms/djangoapps/certificates/queue.py | 3 +- .../certificates/tests/test_queue.py | 74 ------------------- lms/envs/common.py | 4 - lms/envs/production.py | 5 -- 4 files changed, 1 insertion(+), 85 deletions(-) diff --git a/lms/djangoapps/certificates/queue.py b/lms/djangoapps/certificates/queue.py index 45e5090f3f2..ead3395fffd 100644 --- a/lms/djangoapps/certificates/queue.py +++ b/lms/djangoapps/certificates/queue.py @@ -351,8 +351,7 @@ class XQueueCertInterface: # 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. - cutoff = settings.AUDIT_CERT_CUTOFF_DATE - if (cutoff and cert.created_date >= cutoff) and not is_eligible_for_certificate: + if not is_eligible_for_certificate: cert.status = status.audit_passing if passing else status.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 6522bffa6d6..570e9868883 100644 --- a/lms/djangoapps/certificates/tests/test_queue.py +++ b/lms/djangoapps/certificates/tests/test_queue.py @@ -3,12 +3,9 @@ import json from contextlib import contextmanager -from datetime import datetime, timedelta from unittest.mock import Mock, patch import ddt -import freezegun -import pytz from django.conf import settings from django.test import TestCase from django.test.utils import override_settings @@ -85,7 +82,6 @@ class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase): assert certificate.verify_uuid is not None @ddt.data('honor', 'audit') - @override_settings(AUDIT_CERT_CUTOFF_DATE=datetime.now(pytz.UTC) - timedelta(days=1)) def test_add_cert_with_honor_certificates(self, mode): """Test certificates generations for honor and audit modes.""" template_name = 'certificate-template-{id.org}-{id.course}.pdf'.format( @@ -111,7 +107,6 @@ class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase): @ddt.data((True, CertificateStatuses.audit_passing), (False, CertificateStatuses.generating)) @ddt.unpack - @override_settings(AUDIT_CERT_CUTOFF_DATE=datetime.now(pytz.UTC) - timedelta(days=1)) def test_ineligible_cert_allowlisted(self, disable_audit_cert, status): """ Test that audit mode students receive a certificate if DISABLE_AUDIT_CERTIFICATES @@ -219,75 +214,6 @@ class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase): else: assert not mock_send.called - @ddt.data( - # Eligible and should stay that way - ( - CertificateStatuses.downloadable, - timedelta(days=-2), - 'Pass', - CertificateStatuses.generating - ), - # Ensure that certs in the wrong state can be fixed by regeneration - ( - CertificateStatuses.downloadable, - timedelta(hours=-1), - 'Pass', - CertificateStatuses.audit_passing - ), - # Ineligible and should stay that way - ( - CertificateStatuses.audit_passing, - timedelta(hours=-1), - 'Pass', - CertificateStatuses.audit_passing - ), - # As above - ( - CertificateStatuses.audit_notpassing, - timedelta(hours=-1), - 'Pass', - CertificateStatuses.audit_passing - ), - # As above - ( - CertificateStatuses.audit_notpassing, - timedelta(hours=-1), - None, - CertificateStatuses.audit_notpassing - ), - ) - @ddt.unpack - @override_settings(AUDIT_CERT_CUTOFF_DATE=datetime.now(pytz.UTC) - timedelta(days=1)) - def test_regen_audit_certs_eligibility(self, status, created_delta, grade, expected_status): - """ - Test that existing audit certificates remain eligible even if cert - generation is re-run. - """ - # Create an existing audit enrollment and certificate - CourseEnrollmentFactory( - user=self.user_2, - course_id=self.course.id, - is_active=True, - mode=CourseMode.AUDIT, - ) - created_date = datetime.now(pytz.UTC) + created_delta - with freezegun.freeze_time(created_date): - GeneratedCertificateFactory( - user=self.user_2, - course_id=self.course.id, - grade='1.0', - status=status, - mode=GeneratedCertificate.MODES.audit, - ) - - # Run grading/cert generation again - with mock_passing_grade(letter_grade=grade): - 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) - - assert GeneratedCertificate.objects.get(user=self.user_2, course_id=self.course.id).status == expected_status - def test_regen_cert_with_pdf_certificate(self): """ Test that regenerating a PDF certificate logs a warning message and the certificate diff --git a/lms/envs/common.py b/lms/envs/common.py index 36afb4963b5..2693d652ec8 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -4224,10 +4224,6 @@ APP_UPGRADE_CACHE_TIMEOUT = 3600 # if you want to avoid an overlap in ids while searching for history across the two tables. STUDENTMODULEHISTORYEXTENDED_OFFSET = 10000 -# Cutoff date for granting audit certificates - -AUDIT_CERT_CUTOFF_DATE = None - ################################ Settings for Credentials Service ################################ CREDENTIALS_SERVICE_USERNAME = 'credentials_service_user' diff --git a/lms/envs/production.py b/lms/envs/production.py index fe917dc20dc..6ca1774abeb 100644 --- a/lms/envs/production.py +++ b/lms/envs/production.py @@ -21,7 +21,6 @@ import copy import datetime import os -import dateutil import yaml from corsheaders.defaults import default_headers as corsheaders_default_headers from django.core.exceptions import ImproperlyConfigured @@ -782,10 +781,6 @@ STUDENTMODULEHISTORYEXTENDED_OFFSET = ENV_TOKENS.get( 'STUDENTMODULEHISTORYEXTENDED_OFFSET', STUDENTMODULEHISTORYEXTENDED_OFFSET ) -# Cutoff date for granting audit certificates -if ENV_TOKENS.get('AUDIT_CERT_CUTOFF_DATE', None): - AUDIT_CERT_CUTOFF_DATE = dateutil.parser.parse(ENV_TOKENS.get('AUDIT_CERT_CUTOFF_DATE')) - ################################ Settings for Credentials Service ################################ CREDENTIALS_GENERATION_ROUTING_KEY = ENV_TOKENS.get('CREDENTIALS_GENERATION_ROUTING_KEY', DEFAULT_PRIORITY_QUEUE) -- GitLab