diff --git a/openedx/core/djangoapps/discussions/handlers.py b/openedx/core/djangoapps/discussions/handlers.py index f43aaf4b09eb..cef054b317df 100644 --- a/openedx/core/djangoapps/discussions/handlers.py +++ b/openedx/core/djangoapps/discussions/handlers.py @@ -96,12 +96,17 @@ def update_course_discussion_config(configuration: CourseDiscussionConfiguration log.info(f"Course {course_key} doesn't have discussion configuration model yet. Creating a new one.") DiscussionsConfiguration( context_key=course_key, + enabled=configuration.enabled, provider_type=provider_id, plugin_configuration=configuration.plugin_configuration, enable_in_context=configuration.enable_in_context, enable_graded_units=configuration.enable_graded_units, unit_level_visibility=configuration.unit_level_visibility, ).save() + else: + DiscussionsConfiguration.objects.filter( + context_key=course_key, + ).update(enabled=configuration.enabled) COURSE_DISCUSSIONS_CHANGED.connect(handle_course_discussion_config_update) diff --git a/openedx/core/djangoapps/discussions/tasks.py b/openedx/core/djangoapps/discussions/tasks.py index afb43b32cd33..63f95421bb0a 100644 --- a/openedx/core/djangoapps/discussions/tasks.py +++ b/openedx/core/djangoapps/discussions/tasks.py @@ -88,8 +88,20 @@ def update_discussions_settings_from_course( ) contexts.extend(list(discussable_units)) + # Derive enabled from the discussion tab's is_hidden state. + # When a course is imported or rerun, course.tabs are copied verbatim + # from the source but DiscussionsConfiguration is not, so we pass the + # tab state through config_data for the handler to reconcile. + enabled = True + if course: + for tab in course.tabs: + if getattr(tab, 'tab_id', None) == 'discussion': + enabled = not tab.is_hidden + break + config_data = CourseDiscussionConfigurationData( course_key=course_key, + enabled=enabled, enable_in_context=enable_in_context, enable_graded_units=enable_graded_units, unit_level_visibility=unit_level_visibility, diff --git a/openedx/core/djangoapps/discussions/tests/test_handlers.py b/openedx/core/djangoapps/discussions/tests/test_handlers.py index 7e493063da31..107ab643698e 100644 --- a/openedx/core/djangoapps/discussions/tests/test_handlers.py +++ b/openedx/core/djangoapps/discussions/tests/test_handlers.py @@ -55,6 +55,7 @@ def test_configuration_for_new_course(self): config_data = CourseDiscussionConfigurationData( course_key=new_key, provider_type="openedx", + plugin_configuration={}, ) assert not DiscussionsConfiguration.objects.filter(context_key=new_key).exists() update_course_discussion_config(config_data) @@ -191,3 +192,33 @@ def test_enabled_units_change(self): assert existing_topic_link.title == "Section 10|Subsection 10|Unit 10" # If there is no stored context, then continue using the Unit name. assert existing_topic_link_2.title == "Unit 11" + + def test_new_config_uses_enabled_from_configuration(self): + """ + When creating a new DiscussionsConfiguration, the handler should use + the enabled value from the configuration data. + """ + new_key = CourseKey.from_string("course-v1:test+test+disabled") + config_data = CourseDiscussionConfigurationData( + course_key=new_key, + provider_type="openedx", + enabled=False, + plugin_configuration={}, + ) + update_course_discussion_config(config_data) + db_config = DiscussionsConfiguration.objects.get(context_key=new_key) + assert db_config.enabled is False + + def test_existing_config_updated_enabled_from_configuration(self): + """ + When the configuration already exists, the handler should update + enabled from the configuration data. + """ + config_data = CourseDiscussionConfigurationData( + course_key=self.course_key, + provider_type="openedx", + enabled=False, + ) + update_course_discussion_config(config_data) + db_config = DiscussionsConfiguration.objects.get(context_key=self.course_key) + assert db_config.enabled is False diff --git a/openedx/core/djangoapps/discussions/tests/test_tasks.py b/openedx/core/djangoapps/discussions/tests/test_tasks.py index 00b715c945e6..fee840c1905f 100644 --- a/openedx/core/djangoapps/discussions/tests/test_tasks.py +++ b/openedx/core/djangoapps/discussions/tests/test_tasks.py @@ -184,6 +184,28 @@ def test_custom_discussion_settings(self, settings, context_count, present_units assert present_units <= units_in_config assert not missing_units & units_in_config + @ddt.data( + # (tab_is_hidden, expected_enabled) + (True, False), # import with hidden tab → disabled + (False, True), # import with visible tab → enabled + ) + @ddt.unpack + def test_config_data_enabled_from_discussion_tab(self, tab_is_hidden, expected_enabled): + """ + update_discussions_settings_from_course should set config_data.enabled + based on the discussion tab's is_hidden state. + """ + course = self.store.get_course(self.course.id) + for tab in course.tabs: + if getattr(tab, 'tab_id', None) == 'discussion': + tab['is_hidden'] = tab_is_hidden + break + self.store.update_item(course, self.user.id) + + config_data = update_discussions_settings_from_course(self.course.id) + + assert config_data.enabled is expected_enabled + @ddt.ddt class MigrateUnitDiscussionStateFromXBlockTestCase(ModuleStoreTestCase, DiscussionConfigUpdateMixin): diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index f97372bf0542..adcd466cd97c 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -839,7 +839,7 @@ openedx-django-require==3.0.0 # via -r requirements/edx/kernel.in openedx-django-wiki==3.1.1 # via -r requirements/edx/kernel.in -openedx-events==10.5.0 +openedx-events==11.1.0 # via # -r requirements/edx/kernel.in # edx-enterprise diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 9b05cfff0f9c..64a17aeca57d 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1400,7 +1400,7 @@ openedx-django-wiki==3.1.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -openedx-events==10.5.0 +openedx-events==11.1.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 47981df60be8..fb76e605a1db 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -1019,7 +1019,7 @@ openedx-django-require==3.0.0 # via -r requirements/edx/base.txt openedx-django-wiki==3.1.1 # via -r requirements/edx/base.txt -openedx-events==10.5.0 +openedx-events==11.1.0 # via # -r requirements/edx/base.txt # edx-enterprise diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 2696893b9c18..43b4d52a4ba0 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1068,7 +1068,7 @@ openedx-django-require==3.0.0 # via -r requirements/edx/base.txt openedx-django-wiki==3.1.1 # via -r requirements/edx/base.txt -openedx-events==10.5.0 +openedx-events==11.1.0 # via # -r requirements/edx/base.txt # edx-enterprise