From 346fe90002e22ab5dabb38f4195d5e5262fcefbb Mon Sep 17 00:00:00 2001 From: Justin Hynes Date: Thu, 1 Apr 2021 08:53:14 -0400 Subject: [PATCH] chore: remove `cert_allowlist_generation` management command [MICROBA-1100] * Remove `cert_allowlist_generation` management command. This has been replaced by the `cert_generation` management command which can handle generation of allowlist and v2 certificates. * Remove AllowListGenerationConfiguration configuration model. --- lms/djangoapps/certificates/admin.py | 7 +- .../commands/cert_allowlist_generation.py | 95 ------------------- .../tests/test_cert_allowlist_generation.py | 84 ---------------- ...delete_allowlistgenerationconfiguration.py | 16 ++++ lms/djangoapps/certificates/models.py | 24 ----- 5 files changed, 17 insertions(+), 209 deletions(-) delete mode 100644 lms/djangoapps/certificates/management/commands/cert_allowlist_generation.py delete mode 100644 lms/djangoapps/certificates/management/commands/tests/test_cert_allowlist_generation.py create mode 100644 lms/djangoapps/certificates/migrations/0024_delete_allowlistgenerationconfiguration.py diff --git a/lms/djangoapps/certificates/admin.py b/lms/djangoapps/certificates/admin.py index cae857bce7..cb6c577b86 100644 --- a/lms/djangoapps/certificates/admin.py +++ b/lms/djangoapps/certificates/admin.py @@ -13,7 +13,6 @@ from django.utils.safestring import mark_safe from organizations.api import get_organizations from lms.djangoapps.certificates.models import ( - AllowListGenerationConfiguration, CertificateGenerationConfiguration, CertificateGenerationCommandConfiguration, CertificateGenerationCourseSetting, @@ -92,15 +91,11 @@ class CertificateGenerationCourseSettingAdmin(admin.ModelAdmin): show_full_result_count = False -@admin.register(AllowListGenerationConfiguration) -class AllowListGenerationConfigurationAdmin(ConfigurationModelAdmin): - pass - - @admin.register(CertificateGenerationCommandConfiguration) class CertificateGenerationCommandConfigurationAdmin(ConfigurationModelAdmin): pass + admin.site.register(CertificateGenerationConfiguration) admin.site.register(CertificateGenerationCourseSetting, CertificateGenerationCourseSettingAdmin) admin.site.register(CertificateHtmlViewConfiguration, ConfigurationModelAdmin) diff --git a/lms/djangoapps/certificates/management/commands/cert_allowlist_generation.py b/lms/djangoapps/certificates/management/commands/cert_allowlist_generation.py deleted file mode 100644 index 3de9e2ad1c..0000000000 --- a/lms/djangoapps/certificates/management/commands/cert_allowlist_generation.py +++ /dev/null @@ -1,95 +0,0 @@ -""" -Management command to generate allowlist certificates for one or more users in a given course run. -""" - -import logging -import shlex - -from django.contrib.auth import get_user_model -from django.core.management.base import BaseCommand, CommandError -from opaque_keys import InvalidKeyError -from opaque_keys.edx.keys import CourseKey - -from lms.djangoapps.certificates.generation_handler import generate_allowlist_certificate_task -from lms.djangoapps.certificates.models import AllowListGenerationConfiguration - -User = get_user_model() -log = logging.getLogger(__name__) - - -class Command(BaseCommand): - """ - Management command to generate allowlist certificates for one or more users in a given course run. - - Example usage: - ./manage.py lms cert_allowlist_generation -u 123 456 -c course-v1:edX+DemoX+Demo_Course - """ - - help = """ - Generate allowlist certificates for one or more users in a given course run. - """ - - def add_arguments(self, parser): - parser.add_argument( - '-u', '--user', - nargs="+", - metavar='USER', - dest='user', - help='user_id or space-separated list of user_ids for whom to generate allowlist certificates' - ) - parser.add_argument( - '-c', '--course-key', - metavar='COURSE_KEY', - dest='course_key', - help="course run key" - ) - parser.add_argument( - '--args-from-database', - action='store_true', - help='Use arguments from the AllowListGenerationConfiguration model instead of the command line.', - ) - - def get_args_from_database(self): - """ Returns an options dictionary from the current AllowListGenerationConfiguration model. """ - config = AllowListGenerationConfiguration.current() - if not config.enabled: - raise CommandError("AllowListGenerationConfiguration is disabled, but --args-from-database was requested.") - - argv = shlex.split(config.arguments) - parser = self.create_parser("manage.py", "cert_allowlist_generation") - return vars(parser.parse_args(argv)) # we want a dictionary, not a non-iterable Namespace object - - def handle(self, *args, **options): - # database args will override cmd line args - if options['args_from_database']: - options = self.get_args_from_database() - - # Since we're optionally using database args we can't simply make users required in the arguments - if not options["user"]: - raise CommandError("You must specify a list of users") - - course_key = options['course_key'] - if not course_key: - raise CommandError("You must specify a course-key") - - # Parse the serialized course key into a CourseKey - try: - course_key = CourseKey.from_string(course_key) - except InvalidKeyError as e: - raise CommandError("You must specify a valid course-key") from e - - # Loop over each user, and ask that a cert be generated for them - users_str = options['user'] - for user_id in users_str: - user = None - try: - user = User.objects.get(id=user_id) - except User.DoesNotExist: - log.warning('User {user} could not be found'.format(user=user_id)) - if user is not None: - log.info( - 'Calling generate_allowlist_certificate_task for {user} : {course}'.format( - user=user.id, - course=course_key - )) - generate_allowlist_certificate_task(user, course_key) diff --git a/lms/djangoapps/certificates/management/commands/tests/test_cert_allowlist_generation.py b/lms/djangoapps/certificates/management/commands/tests/test_cert_allowlist_generation.py deleted file mode 100644 index a273bf4a33..0000000000 --- a/lms/djangoapps/certificates/management/commands/tests/test_cert_allowlist_generation.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Tests for the cert_allowlist_generation command -""" - -from unittest import mock - -import pytest -from django.core.management import CommandError, call_command -from edx_toggles.toggles.testutils import override_waffle_flag -from waffle.testutils import override_switch - -from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory -from lms.djangoapps.certificates.generation_handler import CERTIFICATES_USE_ALLOWLIST -from lms.djangoapps.certificates.tests.factories import CertificateWhitelistFactory -from lms.djangoapps.certificates.tests.test_generation_handler import AUTO_GENERATION_SWITCH_NAME, ID_VERIFIED_METHOD -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase -from xmodule.modulestore.tests.factories import CourseFactory - - -@override_switch(AUTO_GENERATION_SWITCH_NAME, active=True) -@override_waffle_flag(CERTIFICATES_USE_ALLOWLIST, active=True) -@mock.patch(ID_VERIFIED_METHOD, mock.Mock(return_value=True)) -class CertAllowlistGenerationTests(ModuleStoreTestCase): - """ - Tests for the cert_allowlist_generation management command - """ - - def setUp(self): - super().setUp() - - # Create users, a course run, and enrollments - self.user = UserFactory() - self.course_run = CourseFactory() - self.course_run_key = self.course_run.id # pylint: disable=no-member - self.enrollment = CourseEnrollmentFactory( - user=self.user, - course_id=self.course_run_key, - is_active=True, - mode="verified", - ) - - self.user2 = UserFactory() - self.enrollment2 = CourseEnrollmentFactory( - user=self.user2, - course_id=self.course_run_key, - is_active=True, - mode="verified", - ) - - # Whitelist users - CertificateWhitelistFactory.create(course_id=self.course_run_key, user=self.user) - CertificateWhitelistFactory.create(course_id=self.course_run_key, user=self.user2) - - def test_command_with_missing_param(self): - """ - Verify command with a missing param - """ - with pytest.raises(CommandError, match="You must specify a course-key"): - call_command("cert_allowlist_generation", "--u", self.user.username) - - def test_command_with_invalid_key(self): - """ - Verify command with an invalid course run key - """ - with pytest.raises(CommandError, match="You must specify a valid course-key"): - call_command("cert_allowlist_generation", "--u", self.user.username, "--c", "blah") - - def test_successful_generation(self): - """ - Test generation for 1 user - """ - call_command("cert_allowlist_generation", "--u", self.user.id, "--c", self.course_run_key) - - def test_successful_generation_multiple_users(self): - """ - Test generation for multiple user - """ - call_command("cert_allowlist_generation", - "--u", - self.user.id, - self.user2.id, - "999999", # non-existent userid - "--c", - self.course_run_key) diff --git a/lms/djangoapps/certificates/migrations/0024_delete_allowlistgenerationconfiguration.py b/lms/djangoapps/certificates/migrations/0024_delete_allowlistgenerationconfiguration.py new file mode 100644 index 0000000000..d950496d38 --- /dev/null +++ b/lms/djangoapps/certificates/migrations/0024_delete_allowlistgenerationconfiguration.py @@ -0,0 +1,16 @@ +# Generated by Django 2.2.19 on 2021-04-01 12:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('certificates', '0023_certificategenerationcommandconfiguration'), + ] + + operations = [ + migrations.DeleteModel( + name='AllowListGenerationConfiguration', + ), + ] diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index 77518d99f3..7b610cc333 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -1223,30 +1223,6 @@ def create_course_group_badge(sender, user, course_key, status, **kwargs): # py course_group_check(user, course_key) -class AllowListGenerationConfiguration(ConfigurationModel): - """ - Manages configuration for a run of the cert_allowlist_generation management command. - - .. no_pii: - """ - - class Meta(object): - app_label = 'certificates' - verbose_name = 'cert_allowlist_generation argument' - - arguments = models.TextField( - blank=True, - help_text=( - "Arguments to be passted to cert_allowlist_generation management command. " + - "Specify like `-u edx verified -c course-v1:edX+DemoX+Demo_Course`" - ), - default='', - ) - - def __str__(self): - return str(self.arguments) - - class CertificateGenerationCommandConfiguration(ConfigurationModel): """ Manages configuration for a run of the cert_generation management command.