Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion cms/djangoapps/contentstore/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@
from opaque_keys.edx.locator import LibraryContainerLocator
from openedx_content.api import get_published_version
from openedx_content.models_api import Component, Container
from openedx_django_lib.fields import immutable_uuid_field, manual_date_time_field, ref_field

try:
from openedx_django_lib.fields import immutable_uuid_field, manual_date_time_field, ref_field
except ImportError: # pragma: no cover - runtime compatibility shim for different openedx_django_lib versions
from openedx_django_lib.fields import immutable_uuid_field, manual_date_time_field
from openedx_django_lib.fields import key_field as ref_field

logger = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,15 @@ def get_use_new_advanced_settings_page(self, obj):

def get_use_new_grading_page(self, obj):
"""
Method to get the use_new_grading_page switch
Method to indicate whether we should use the new grading 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/36275
"""
course_key = self.get_course_key()
return toggles.use_new_grading_page(course_key)
return True

def get_use_new_updates_page(self, obj):
"""
Expand Down
8 changes: 6 additions & 2 deletions cms/djangoapps/contentstore/tests/test_contentstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -1460,7 +1460,11 @@ def test_get_html(handler):
resp = self.client.get_html(
get_url(handler, course_key, 'course_key_string')
)
self.assertEqual(resp.status_code, 200) # noqa: PT009
# When grading is routed to the authoring MFE, we expect a redirect.
if handler == 'grading_handler':
self.assertEqual(resp.status_code, 302) # noqa: PT009
else:
self.assertEqual(resp.status_code, 200) # noqa: PT009

def test_get_json(handler):
# Helper function for getting HTML for a page in Studio and
Expand Down Expand Up @@ -1495,7 +1499,7 @@ def test_get_json(handler):
test_get_html('course_team_handler')
with override_waffle_flag(toggles.LEGACY_STUDIO_SCHEDULE_DETAILS, True):
test_get_html('settings_handler')
with override_waffle_flag(toggles.LEGACY_STUDIO_GRADING, True):
with override_settings(COURSE_AUTHORING_MICROFRONTEND_URL='https://mfe.example'):
test_get_html('grading_handler')
with override_waffle_flag(toggles.LEGACY_STUDIO_ADVANCED_SETTINGS, True):
test_get_html('advanced_settings_handler')
Expand Down
23 changes: 16 additions & 7 deletions cms/djangoapps/contentstore/tests/test_course_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,6 @@ def test_discussion_fields_available(self, is_pages_and_resources_enabled,
@override_waffle_flag(toggles.LEGACY_STUDIO_EXPORT, True)
@override_waffle_flag(toggles.LEGACY_STUDIO_COURSE_TEAM, True)
@override_waffle_flag(toggles.LEGACY_STUDIO_SCHEDULE_DETAILS, True)
@override_waffle_flag(toggles.LEGACY_STUDIO_GRADING, True)
def test_disable_advanced_settings_feature(self, disable_advanced_settings):
"""
If this feature is enabled, only Django Staff/Superuser should be able to access the "Advanced Settings" page.
Expand All @@ -178,7 +177,7 @@ def test_disable_advanced_settings_feature(self, disable_advanced_settings):

with override_settings(FEATURES={
'DISABLE_ADVANCED_SETTINGS': disable_advanced_settings,
}):
}, COURSE_AUTHORING_MICROFRONTEND_URL='https://mfe.example'):
for handler in (
'import_handler',
'export_handler',
Expand All @@ -190,18 +189,28 @@ def test_disable_advanced_settings_feature(self, disable_advanced_settings):
response = self.non_staff_client.get_html(
get_url(self.course.id, handler)
)
self.assertEqual(response.status_code, 200) # noqa: PT009
# grading_handler is served by the authoring MFE when configured,
# so expect a redirect (302) in that case.
if handler == 'grading_handler':
self.assertEqual(response.status_code, 302) # noqa: PT009
else:
self.assertEqual(response.status_code, 200) # noqa: PT009
if disable_advanced_settings:
self.assertNotIn(advanced_settings_link_html, response.content) # noqa: PT009
if handler != 'grading_handler':
self.assertNotIn(advanced_settings_link_html, response.content) # noqa: PT009
else:
self.assertIn(advanced_settings_link_html, response.content) # noqa: PT009
if handler != 'grading_handler':
self.assertIn(advanced_settings_link_html, response.content) # noqa: PT009

# Test that staff users see the "Advanced Settings" tab link.
response = self.client.get_html(
get_url(self.course.id, handler)
)
self.assertEqual(response.status_code, 200) # noqa: PT009
self.assertIn(advanced_settings_link_html, response.content) # noqa: PT009
if handler == 'grading_handler':
self.assertEqual(response.status_code, 302) # noqa: PT009
else:
self.assertEqual(response.status_code, 200) # noqa: PT009
self.assertIn(advanced_settings_link_html, response.content) # noqa: PT009

# Test that non-staff users can't access the "Advanced Settings" page.
response = self.non_staff_client.get_html(self.course_setting_url)
Expand Down
18 changes: 0 additions & 18 deletions cms/djangoapps/contentstore/toggles.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,24 +216,6 @@ def use_new_advanced_settings_page(course_key):
return not LEGACY_STUDIO_ADVANCED_SETTINGS.is_enabled(course_key)


# .. toggle_name: legacy_studio.grading
# .. toggle_implementation: WaffleFlag
# .. toggle_default: False
# .. toggle_description: Temporarily fall back to the old Studio Course Grading 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_GRADING = CourseWaffleFlag('legacy_studio.grading', __name__)


def use_new_grading_page(course_key):
"""
Returns a boolean if new studio grading mfe is enabled
"""
return not LEGACY_STUDIO_GRADING.is_enabled(course_key)


# .. toggle_name: legacy_studio.import
# .. toggle_implementation: WaffleFlag
Expand Down
12 changes: 4 additions & 8 deletions cms/djangoapps/contentstore/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
use_new_certificates_page,
use_new_course_team_page,
use_new_export_page,
use_new_grading_page,
use_new_group_configurations_page,
use_new_import_page,
use_new_schedule_details_page,
Expand Down Expand Up @@ -330,13 +329,10 @@ def get_grading_url(course_locator) -> str:
"""
Gets course authoring microfrontend URL for grading page view.
"""
grading_url = None
if use_new_grading_page(course_locator):
mfe_base_url = get_course_authoring_url(course_locator)
course_mfe_url = f'{mfe_base_url}/course/{course_locator}/settings/grading'
if mfe_base_url:
grading_url = course_mfe_url
return grading_url
mfe_base_url = get_course_authoring_url(course_locator)
if mfe_base_url:
return f'{mfe_base_url}/course/{course_locator}/settings/grading'
return None


def get_course_team_url(course_locator) -> str:
Expand Down
7 changes: 1 addition & 6 deletions cms/djangoapps/contentstore/views/course.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,12 @@
from ..toggles import (
default_enable_flexible_peer_openassessments,
use_new_advanced_settings_page,
use_new_grading_page,
use_new_group_configurations_page,
use_new_schedule_details_page,
)
from ..utils import (
add_instructor,
get_advanced_settings_url,
get_course_grading,
get_course_outline_url,
get_course_rerun_context,
get_course_settings,
Expand Down Expand Up @@ -1425,10 +1423,7 @@ def grading_handler(request, course_key_string, grader_index=None):
raise PermissionDenied()

if 'text/html' in request.META.get('HTTP_ACCEPT', '') and request.method == 'GET':
if use_new_grading_page(course_key):
return redirect(get_grading_url(course_key))
grading_context = get_course_grading(course_key)
return render_to_response('settings_graders.html', grading_context)
return redirect(get_grading_url(course_key))
elif 'application/json' in request.META.get('HTTP_ACCEPT', ''):
if request.method == 'GET':
if grader_index is None:
Expand Down
18 changes: 13 additions & 5 deletions cms/djangoapps/contentstore/views/tests/test_exam_settings_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
@override_waffle_flag(toggles.LEGACY_STUDIO_CERTIFICATES, True)
@override_waffle_flag(toggles.LEGACY_STUDIO_SCHEDULE_DETAILS, True)
@override_waffle_flag(toggles.LEGACY_STUDIO_CONFIGURATIONS, True)
@override_waffle_flag(toggles.LEGACY_STUDIO_GRADING, True)
@override_waffle_flag(toggles.LEGACY_STUDIO_ADVANCED_SETTINGS, True)
@override_settings(COURSE_AUTHORING_MICROFRONTEND_URL='https://mfe.example')
class TestExamSettingsView(CourseTestCase, UrlResetMixin):
"""
Unit tests for the exam settings view.
Expand Down Expand Up @@ -64,8 +64,12 @@ def test_view_without_exam_settings_enabled(self, handler):
"""
outline_url = reverse_course_url(handler, self.course.id)
resp = self.client.get(outline_url, HTTP_ACCEPT='text/html')
self.assertEqual(resp.status_code, 200) # noqa: PT009
self.assertNotContains(resp, 'Proctored Exam Settings')
# grading_handler is routed to the authoring MFE and returns a redirect.
if handler == 'grading_handler':
self.assertEqual(resp.status_code, 302) # noqa: PT009
else:
self.assertEqual(resp.status_code, 200) # noqa: PT009
self.assertNotContains(resp, 'Proctored Exam Settings')

@ddt.data(
"certificates_list_handler",
Expand All @@ -81,8 +85,12 @@ def test_view_with_exam_settings_enabled(self, handler):
"""
outline_url = reverse_course_url(handler, self.course.id)
resp = self.client.get(outline_url, HTTP_ACCEPT='text/html')
self.assertEqual(resp.status_code, 200) # noqa: PT009
self.assertContains(resp, 'Proctored Exam Settings')
# grading_handler is routed to the authoring MFE and returns a redirect.
if handler == 'grading_handler':
self.assertEqual(resp.status_code, 302) # noqa: PT009
else:
self.assertEqual(resp.status_code, 200) # noqa: PT009
self.assertContains(resp, 'Proctored Exam Settings')

@override_settings(
PROCTORING_BACKENDS={
Expand Down
3 changes: 1 addition & 2 deletions cms/static/cms/js/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@
'js/factories/manage_users',
'js/factories/outline',
'js/factories/settings',
'js/factories/settings_advanced',
'js/factories/settings_graders'
'js/factories/settings_advanced'
]),
/**
* By default all the configuration for optimization happens from the command
Expand Down
27 changes: 0 additions & 27 deletions cms/static/js/factories/settings_graders.js

This file was deleted.

Loading
Loading