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