feat: enable unit-level control over discussions by default (#30903)

This PR changes the default behaviour of the discussions experience by making the previous "unit-level
visibility" the default mechanism for configuring discussions.

Prior to this PR, under the new discussions configuration experience, all units would automatically get
assigned a discussion topic and have discussions enabled for them (other than units in graded or exam
subsections). However, if authors wanted they could enabled a custom visibility mode which would allow
toggling discussions on or off on a per-unit level.

This PR makes this custom visibility mode the standard behaviour (and eventually, only behaviour)
and enables discussion for all units by default. This replicates the behaviour that already existed,
however, now gives authors control over disabling discussions for individual units by default.

It also removes the ability to disable discussions for all units (while still keeping course-wide
discussions) enabled.
This commit is contained in:
Kshitij Sobti
2022-09-07 11:41:17 +00:00
committed by GitHub
parent b8e5540fcc
commit 3cd3c60b59
7 changed files with 47 additions and 24 deletions

View File

@@ -91,20 +91,20 @@ class TestDiscussionEnabled(CourseTestCase):
)
return resp
def test_discussion_enabled_false_initially(self):
def test_discussion_enabled_true_initially(self):
"""
Tests discussion_enabled flag is False initially for vertical
Tests discussion_enabled flag is True initially for vertical
"""
self.assertFalse(self.get_discussion_enabled_status(self.vertical))
self.assertFalse(self.get_discussion_enabled_status(self.vertical_1))
self.assertTrue(self.get_discussion_enabled_status(self.vertical))
self.assertTrue(self.get_discussion_enabled_status(self.vertical_1))
def test_discussion_enabled_toggle(self):
"""
Tests discussion_enabled can be toggled.
"""
self.set_discussion_enabled_status(self.vertical, True)
self.assertTrue(self.get_discussion_enabled_status(self.vertical))
self.assertFalse(self.get_discussion_enabled_status(self.vertical_1))
self.set_discussion_enabled_status(self.vertical, False)
self.assertFalse(self.get_discussion_enabled_status(self.vertical))
self.assertTrue(self.get_discussion_enabled_status(self.vertical_1))
def test_non_course_author_cannot_get_or_set_discussion_enabled_flag(self):
"""

View File

@@ -0,0 +1,23 @@
# Generated by Django 3.2.15 on 2022-08-26 11:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('discussions', '0013_auto_20220802_1154'),
]
operations = [
migrations.AlterField(
model_name='discussionsconfiguration',
name='unit_level_visibility',
field=models.BooleanField(default=True, help_text='If enabled, discussions will need to be manually enabled for each unit.'),
),
migrations.AlterField(
model_name='historicaldiscussionsconfiguration',
name='unit_level_visibility',
field=models.BooleanField(default=True, help_text='If enabled, discussions will need to be manually enabled for each unit.'),
),
]

View File

@@ -432,7 +432,7 @@ class DiscussionsConfiguration(TimeStampedModel):
help_text=_("If enabled, discussion topics will be created for graded units as well.")
)
unit_level_visibility = models.BooleanField(
default=False,
default=True,
help_text=_("If enabled, discussions will need to be manually enabled for each unit.")
)
plugin_configuration = JSONField(

View File

@@ -80,7 +80,7 @@ def update_discussions_settings_from_course(course_key: CourseKey) -> CourseDisc
provider = course.discussions_settings.get('provider', provider_type)
enable_in_context = course.discussions_settings.get('enable_in_context', True)
provider_config = course.discussions_settings.get(provider, {})
unit_level_visibility = course.discussions_settings.get('unit_level_visibility', False)
unit_level_visibility = course.discussions_settings.get('unit_level_visibility', True)
enable_graded_units = course.discussions_settings.get('enable_graded_units', False)
contexts = []
if supports_in_context:

View File

@@ -108,10 +108,10 @@ class UpdateDiscussionsSettingsFromCourseTestCase(ModuleStoreTestCase):
config_data = update_discussions_settings_from_course(self.course.id)
assert config_data.course_key == self.course.id
assert config_data.enable_graded_units is False
assert config_data.unit_level_visibility is False
assert config_data.unit_level_visibility is True
assert config_data.provider_type is not None
assert config_data.plugin_configuration == {}
assert len(config_data.contexts) == 4
assert {context.title for context in config_data.contexts} == {"General", "Unit", "Discussable Unit"}
def test_general_topics(self):
"""
@@ -122,7 +122,7 @@ class UpdateDiscussionsSettingsFromCourseTestCase(ModuleStoreTestCase):
"Test Topic": {"id": "test-topic"},
})
config_data = update_discussions_settings_from_course(self.course.id)
assert len(config_data.contexts) == 5
assert len(config_data.contexts) == 4
assert DiscussionTopicContext(
title="General",
external_id="general-topic",
@@ -135,15 +135,17 @@ class UpdateDiscussionsSettingsFromCourseTestCase(ModuleStoreTestCase):
) in config_data.contexts
@ddt.data(
({}, 3, {"Unit", "Discussable Unit"},
{"Graded Unit", "Non-Discussable Unit", "Discussable Graded Unit", "Non-Discussable Graded Unit"}),
({"enable_in_context": False}, 1, set(), {"Unit", "Graded Unit"}),
({"enable_graded_units": False}, 4, {"Unit", "Discussable Unit", "Non-Discussable Unit"},
({"unit_level_visibility": False, "enable_graded_units": False}, 4,
{"Unit", "Discussable Unit", "Non-Discussable Unit"},
{"Graded Unit"}),
({"enable_graded_units": True}, 7, {"Unit", "Graded Unit", "Discussable Graded Unit"}, set()),
({"unit_level_visibility": True}, 2, {"Discussable Unit"},
{"Unit", "Graded Unit", "Non-Discussable Unit", "Discussable Graded Unit", "Non-Discussable Graded Unit"}),
({"unit_level_visibility": True, "enable_graded_units": True}, 3,
{"Discussable Unit", "Discussable Graded Unit"},
{"Graded Unit", "Non-Discussable Unit", "Non-Discussable Graded Unit"}),
({"unit_level_visibility": False, "enable_graded_units": True}, 7,
{"Unit", "Graded Unit", "Discussable Graded Unit"}, set()),
({"enable_graded_units": True}, 5,
{"Discussable Unit", "Discussable Graded Unit", "Graded Unit"},
{"Non-Discussable Unit", "Non-Discussable Graded Unit"}),
)
@ddt.unpack
def test_custom_discussion_settings(self, settings, context_count, present_units, missing_units):

View File

@@ -418,7 +418,7 @@ class CourseFields: # lint-amnesty, pylint: disable=missing-class-docstring
default={
"enable_in_context": True,
"enable_graded_units": False,
"unit_level_visibility": False,
"unit_level_visibility": True,
}
)
announcement = Date(

View File

@@ -41,10 +41,8 @@ class VerticalFields:
discussion_enabled = Boolean(
display_name=_("Enable in-context discussions for the Unit"),
help=_(
"Add discussion for the Unit."
),
default=False,
help=_("Add discussion for the Unit."),
default=True,
scope=Scope.settings,
)