${_('Use course updates to notify students of important dates or exams, highlight particular discussions in the forums, announce schedule changes, and respond to student questions. You add or edit updates in HTML.')}
-diff --git a/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py b/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py index 5214b8efd4..bb8667ea9c 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py +++ b/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py @@ -80,10 +80,15 @@ class CourseWaffleFlagsSerializer(serializers.Serializer): def get_use_new_updates_page(self, obj): """ - Method to get the use_new_updates_page switch + Method to indicate if we should use the new updates_page + + This used to be based on a waffle flag but the flag is being removed so we + default it to true for now until we can remove the need for it from the consumers + of this serializer and the related APIs. + + See https://github.com/openedx/edx-platform/issues/37497 """ - course_key = self.get_course_key() - return toggles.use_new_updates_page(course_key) + return True def get_use_new_import_page(self, obj): """ diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index 0c213f2d4f..ebd14a4701 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -1498,8 +1498,6 @@ class ContentStoreTest(ContentStoreTestCase): test_get_html('export_handler') with override_waffle_flag(toggles.LEGACY_STUDIO_COURSE_TEAM, True): test_get_html('course_team_handler') - with override_waffle_flag(toggles.LEGACY_STUDIO_UPDATES, True): - test_get_html('course_info_handler') with override_waffle_flag(toggles.LEGACY_STUDIO_CUSTOM_PAGES, True): test_get_html('tabs_handler') with override_waffle_flag(toggles.LEGACY_STUDIO_SCHEDULE_DETAILS, True): @@ -1510,6 +1508,16 @@ class ContentStoreTest(ContentStoreTestCase): test_get_html('advanced_settings_handler') test_get_json('textbooks_list_handler') + # Test that studio updates load + course_updates_url = reverse( + 'course_info_update_handler', + kwargs={ + 'course_key_string': str(course_key), + } + ) + resp = self.client.get(course_updates_url) + assert resp.status_code == 200 + # go look at the Edit page unit_key = course_key.make_usage_key('vertical', 'test_vertical') with override_waffle_flag(toggles.LEGACY_STUDIO_UNIT_EDITOR, True): diff --git a/cms/djangoapps/contentstore/tests/test_course_settings.py b/cms/djangoapps/contentstore/tests/test_course_settings.py index bf8007d41b..605549d2e4 100644 --- a/cms/djangoapps/contentstore/tests/test_course_settings.py +++ b/cms/djangoapps/contentstore/tests/test_course_settings.py @@ -167,7 +167,6 @@ class CourseAdvanceSettingViewTest(CourseTestCase, MilestonesTestCaseMixin): @override_waffle_flag(toggles.LEGACY_STUDIO_IMPORT, True) @override_waffle_flag(toggles.LEGACY_STUDIO_EXPORT, True) @override_waffle_flag(toggles.LEGACY_STUDIO_COURSE_TEAM, True) - @override_waffle_flag(toggles.LEGACY_STUDIO_UPDATES, True) @override_waffle_flag(toggles.LEGACY_STUDIO_CUSTOM_PAGES, True) @override_waffle_flag(toggles.LEGACY_STUDIO_SCHEDULE_DETAILS, True) @override_waffle_flag(toggles.LEGACY_STUDIO_GRADING, True) @@ -185,7 +184,6 @@ class CourseAdvanceSettingViewTest(CourseTestCase, MilestonesTestCaseMixin): 'import_handler', 'export_handler', 'course_team_handler', - 'course_info_handler', 'tabs_handler', 'settings_handler', 'grading_handler', diff --git a/cms/djangoapps/contentstore/toggles.py b/cms/djangoapps/contentstore/toggles.py index 0d0101b6c0..bca1bb3363 100644 --- a/cms/djangoapps/contentstore/toggles.py +++ b/cms/djangoapps/contentstore/toggles.py @@ -256,25 +256,6 @@ def use_new_grading_page(course_key): return not LEGACY_STUDIO_GRADING.is_enabled(course_key) -# .. toggle_name: legacy_studio.updates -# .. toggle_implementation: WaffleFlag -# .. toggle_default: False -# .. toggle_description: Temporarily fall back to the old Studio Course Updates page. -# .. toggle_use_cases: temporary -# .. toggle_creation_date: 2025-03-14 -# .. toggle_target_removal_date: 2025-09-14 -# .. toggle_tickets: https://github.com/openedx/edx-platform/issues/36275 -# .. toggle_warning: In Ulmo, this toggle will be removed. Only the new (React-based) experience will be available. -LEGACY_STUDIO_UPDATES = CourseWaffleFlag('legacy_studio.updates', __name__) - - -def use_new_updates_page(course_key): - """ - Returns a boolean if new studio updates mfe is enabled - """ - return not LEGACY_STUDIO_UPDATES.is_enabled(course_key) - - # .. toggle_name: legacy_studio.import # .. toggle_implementation: WaffleFlag # .. toggle_default: False diff --git a/cms/djangoapps/contentstore/utils.py b/cms/djangoapps/contentstore/utils.py index 8a89bba637..6fe495a0d4 100644 --- a/cms/djangoapps/contentstore/utils.py +++ b/cms/djangoapps/contentstore/utils.py @@ -51,7 +51,6 @@ from cms.djangoapps.contentstore.toggles import ( use_new_import_page, use_new_schedule_details_page, use_new_unit_page, - use_new_updates_page, use_new_video_uploads_page, ) from cms.djangoapps.models.settings.course_grading import CourseGradingModel @@ -362,11 +361,10 @@ def get_updates_url(course_locator) -> str: Gets course authoring microfrontend URL for updates page view. """ updates_url = None - if use_new_updates_page(course_locator): - mfe_base_url = get_course_authoring_url(course_locator) - course_mfe_url = f'{mfe_base_url}/course/{course_locator}/course_info' - if mfe_base_url: - updates_url = course_mfe_url + mfe_base_url = get_course_authoring_url(course_locator) + course_mfe_url = f'{mfe_base_url}/course/{course_locator}/course_info' + if mfe_base_url: + updates_url = course_mfe_url return updates_url diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index f585c4b4af..022f3e66e9 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -71,7 +71,6 @@ from openedx.core.djangoapps.site_configuration import helpers as configuration_ from openedx.core.djangolib.js_utils import dump_js_escaped_json from openedx.core.lib.course_tabs import CourseTabPluginManager from organizations.models import Organization -from xmodule.contentstore.content import StaticContent # lint-amnesty, pylint: disable=wrong-import-order from xmodule.course_block import CourseBlock, CourseFields # lint-amnesty, pylint: disable=wrong-import-order from xmodule.error_block import ErrorBlock # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore import EdxJSONEncoder # lint-amnesty, pylint: disable=wrong-import-order @@ -90,7 +89,6 @@ from ..courseware_index import CoursewareSearchIndexer, SearchIndexingError from ..tasks import rerun_course as rerun_course_task from ..toggles import ( default_enable_flexible_peer_openassessments, - use_new_updates_page, use_new_advanced_settings_page, use_new_grading_page, use_new_group_configurations_page, @@ -1064,24 +1062,7 @@ def course_info_handler(request, course_key_string): except InvalidKeyError: raise Http404 # lint-amnesty, pylint: disable=raise-missing-from - with modulestore().bulk_operations(course_key): - course_block = get_course_and_check_access(course_key, request.user) - if not course_block: - raise Http404 - if use_new_updates_page(course_key): - return redirect(get_updates_url(course_key)) - if 'text/html' in request.META.get('HTTP_ACCEPT', 'text/html'): - return render_to_response( - 'course_info.html', - { - 'context_course': course_block, - 'updates_url': reverse_course_url('course_info_update_handler', course_key), - 'handouts_locator': course_key.make_usage_key('course_info', 'handouts'), - 'base_asset_url': StaticContent.get_base_url_path_for_course_assets(course_block.id), - } - ) - else: - return HttpResponseBadRequest("Only supports html requests") + return redirect(get_updates_url(course_key)) @login_required diff --git a/cms/djangoapps/contentstore/views/tests/test_course_updates.py b/cms/djangoapps/contentstore/views/tests/test_course_updates.py index 7b3c31abe1..85f09bb7e8 100644 --- a/cms/djangoapps/contentstore/views/tests/test_course_updates.py +++ b/cms/djangoapps/contentstore/views/tests/test_course_updates.py @@ -5,9 +5,7 @@ unit tests for course_info views and models. import json from opaque_keys.edx.keys import UsageKey -from edx_toggles.toggles.testutils import override_waffle_flag -from cms.djangoapps.contentstore import toggles from cms.djangoapps.contentstore.tests.test_course_settings import CourseTestCase from cms.djangoapps.contentstore.utils import reverse_course_url, reverse_usage_url from openedx.core.lib.xblock_utils import get_course_update_items @@ -23,7 +21,6 @@ class CourseUpdateTest(CourseTestCase): # lint-amnesty, pylint: disable=missing return reverse_course_url('course_info_update_handler', course_key, kwargs=kwargs) # The do all and end all of unit test cases. - @override_waffle_flag(toggles.LEGACY_STUDIO_UPDATES, True) def test_course_update(self): """Go through each interface and ensure it works.""" def get_response(content, date): @@ -40,11 +37,6 @@ class CourseUpdateTest(CourseTestCase): # lint-amnesty, pylint: disable=missing return json.loads(resp.content.decode('utf-8')) - resp = self.client.get_html( - reverse_course_url('course_info_handler', self.course.id) - ) - self.assertContains(resp, 'Course Updates', status_code=200) - init_content = '' payload = get_response(content, 'January 8, 2013') diff --git a/cms/static/cms/js/build.js b/cms/static/cms/js/build.js index e7b7a7730b..71e820697b 100644 --- a/cms/static/cms/js/build.js +++ b/cms/static/cms/js/build.js @@ -20,7 +20,6 @@ 'js/factories/asset_index', 'js/factories/base', 'js/factories/course_create_rerun', - 'js/factories/course_info', 'js/factories/export', 'js/factories/group_configurations', 'js/certificates/factories/certificates_page_factory', diff --git a/cms/static/cms/js/spec/main.js b/cms/static/cms/js/spec/main.js index 3fb9ca8319..5d8daf5597 100644 --- a/cms/static/cms/js/spec/main.js +++ b/cms/static/cms/js/spec/main.js @@ -235,7 +235,6 @@ 'js/spec/models/settings_course_grader_spec', 'js/spec/models/settings_grading_spec', 'js/spec/models/upload_spec', - 'js/spec/views/course_info_spec', 'js/spec/views/metadata_edit_spec', 'js/spec/views/upload_spec', 'js/spec/video/transcripts/message_manager_spec', diff --git a/cms/static/js/collections/course_update.js b/cms/static/js/collections/course_update.js deleted file mode 100644 index c4ec076845..0000000000 --- a/cms/static/js/collections/course_update.js +++ /dev/null @@ -1,12 +0,0 @@ -define(['backbone', 'js/models/course_update'], function(Backbone, CourseUpdateModel) { - /* - The intitializer of this collection must set id to the update's location.url and courseLocation to the course's location. Must pass the - collection of updates as [{ date : "month day", content : "html"}] - */ - var CourseUpdateCollection = Backbone.Collection.extend({ - // instantiator must set url - - model: CourseUpdateModel - }); - return CourseUpdateCollection; -}); diff --git a/cms/static/js/factories/course_info.js b/cms/static/js/factories/course_info.js deleted file mode 100644 index 54fd381f7a..0000000000 --- a/cms/static/js/factories/course_info.js +++ /dev/null @@ -1,26 +0,0 @@ -define([ - 'jquery', 'js/collections/course_update', 'js/models/module_info', - 'js/models/course_info', 'js/views/course_info_edit' -], function($, CourseUpdateCollection, ModuleInfoModel, CourseInfoModel, CourseInfoEditView) { - 'use strict'; - - return function(updatesUrl, handoutsLocator, baseAssetUrl) { - var course_updates = new CourseUpdateCollection(), - course_handouts, editor; - - course_updates.url = updatesUrl; - course_updates.fetch({reset: true}); - course_handouts = new ModuleInfoModel({ - id: handoutsLocator - }); - editor = new CourseInfoEditView({ - el: $('.main-wrapper'), - model: new CourseInfoModel({ - updates: course_updates, - base_asset_url: baseAssetUrl, - handouts: course_handouts - }) - }); - editor.render(); - }; -}); diff --git a/cms/static/js/models/course_info.js b/cms/static/js/models/course_info.js deleted file mode 100644 index b4e710d503..0000000000 --- a/cms/static/js/models/course_info.js +++ /dev/null @@ -1,13 +0,0 @@ -define(['backbone'], function(Backbone) { - // single per course holds the updates and handouts - var CourseInfo = Backbone.Model.extend({ - // This model class is not suited for restful operations and is considered just a server side initialized container - url: '', - - defaults: { - updates: null, // UpdateCollection - handouts: null // HandoutCollection - } - }); - return CourseInfo; -}); diff --git a/cms/static/js/spec/views/course_info_spec.js b/cms/static/js/spec/views/course_info_spec.js deleted file mode 100644 index 8d3dca7fb4..0000000000 --- a/cms/static/js/spec/views/course_info_spec.js +++ /dev/null @@ -1,283 +0,0 @@ -define(["js/views/course_info_handout", "js/views/course_info_update", "js/models/module_info", - "js/collections/course_update", "edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers"], -(CourseInfoHandoutsView, CourseInfoUpdateView, ModuleInfo, CourseUpdateCollection, AjaxHelpers) => - - describe("Course Updates and Handouts", function() { - const courseInfoPage = `\ -
${_('Use course updates to notify students of important dates or exams, highlight particular discussions in the forums, announce schedule changes, and respond to student questions. You add or edit updates in HTML.')}
-