diff --git a/lms/djangoapps/branding/test_toggles.py b/lms/djangoapps/branding/test_toggles.py new file mode 100644 index 0000000000..92bde93a71 --- /dev/null +++ b/lms/djangoapps/branding/test_toggles.py @@ -0,0 +1,23 @@ +""" +Tests for toggles, where there is logic beyond enable/disable. +""" + +import ddt +from django.test import override_settings, TestCase + +from lms.djangoapps.branding.toggles import use_catalog_mfe + + +@ddt.ddt +class TestBrandingToggles(TestCase): + """ + Tests for toggles, where there is logic beyond enable/disable. + """ + + @ddt.data(True, False) + def test_use_catalog_mfe(self, enabled): + """ + Test the use_catalog_mfe toggle. + """ + with override_settings(FEATURES={'ENABLE_CATALOG_MICROFRONTEND': enabled}): + assert use_catalog_mfe() == enabled diff --git a/lms/djangoapps/branding/toggles.py b/lms/djangoapps/branding/toggles.py new file mode 100644 index 0000000000..ba7b3407d7 --- /dev/null +++ b/lms/djangoapps/branding/toggles.py @@ -0,0 +1,15 @@ +""" +Configuration for features of Branding +""" +from django.conf import settings + +from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers + + +def use_catalog_mfe(): + """ + Determine if Catalog MFE is enabled, replacing student_dashboard + """ + return configuration_helpers.get_value( + 'ENABLE_CATALOG_MICROFRONTEND', settings.FEATURES['ENABLE_CATALOG_MICROFRONTEND'] + ) diff --git a/lms/envs/common.py b/lms/envs/common.py index 48bb0e5672..b912c8c38b 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -881,6 +881,15 @@ FEATURES = { # toggle does not have a target removal date. 'ENABLE_AUTHN_MICROFRONTEND': os.environ.get("EDXAPP_ENABLE_AUTHN_MFE", False), + # .. toggle_name: FEATURES['ENABLE_CATALOG_MICROFRONTEND'] + # .. toggle_implementation: DjangoSetting + # .. toggle_default: False + # .. toggle_description: Supports staged rollout of a new micro-frontend-based implementation of the catalog. + # .. toggle_use_cases: temporary + # .. toggle_creation_date: 2025-05-15 + # .. toggle_target_removal_date: 2025-11-01 + 'ENABLE_CATALOG_MICROFRONTEND': False, + ### ORA Feature Flags ### # .. toggle_name: FEATURES['ENABLE_ORA_ALL_FILE_URLS'] # .. toggle_implementation: DjangoSetting diff --git a/lms/envs/mock.yml b/lms/envs/mock.yml index 386388a887..0bcdf0e84b 100644 --- a/lms/envs/mock.yml +++ b/lms/envs/mock.yml @@ -552,6 +552,7 @@ FEATURES: ENABLE_API_DOCS: true ENABLE_ASYNC_ANSWER_DISTRIBUTION: true ENABLE_AUTHN_MICROFRONTEND: true + ENABLE_CATALOG_MICROFRONTEND: true ENABLE_AUTO_GENERATED_USERNAME: true ENABLE_BULK_USER_RETIREMENT: true ENABLE_CERTIFICATES_IDV_REQUIREMENT: true diff --git a/openedx/core/djangoapps/discussions/serializers.py b/openedx/core/djangoapps/discussions/serializers.py index 88648a4995..5e042575a2 100644 --- a/openedx/core/djangoapps/discussions/serializers.py +++ b/openedx/core/djangoapps/discussions/serializers.py @@ -354,6 +354,14 @@ class DiscussionsConfigurationSerializer(serializers.ModelSerializer): key not in LegacySettingsSerializer.Meta.fields_cohorts ) } + # Toggle discussion tab is_hidden. Before Palm, we would mark the discussion tab with the is_hidden property. + # Redwood and later, we disable discussions entirely by toggling the discussion configuration enabled property. + # This ensures pre-Palm courses import with discussions tab appropriately shown/hidden. + for tab in course.tabs: + if tab.tab_id == 'discussion' and tab.is_hidden == validated_data.get('enabled'): + tab.is_hidden = not validated_data.get('enabled') + save = True + break if save: modulestore().update_item(course, self.context['user_id']) return instance diff --git a/openedx/core/djangoapps/discussions/tests/test_views.py b/openedx/core/djangoapps/discussions/tests/test_views.py index b9663af8ed..64d342480a 100644 --- a/openedx/core/djangoapps/discussions/tests/test_views.py +++ b/openedx/core/djangoapps/discussions/tests/test_views.py @@ -384,6 +384,26 @@ class DataTest(AuthorizedApiTest, DataTestMixin): assert data['plugin_configuration'] == {'key': 'value'} assert data['lti_configuration'] == DEFAULT_LTI_CONFIGURATION + @ddt.data( + True, + False, + ) + def test_enabled_configuration(self, enabled): + """ + Test that setting the "enabled" property for Discussions shows the Discussions tab. + """ + payload = { + "provider_type": Provider.PIAZZA, + "enabled": enabled, + } + self._post(payload) + + data = self.get() + for tab in self.store.get_course(self.course.id).tabs: + if tab.tab_id == "discussion": + assert data["enabled"] == (not tab.is_hidden) + break + def test_change_plugin_configuration(self): """ Tests custom config values persist that when changing discussion diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 6c2b7576df..ce3567fceb 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -566,7 +566,7 @@ enmerkar==0.7.1 # via enmerkar-underscore enmerkar-underscore==2.4.0 # via -r requirements/edx/kernel.in -enterprise-integrated-channels==0.1.6 +enterprise-integrated-channels==0.1.7 # via -r requirements/edx/bundled.in event-tracking==3.3.0 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index fc92da6007..66201eb877 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -879,7 +879,7 @@ enmerkar-underscore==2.4.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -enterprise-integrated-channels==0.1.6 +enterprise-integrated-channels==0.1.7 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index f03519ad2c..675592a536 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -653,7 +653,7 @@ enmerkar==0.7.1 # enmerkar-underscore enmerkar-underscore==2.4.0 # via -r requirements/edx/base.txt -enterprise-integrated-channels==0.1.6 +enterprise-integrated-channels==0.1.7 # via -r requirements/edx/base.txt event-tracking==3.3.0 # via diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 223012f587..0bbbe3f301 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -680,7 +680,7 @@ enmerkar==0.7.1 # enmerkar-underscore enmerkar-underscore==2.4.0 # via -r requirements/edx/base.txt -enterprise-integrated-channels==0.1.6 +enterprise-integrated-channels==0.1.7 # via -r requirements/edx/base.txt event-tracking==3.3.0 # via