feat: add course optimizer waffle flag (#35884)

Description
Add a waffle flag to toggle on or off the new Course Optimizer feature per course.

Impact
Course Author

Context
Course Optimizer is a much-requested feature that has been aligned with the OpenEdx community. The only component for now is a broken link checker that will return a list of all broken links in a course to the frontend. There will be a new page for this that is a bit similar to the export page.

This PR only deals with adding a waffle flag.

Supporting information
Internal Ticket (2U):
https://2u-internal.atlassian.net/browse/TNL-11808
This commit is contained in:
Jesper Hodge
2024-11-20 15:51:46 -05:00
committed by GitHub
parent 8f13bdd44b
commit 38e5745e06
3 changed files with 46 additions and 1 deletions

View File

@@ -27,6 +27,7 @@ class CourseWaffleFlagsSerializer(serializers.Serializer):
use_new_certificates_page = serializers.SerializerMethodField()
use_new_textbooks_page = serializers.SerializerMethodField()
use_new_group_configurations_page = serializers.SerializerMethodField()
enable_course_optimizer = serializers.SerializerMethodField()
def get_course_key(self):
"""
@@ -144,3 +145,10 @@ class CourseWaffleFlagsSerializer(serializers.Serializer):
"""
course_key = self.get_course_key()
return toggles.use_new_group_configurations_page(course_key)
def get_enable_course_optimizer(self, obj):
"""
Method to get the enable_course_optimizer waffle flag
"""
course_key = self.get_course_key()
return toggles.enable_course_optimizer(course_key)

View File

@@ -36,6 +36,8 @@ class CourseWaffleFlagsViewTest(CourseTestCase):
"use_new_group_configurations_page",
]
other_expected_waffle_flags = ["enable_course_optimizer"]
def setUp(self):
"""
Set up test data and state before each test method.
@@ -46,6 +48,18 @@ class CourseWaffleFlagsViewTest(CourseTestCase):
super().setUp()
self.url = reverse("cms.djangoapps.contentstore:v1:course_waffle_flags")
self.create_waffle_flags(self.course_waffle_flags)
self.create_custom_waffle_flags()
def create_custom_waffle_flags(self, enabled=True):
"""
Helper method to create waffle flags that are not part of `course_waffle_flags` and have
a different format.
"""
WaffleFlagCourseOverrideModel.objects.create(
waffle_flag="contentstore.enable_course_optimizer",
course_id=self.course.id,
enabled=enabled,
)
def create_waffle_flags(self, flags, enabled=True):
"""
@@ -72,7 +86,10 @@ class CourseWaffleFlagsViewTest(CourseTestCase):
Returns:
dict: A dictionary with each flag set to the value of `enabled`.
"""
return {flag: enabled for flag in self.course_waffle_flags}
res = {flag: enabled for flag in self.course_waffle_flags}
for flag in self.other_expected_waffle_flags:
res[flag] = enabled
return res
def test_get_course_waffle_flags_with_course_id(self):
"""

View File

@@ -667,3 +667,23 @@ def libraries_v2_enabled():
search_api.is_meilisearch_enabled() and
not DISABLE_NEW_LIBRARIES.is_enabled()
)
# .. toggle_name: contentstore.enable_course_optimizer
# .. toggle_implementation: CourseWaffleFlag
# .. toggle_default: False
# .. toggle_description: This flag enables the use of unique anonymous_user_id during studio preview
# .. toggle_use_cases: temporary
# .. toggle_creation_date: 2022-05-04
# .. toggle_target_removal_date: 2022-05-30
# .. toggle_tickets: MST-1455
ENABLE_COURSE_OPTIMIZER = CourseWaffleFlag(
f'{CONTENTSTORE_NAMESPACE}.enable_course_optimizer', __name__
)
def enable_course_optimizer(course_id):
"""
Returns a boolean if individualized anonymous_user_id is enabled on the course
"""
return ENABLE_COURSE_OPTIMIZER.is_enabled(course_id)