Skip to content

[DEPR]: Legacy (non-MFE) discussions — forum tab, waffle flags, and config #38940

Description

@feanil

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 — 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)
  • #35254discussions.pages_and_resources_mfe waffle flag (blocking bug #35509 closed; draft PR #37667)

Supporting context: forum post for #36229https://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 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.tomlDiscussionLtiCourseTab), 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 endpointscourse_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-586lms/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).
  • Close #36229 and #35254 as duplicates of this ticket (notify @kdmccormick re: PR fix!: Remove discussions.pages_and_resources waffle #37667).

Metadata

Metadata

Assignees

Labels

deprProposal for deprecation & removal per OEP-21

Type

No type

Projects

Status
Transition Unblocked

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions