diff --git a/cms/djangoapps/contentstore/config/waffle.py b/cms/djangoapps/contentstore/config/waffle.py index bc7c8e28e2..b1bb124452 100644 --- a/cms/djangoapps/contentstore/config/waffle.py +++ b/cms/djangoapps/contentstore/config/waffle.py @@ -31,11 +31,6 @@ def waffle_flags(): """ return WaffleFlagNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'Studio: ') -# Flags -ENABLE_PROCTORING_PROVIDER_OVERRIDES = CourseWaffleFlag( - waffle_namespace=waffle_flags(), - flag_name=u'enable_proctoring_provider_overrides', -) # TODO: After removing this flag, add a migration to remove waffle flag in a follow-up deployment. ENABLE_CHECKLISTS_QUALITY = CourseWaffleFlag( diff --git a/cms/djangoapps/contentstore/rest_api/v1/tests/test_views.py b/cms/djangoapps/contentstore/rest_api/v1/tests/test_views.py index b9d89fb9c2..b2fd23e5cc 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/tests/test_views.py +++ b/cms/djangoapps/contentstore/rest_api/v1/tests/test_views.py @@ -9,9 +9,7 @@ from rest_framework import status from rest_framework.test import APITestCase from opaque_keys.edx.keys import CourseKey -from contentstore.config.waffle import ENABLE_PROCTORING_PROVIDER_OVERRIDES from lms.djangoapps.courseware.tests.factories import GlobalStaffFactory, InstructorFactory -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag from student.tests.factories import UserFactory from xmodule.modulestore.django import modulestore from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase @@ -153,7 +151,6 @@ class ProctoringExamSettingsPostTests(ProctoringExamSettingsTestMixin, ModuleSto 'proctortrack': {} }, ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_update_exam_settings_200_escalation_email(self): """ update exam settings for provider that requires an escalation email (proctortrack) """ self.client.login(username=self.global_staff.username, password=self.password) @@ -188,7 +185,6 @@ class ProctoringExamSettingsPostTests(ProctoringExamSettingsTestMixin, ModuleSto 'test_proctoring_provider': {} }, ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_update_exam_settings_200_no_escalation_email(self): """ escalation email may be blank if not required by the provider """ self.client.login(username=self.global_staff.username, password=self.password) @@ -249,7 +245,6 @@ class ProctoringExamSettingsPostTests(ProctoringExamSettingsTestMixin, ModuleSto 'test_proctoring_provider': {} }, ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_update_exam_settings_invalid_value(self): self.client.login(username=self.global_staff.username, password=self.password) data = self.get_request_data( diff --git a/cms/djangoapps/contentstore/tests/test_course_settings.py b/cms/djangoapps/contentstore/tests/test_course_settings.py index 56b73bfea3..23c1e45338 100644 --- a/cms/djangoapps/contentstore/tests/test_course_settings.py +++ b/cms/djangoapps/contentstore/tests/test_course_settings.py @@ -20,7 +20,6 @@ from milestones.tests.utils import MilestonesTestCaseMixin from mock import Mock, patch from pytz import UTC -from contentstore.config.waffle import ENABLE_PROCTORING_PROVIDER_OVERRIDES from contentstore.utils import reverse_course_url, reverse_usage_url from course_modes.models import CourseMode from models.settings.course_grading import GRADING_POLICY_CHANGED_EVENT_TYPE, CourseGradingModel, hash_grading_policy @@ -1290,14 +1289,6 @@ class CourseMetadataEditingTest(CourseTestCase): }) self.assertEqual(response.status_code, 200) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) - def test_proctoring_provider_present_when_waffle_flag_enabled(self): - """ - Tests that proctoring provider field is not filtered out when the waffle flag is enabled. - """ - test_model = CourseMetadata.fetch(self.fullcourse) - self.assertIn('proctoring_provider', test_model) - @ddt.data(True, False) @override_settings( PROCTORING_BACKENDS={ @@ -1306,10 +1297,9 @@ class CourseMetadataEditingTest(CourseTestCase): }, PARTNER_SUPPORT_EMAIL='support@foobar.com' ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_validate_update_does_not_allow_proctoring_provider_changes_after_course_start(self, staff_user): """ - Course staff cannot modify proctoring provder after the course start date. + Course staff cannot modify proctoring provider after the course start date. Only admin users may update the provider if the course has started. """ field_name = "proctoring_provider" @@ -1340,118 +1330,6 @@ class CourseMetadataEditingTest(CourseTestCase): ) self.assertIsNone(test_model) - @ddt.data(True, False) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, False) - def test_validate_update_allows_changes_to_settings_when_proctoring_provider_disabled(self, staff_user): - """ - Course staff can modify Advanced Settings when the proctoring_provider settings is not available (i.e. when - the ENABLE_PROCTORING_PROVIDER_OVERRIDES is not enabled for the course). This ensures that our restrictions - on changing the proctoring_provider do not inhibit users from changing Advanced Settings when the - proctoring_provider setting is not available. - """ - # It doesn't matter what the field is - just check that we can change any field. - field_name = "enable_proctored_exams" - course = CourseFactory.create(start=datetime.datetime.now(UTC) - datetime.timedelta(days=1)) - user = UserFactory.create(is_staff=staff_user) - - did_validate, errors, test_model = CourseMetadata.validate_and_update_from_json( - course, - { - field_name: {"value": True}, - }, - user=user - ) - self.assertTrue(did_validate) - self.assertEqual(len(errors), 0) - self.assertIn(field_name, test_model) - - @override_settings( - PROCTORING_BACKENDS={ - 'DEFAULT': 'test_proctoring_provider', - 'test_proctoring_provider': {} - } - ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) - def test_validate_update_does_not_filter_out_proctoring_provider_when_waffle_flag_enabled(self): - """ - Tests that proctoring provider field is returned by validate_and_update_from_json method when - waffle flag is enabled. - """ - field_name = "proctoring_provider" - - _, _, test_model = CourseMetadata.validate_and_update_from_json( - self.course, - { - field_name: {"value": 'test_proctoring_provider'}, - }, - user=self.user - ) - self.assertIn(field_name, test_model) - - @override_settings( - PROCTORING_BACKENDS={ - 'DEFAULT': 'test_proctoring_provider', - 'test_proctoring_provider': {} - } - ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) - def test_update_from_json_does_not_filter_out_proctoring_provider_when_waffle_flag_enabled(self): - """ - Tests that proctoring provider field is returned by update_from_json method when - waffle flag is enabled. - """ - field_name = "proctoring_provider" - test_model = CourseMetadata.update_from_json( - self.course, - { - field_name: {"value": 'test_proctoring_provider'}, - }, - user=self.user - ) - self.assertIn(field_name, test_model) - - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, False) - def test_proctoring_provider_not_present_when_waffle_flag_not_enabled(self): - """ - Tests that proctoring provider field is filtered out when the waffle flag is not enabled. - """ - test_model = CourseMetadata.fetch(self.fullcourse) - self.assertNotIn('proctoring_provider', test_model) - - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, False) - def test_validate_update_does_filter_out_proctoring_provider_when_waffle_flag_not_enabled(self): - """ - Tests that proctoring provider field is not returned by validate_and_update_from_json method when - waffle flag is not enabled. - """ - field_name = "proctoring_provider" - - _, _, test_model = CourseMetadata.validate_and_update_from_json( - self.course, - { - field_name: {"value": 'test_proctoring_provider'}, - }, - user=self.user - ) - self.assertNotIn(field_name, test_model) - - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, False) - def test_update_from_json_does_filter_out_proctoring_provider_when_waffle_flag_not_enabled(self): - """ - Tests that proctoring provider field is not returned by update_from_json method when - waffle flag is not enabled. - """ - field_name = "proctoring_provider" - - test_model = CourseMetadata.update_from_json( - self.course, - { - field_name: {"value": 'test_proctoring_provider'}, - }, - user=self.user - ) - self.assertNotIn(field_name, test_model) - @ddt.data(True, False) @override_settings( PROCTORING_BACKENDS={ @@ -1461,7 +1339,6 @@ class CourseMetadataEditingTest(CourseTestCase): }, FEATURES={'ENABLE_EXAM_SETTINGS_HTML_VIEW': True}, ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_validate_update_requires_escalation_email_for_proctortrack(self, include_blank_email): json_data = { "proctoring_provider": {"value": 'proctortrack'}, @@ -1489,7 +1366,6 @@ class CourseMetadataEditingTest(CourseTestCase): 'proctortrack': {} } ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_validate_update_does_not_require_escalation_email_by_default(self): did_validate, errors, test_model = CourseMetadata.validate_and_update_from_json( self.course, @@ -1509,7 +1385,6 @@ class CourseMetadataEditingTest(CourseTestCase): }, FEATURES={'ENABLE_EXAM_SETTINGS_HTML_VIEW': True}, ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_validate_update_cannot_unset_escalation_email_when_proctortrack_is_provider(self): course = CourseFactory.create() CourseMetadata.update_from_dict({"proctoring_provider": 'proctortrack'}, course, self.user) @@ -1534,7 +1409,6 @@ class CourseMetadataEditingTest(CourseTestCase): 'proctortrack': {} } ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_validate_update_set_proctortrack_provider_with_valid_escalation_email(self): did_validate, errors, test_model = CourseMetadata.validate_and_update_from_json( self.course, @@ -1555,7 +1429,6 @@ class CourseMetadataEditingTest(CourseTestCase): 'proctortrack': {} } ) - @override_waffle_flag(ENABLE_PROCTORING_PROVIDER_OVERRIDES, True) def test_validate_update_escalation_email_not_requirement_disabled(self): """ Tests the escalation email is not required if 'ENABLED_EXAM_SETTINGS_HTML_VIEW' diff --git a/cms/djangoapps/models/settings/course_metadata.py b/cms/djangoapps/models/settings/course_metadata.py index 214d7debf8..b6a9ca5940 100644 --- a/cms/djangoapps/models/settings/course_metadata.py +++ b/cms/djangoapps/models/settings/course_metadata.py @@ -13,7 +13,6 @@ import pytz from six import text_type from xblock.fields import Scope -from cms.djangoapps.contentstore.config.waffle import ENABLE_PROCTORING_PROVIDER_OVERRIDES from openedx.features.course_experience import COURSE_ENABLE_UNENROLLED_ACCESS_FLAG from student.roles import GlobalStaff from xblock_django.models import XBlockStudioConfigurationFlag @@ -129,11 +128,6 @@ class CourseMetadata(object): if not XBlockStudioConfigurationFlag.is_enabled(): exclude_list.append('allow_unsupported_xblocks') - # If the ENABLE_PROCTORING_PROVIDER_OVERRIDES waffle flag is not enabled, - # do not show "Proctoring Configuration" in Studio Advanced Settings. - if not ENABLE_PROCTORING_PROVIDER_OVERRIDES.is_enabled(course_key): - exclude_list.append('proctoring_provider') - # Do not show "Course Visibility For Unenrolled Learners" in Studio Advanced Settings # if the enable_anonymous_access flag is not enabled if not COURSE_ENABLE_UNENROLLED_ACCESS_FLAG.is_enabled(course_key=course_key): @@ -342,9 +336,6 @@ class CourseMetadata(object): """ Return whether the requested proctoring provider is different than the current proctoring provider, indicating that the user has requested a change to the proctoring_provider Advanced Setting. - The requested_provider will be None if the proctoring_provider setting is not available (e.g. if the - ENABLE_PROCTORING_PROVIDER_OVERRIDES waffle flag is not enabled for the course). In this case, we consider - that there is no change in the requested proctoring provider. """ if requested_provider is None: return False