You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fast-track continuity: the MFE replacement has been the default experience since the Olive
release, and the two DEPRs this supersedes (#36229, #35254) already completed their
transition periods in 2025. The prior blocker for #36229 — the cs_comments_service removal —
has since landed. This ticket consolidates the remaining cleanup into a single pass.
Rationale
Part of the general move to consolidate the frontend and remove non-MFE user experiences. The Discussions MFE (frontend-app-discussions) has been the default forums experience
since Olive, and inline/in-context discussions are served by the learning MFE. The legacy
server-rendered forum (the pre-MFE course tab), its associated waffle flags, and the now-unused
discussion config endpoints are the remaining legacy surface.
Consolidating avoids piecemeal extraction and gives one clear picture of everything that goes away.
This supersedes and closes as duplicates:
#36229 — Non-MFE course tab interface for discussions (Breaking-Changes-Unblocked since 2025-06-30; unstaffed)
discussions.override_discussion_legacy_settings — legacy discussion-settings override (same file), plus the legacy_discussion_experience_enabled() helper in config/waffle_utils.py.
Legacy forum tab UI (lms/djangoapps/discussion/)
Board/page views in views.py: forum_form_discussion, single_thread, user_profile, followed_threads, DiscussionBoardFragmentView, and the MFE-vs-legacy switching in plugins.py / views.py.
The ~30 legacy AJAX action endpoints in django_comment_client/base/urls.py (thread/comment create/update/delete/vote/flag/pin/follow/endorse, upload, users) and their views.py.
Legacy templates (discussion_board_fragment.html, discussion_private_fragment.html, discussion_profile_page.html, maintenance_fragment.html, discussion_board_js.template) and the legacy static/ Backbone/Underscore forum client (JS/CSS).
What replaces it / how operators transition
Replacement is the Discussions MFE (frontend-app-discussions, default since Olive) for the forums tab, and the learning MFE for in-context discussions.
Operators still on the legacy experience must ensure discussions.enable_discussions_mfe is enabled before the breaking-change date. Tutor already does this in its MFE init (waffle_flag --create --everyone discussions.enable_discussions_mfe), so default Tutor deployments are already on the MFE and need no action. Vanilla deployments that never set the flag will switch from the legacy forum to the MFE.
Explicitly OUT of scope (preserved):
Inline / in-context discussion and the built-in Discussion XBlock (xmodule/discussion_block.py, inline_discussion view) — tracked separately by public-engineering#538 / epic #37819.
LTI discussion provider (openedx/features/lti_course_tab/) — remains, and is confirmed independent of the forum-v1 code (verified 2026-07-31): it is a separate package with its own course-tab entry point (lti_discussion in pyproject.toml → DiscussionLtiCourseTab), renders its own LTI 1.1 iframe embed via the generic TabFragmentViewMixin / CourseTabView machinery, is enabled via DiscussionsConfiguration.lti_discussion_enabled(), and has zero references to the forum-v1 views/templates/flag. When removing the v1 DiscussionTab and the plugins.py MFE-vs-legacy switching, preserve the LTI tab's independent enablement (it does not depend on the v1 plugin).
Shared discussions backend the MFE depends on:api/discussion/ REST API (rest_api, v1 + v2), the cc comment client, django_comment_client utils/permissions/roles, notifications (notification_prefs, edx_ace), and DiscussionsConfiguration.
Divided/cohorted-discussions settings endpoints — course_discussions_settings_handler (/courses/{course_id}/discussions/settings) and the discussion_topics view (/courses/{course_id}/discussion/topics). Investigated (2026-07-30): these back the divided/cohorted-discussions feature and are not part of the forum tab. They are still consumed by the legacy instructor dashboard's "Discussions" management section (lms/djangoapps/instructor/views/instructor_dashboard.py:582-586 → lms/static/js/.../groups/views/), and the new frontend-app-instructor-dashboard MFE does not implement divided-discussions management at all (its cohorts feature uses the modern /api/cohorts/v1|v2/ API; no divided/division concept exists in the MFE). So this is an unmigrated feature, not a swapped endpoint — removal is coupled to the instructor-dashboard MFE gaining (or explicitly dropping) divided-discussions management (frontend-app-instructor-dashboard#225), and stays out of this DEPR.
Non-legacy flags:discussions.enable_new_structure_discussions (used by the rest_api / MFE backend), discussions.only_verified_users_can_post, discussions.enable_rate_limit.
Task List
Remove discussions.enable_discussions_mfe and the MFE-vs-legacy switching in lms/djangoapps/discussion/plugins.py and views.py (preserve inline_discussion, the divided-discussions settings endpoints used by the instructor dashboard, and the LTI enablement path).
Remove the legacy forum board views (forum_form_discussion, single_thread, user_profile, followed_threads, DiscussionBoardFragmentView) and their URL routes.
Remove the django_comment_client/base legacy AJAX endpoints + views + their URLs.
Remove legacy forum templates and static/ assets.
Remove discussions.pages_and_resources_mfe (make the MFE always-on) — coordinate with / re-point draft PR #37667; update get_pages_and_resources_url and the CMS waffle-flags serializer.
Remove discussions.override_discussion_legacy_settings and legacy_discussion_experience_enabled().
Set the issue status to Transition Unblocked and post the link in #risky-changes (fast-track process — no RFC forum post).
RFC Start Date
N/A -- Already Accepted
Target Plan Accepted Date
N/A -- Already Accepted
Target Transition Unblocked Date
Immediately -- Transition Already Unblocked
Earliest Breaking Changes Unblocked Date
2026-08-14 (2 weeks)
Rationale
Part of the general move to consolidate the frontend and remove non-MFE user experiences. The
Discussions MFE (
frontend-app-discussions) has been the default forums experiencesince Olive, and inline/in-context discussions are served by the learning MFE. The legacy
server-rendered forum (the pre-MFE course tab), its associated waffle flags, and the now-unused
discussion config endpoints are the remaining legacy surface.
Consolidating avoids piecemeal extraction and gives one clear picture of everything that goes away.
This supersedes and closes as duplicates:
discussions.pages_and_resources_mfewaffle flag (blocking bug #35509 closed; draft PR #37667)Supporting context: forum post for #36229 — https://discuss.openedx.org/t/deprecation-non-mfe-course-tab-interface-for-discussions/15012
Description
What is being removed — the legacy (non-MFE) discussions experience in
lms/djangoapps/discussion/and the related config flags:Waffle flags
discussions.enable_discussions_mfe— the forum-tab MFE-vs-legacy switch (lms/djangoapps/discussion/toggles.py). Default becomes "always MFE".discussions.pages_and_resources_mfe— the authoring Pages & Resources MFE switch (openedx/core/djangoapps/discussions/config/waffle.py). MFE becomes always-on (per [DEPR]: discussions.pages_and_resources_mfe waffle flag #35254).discussions.override_discussion_legacy_settings— legacy discussion-settings override (same file), plus thelegacy_discussion_experience_enabled()helper inconfig/waffle_utils.py.Legacy forum tab UI (
lms/djangoapps/discussion/)views.py:forum_form_discussion,single_thread,user_profile,followed_threads,DiscussionBoardFragmentView, and the MFE-vs-legacy switching inplugins.py/views.py.django_comment_client/base/urls.py(thread/comment create/update/delete/vote/flag/pin/follow/endorse,upload,users) and theirviews.py.discussion_board_fragment.html,discussion_private_fragment.html,discussion_profile_page.html,maintenance_fragment.html,discussion_board_js.template) and the legacystatic/Backbone/Underscore forum client (JS/CSS).What replaces it / how operators transition
frontend-app-discussions, default since Olive) for the forums tab, and the learning MFE for in-context discussions.discussions.enable_discussions_mfeis enabled before the breaking-change date. Tutor already does this in its MFE init (waffle_flag --create --everyone discussions.enable_discussions_mfe), so default Tutor deployments are already on the MFE and need no action. Vanilla deployments that never set the flag will switch from the legacy forum to the MFE.Explicitly OUT of scope (preserved):
xmodule/discussion_block.py,inline_discussionview) — tracked separately by public-engineering#538 / epic #37819.openedx/features/lti_course_tab/) — remains, and is confirmed independent of the forum-v1 code (verified 2026-07-31): it is a separate package with its own course-tab entry point (lti_discussioninpyproject.toml→DiscussionLtiCourseTab), renders its own LTI 1.1 iframe embed via the genericTabFragmentViewMixin/CourseTabViewmachinery, is enabled viaDiscussionsConfiguration.lti_discussion_enabled(), and has zero references to the forum-v1 views/templates/flag. When removing the v1DiscussionTaband theplugins.pyMFE-vs-legacy switching, preserve the LTI tab's independent enablement (it does not depend on the v1 plugin).api/discussion/REST API (rest_api, v1 + v2), thecccomment client,django_comment_clientutils/permissions/roles, notifications (notification_prefs,edx_ace), andDiscussionsConfiguration.course_discussions_settings_handler(/courses/{course_id}/discussions/settings) and thediscussion_topicsview (/courses/{course_id}/discussion/topics). Investigated (2026-07-30): these back the divided/cohorted-discussions feature and are not part of the forum tab. They are still consumed by the legacy instructor dashboard's "Discussions" management section (lms/djangoapps/instructor/views/instructor_dashboard.py:582-586→lms/static/js/.../groups/views/), and the newfrontend-app-instructor-dashboardMFE does not implement divided-discussions management at all (its cohorts feature uses the modern/api/cohorts/v1|v2/API; no divided/division concept exists in the MFE). So this is an unmigrated feature, not a swapped endpoint — removal is coupled to the instructor-dashboard MFE gaining (or explicitly dropping) divided-discussions management (frontend-app-instructor-dashboard#225), and stays out of this DEPR.discussions.enable_new_structure_discussions(used by the rest_api / MFE backend),discussions.only_verified_users_can_post,discussions.enable_rate_limit.Task List
discussions.enable_discussions_mfeand the MFE-vs-legacy switching inlms/djangoapps/discussion/plugins.pyandviews.py(preserveinline_discussion, the divided-discussions settings endpoints used by the instructor dashboard, and the LTI enablement path).forum_form_discussion,single_thread,user_profile,followed_threads,DiscussionBoardFragmentView) and their URL routes.django_comment_client/baselegacy AJAX endpoints + views + their URLs.static/assets.discussions.pages_and_resources_mfe(make the MFE always-on) — coordinate with / re-point draft PR #37667; updateget_pages_and_resources_urland the CMS waffle-flags serializer.discussions.override_discussion_legacy_settingsandlegacy_discussion_experience_enabled().#risky-changes(fast-track process — no RFC forum post).