Skip to content

Commit 5d0d60d

Browse files
authored
feat!: Drop support for the legacy textbooks page. (#37545)
The legacy textbooks page has been replaced with an authoring MFE equivalent. We don't need to keep the old one around. This work is part of #36108 BREAKING CHANGE: With this change the `legacy_studio.textbooks` waffle flag will no longer be respected and the system will behave as if the flag is always set to False.
1 parent d082d3d commit 5d0d60d

29 files changed

Lines changed: 33 additions & 1752 deletions

cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,15 @@ def get_use_new_certificates_page(self, obj):
148148

149149
def get_use_new_textbooks_page(self, obj):
150150
"""
151-
Method to get the use_new_textbooks_page switch
151+
Method to indicate whether we should use_new_textbooks_page or not.
152+
153+
This used to be based on a waffle flag but the flag is being removed so we
154+
default it to true for now until we can remove the need for it from the consumers
155+
of this serializer and the related APIs.
156+
157+
See https://github.com/openedx/edx-platform/issues/37497
152158
"""
153-
course_key = self.get_course_key()
154-
return toggles.use_new_textbooks_page(course_key)
159+
return True
155160

156161
def get_use_new_group_configurations_page(self, obj):
157162
"""

cms/djangoapps/contentstore/tests/test_contentstore.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,15 @@ def test_get_html(handler):
14671467
)
14681468
self.assertEqual(resp.status_code, 200)
14691469

1470+
def test_get_json(handler):
1471+
# Helper function for getting HTML for a page in Studio and
1472+
# checking that it does not error.
1473+
resp = self.client.get(
1474+
get_url(handler, course_key, 'course_key_string'),
1475+
HTTP_ACCEPT="application/json",
1476+
)
1477+
self.assertEqual(resp.status_code, 200)
1478+
14701479
course_items = import_course_from_xml(
14711480
self.store, self.user.id, TEST_DATA_DIR, ['simple'], create_if_not_present=True
14721481
)
@@ -1499,8 +1508,7 @@ def test_get_html(handler):
14991508
test_get_html('grading_handler')
15001509
with override_waffle_flag(toggles.LEGACY_STUDIO_ADVANCED_SETTINGS, True):
15011510
test_get_html('advanced_settings_handler')
1502-
with override_waffle_flag(toggles.LEGACY_STUDIO_TEXTBOOKS, True):
1503-
test_get_html('textbooks_list_handler')
1511+
test_get_json('textbooks_list_handler')
15041512

15051513
# go look at the Edit page
15061514
unit_key = course_key.make_usage_key('vertical', 'test_vertical')

cms/djangoapps/contentstore/tests/test_course_settings.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ def test_discussion_fields_available(self, is_pages_and_resources_enabled,
171171
@override_waffle_flag(toggles.LEGACY_STUDIO_CUSTOM_PAGES, True)
172172
@override_waffle_flag(toggles.LEGACY_STUDIO_SCHEDULE_DETAILS, True)
173173
@override_waffle_flag(toggles.LEGACY_STUDIO_GRADING, True)
174-
@override_waffle_flag(toggles.LEGACY_STUDIO_TEXTBOOKS, True)
175174
def test_disable_advanced_settings_feature(self, disable_advanced_settings):
176175
"""
177176
If this feature is enabled, only Django Staff/Superuser should be able to access the "Advanced Settings" page.
@@ -190,7 +189,6 @@ def test_disable_advanced_settings_feature(self, disable_advanced_settings):
190189
'tabs_handler',
191190
'settings_handler',
192191
'grading_handler',
193-
'textbooks_list_handler',
194192
):
195193
# Test that non-staff users don't see the "Advanced Settings" tab link.
196194
response = self.non_staff_client.get_html(

cms/djangoapps/contentstore/toggles.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -402,25 +402,6 @@ def use_new_certificates_page(course_key):
402402
return not LEGACY_STUDIO_CERTIFICATES.is_enabled(course_key)
403403

404404

405-
# .. toggle_name: legacy_studio.textbooks
406-
# .. toggle_implementation: WaffleFlag
407-
# .. toggle_default: False
408-
# .. toggle_description: Temporarily fall back to the old Studio Textbooks page.
409-
# .. toggle_use_cases: temporary
410-
# .. toggle_creation_date: 2025-03-14
411-
# .. toggle_target_removal_date: 2025-09-14
412-
# .. toggle_tickets: https://github.com/openedx/edx-platform/issues/36275
413-
# .. toggle_warning: In Ulmo, this toggle will be removed. Only the new (React-based) experience will be available.
414-
LEGACY_STUDIO_TEXTBOOKS = CourseWaffleFlag('legacy_studio.textbooks', __name__)
415-
416-
417-
def use_new_textbooks_page(course_key):
418-
"""
419-
Returns a boolean if new studio textbooks mfe is enabled
420-
"""
421-
return not LEGACY_STUDIO_TEXTBOOKS.is_enabled(course_key)
422-
423-
424405
# .. toggle_name: legacy_studio.configurations
425406
# .. toggle_implementation: WaffleFlag
426407
# .. toggle_default: False

cms/djangoapps/contentstore/utils.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
use_new_group_configurations_page,
5151
use_new_import_page,
5252
use_new_schedule_details_page,
53-
use_new_textbooks_page,
5453
use_new_unit_page,
5554
use_new_updates_page,
5655
use_new_video_uploads_page,
@@ -492,11 +491,10 @@ def get_textbooks_url(course_locator) -> str:
492491
Gets course authoring microfrontend URL for textbooks page view.
493492
"""
494493
textbooks_url = None
495-
if use_new_textbooks_page(course_locator):
496-
mfe_base_url = get_course_authoring_url(course_locator)
497-
course_mfe_url = f'{mfe_base_url}/course/{course_locator}/textbooks'
498-
if mfe_base_url:
499-
textbooks_url = course_mfe_url
494+
mfe_base_url = get_course_authoring_url(course_locator)
495+
course_mfe_url = f'{mfe_base_url}/course/{course_locator}/textbooks'
496+
if mfe_base_url:
497+
textbooks_url = course_mfe_url
500498
return textbooks_url
501499

502500

cms/djangoapps/contentstore/views/course.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
use_new_updates_page,
9494
use_new_advanced_settings_page,
9595
use_new_grading_page,
96-
use_new_textbooks_page,
9796
use_new_group_configurations_page,
9897
use_new_schedule_details_page
9998
)
@@ -112,7 +111,6 @@
112111
get_schedule_details_url,
113112
get_studio_home_url,
114113
get_updates_url,
115-
get_textbooks_context,
116114
get_textbooks_url,
117115
initialize_permissions,
118116
remove_all_instructors,
@@ -1457,17 +1455,18 @@ def textbooks_list_handler(request, course_key_string):
14571455
json: overwrite all textbooks in the course with the given list
14581456
"""
14591457
course_key = CourseKey.from_string(course_key_string)
1458+
if "application/json" not in request.META.get('HTTP_ACCEPT', 'text/html'):
1459+
# return HTML page
1460+
# We don't need to do an access check here because
1461+
# that is done when the endpoint for the actual content of the page.
1462+
# This is just to handle redirecting anyone that has bookmarked the old
1463+
# textbooks page.
1464+
return redirect(get_textbooks_url(course_key))
1465+
14601466
store = modulestore()
14611467
with store.bulk_operations(course_key):
14621468
course = get_course_and_check_access(course_key, request.user)
14631469

1464-
if "application/json" not in request.META.get('HTTP_ACCEPT', 'text/html'):
1465-
# return HTML page
1466-
if use_new_textbooks_page(course_key):
1467-
return redirect(get_textbooks_url(course_key))
1468-
textbooks_context = get_textbooks_context(course)
1469-
return render_to_response('textbooks.html', textbooks_context)
1470-
14711470
# from here on down, we know the client has requested JSON
14721471
if request.method == 'GET':
14731472
return JsonResponse(course.pdf_textbooks)

cms/djangoapps/contentstore/views/tests/test_textbooks.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
import json
55
from unittest import TestCase
66

7-
from edx_toggles.toggles.testutils import override_waffle_flag
87

9-
from cms.djangoapps.contentstore import toggles
108
from cms.djangoapps.contentstore.tests.utils import CourseTestCase
119
from cms.djangoapps.contentstore.utils import reverse_course_url
1210

@@ -20,15 +18,10 @@ def setUp(self):
2018
super().setUp()
2119
self.url = reverse_course_url('textbooks_list_handler', self.course.id)
2220

23-
@override_waffle_flag(toggles.LEGACY_STUDIO_TEXTBOOKS, True)
2421
def test_view_index(self):
2522
"Basic check that the textbook index page responds correctly"
2623
resp = self.client.get(self.url)
27-
self.assertEqual(resp.status_code, 200)
28-
# we don't have resp.context right now,
29-
# due to bugs in our testing harness :(
30-
if resp.context and resp.context.get('course'):
31-
self.assertEqual(resp.context['course'], self.course)
24+
self.assertEqual(resp.status_code, 302)
3225

3326
def test_view_index_xhr(self):
3427
"Check that we get a JSON response when requested via AJAX"

cms/static/cms/js/spec/main.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,9 @@
234234
'js/spec/models/section_spec',
235235
'js/spec/models/settings_course_grader_spec',
236236
'js/spec/models/settings_grading_spec',
237-
'js/spec/models/textbook_spec',
238237
'js/spec/models/upload_spec',
239238
'js/spec/views/course_info_spec',
240239
'js/spec/views/metadata_edit_spec',
241-
'js/spec/views/textbook_spec',
242240
'js/spec/views/upload_spec',
243241
'js/spec/video/transcripts/message_manager_spec',
244242
'js/spec/video/transcripts/utils_spec',

cms/static/js/collections/chapter.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

cms/static/js/collections/textbook.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)