openedx / openedx/openedx-platform
[DEPR]: Legacy (non-MFE) discussions — forum tab, waffle flags, and config
@feanil is already working on this.
Since Jul 31, 2026.
- Dominant language
- Python
- Stars
- 8.2k
- Forks
- 4.4k
- Avg merge
- 6d 18h
- Merged PRs (30d)
- 42
Description
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)
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 — thecs_comments_serviceremoval —
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)
- #35254 —
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 #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/)
- Board/page views in
views.py:forum_form_discussion,single_thread,user_profile,followed_threads,DiscussionBoardFragmentView, and the MFE-vs-legacy switching inplugins.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 theirviews.py. - Legacy templates (
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
- 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_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):
- Inline / in-context discussion and the built-in Discussion XBlock (
xmodule/discussion_block.py,inline_discussionview) — 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_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). - Shared discussions backend the MFE depends on:
api/discussion/REST API (rest_api, v1 + v2), thecccomment client,django_comment_clientutils/permissions/roles, notifications (notification_prefs,edx_ace), andDiscussionsConfiguration. - Divided/cohorted-discussions settings endpoints —
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. - 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_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). - 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/baselegacy 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; updateget_pages_and_resources_urland the CMS waffle-flags serializer. - Remove
discussions.override_discussion_legacy_settingsandlegacy_discussion_experience_enabled(). - Set the issue status to Transition Unblocked and post the link in
#risky-changes(fast-track process — no RFC forum post). - Close #36229 and #35254 as duplicates of this ticket (notify @kdmccormick re: PR #37667).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.