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
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,7 @@ def get_use_new_certificates_page(self, obj):
"""
Method to get the use_new_certificates_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_certificates_page(course_key)
return True

def get_use_new_textbooks_page(self, obj):
"""
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 @@ -346,24 +346,6 @@ def use_new_course_team_page(course_key):
return not LEGACY_STUDIO_COURSE_TEAM.is_enabled(course_key)


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


def use_new_certificates_page(course_key):
"""
Returns a boolean if new studio certificates mfe is enabled
"""
return not LEGACY_STUDIO_CERTIFICATES.is_enabled(course_key)


# .. toggle_name: legacy_studio.configurations
# .. 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 @@ -42,7 +42,6 @@
libraries_v2_enabled,
split_library_view_on_dashboard,
use_new_advanced_settings_page,
use_new_certificates_page,
use_new_course_team_page,
use_new_export_page,
use_new_grading_page,
Expand Down Expand Up @@ -470,13 +469,10 @@ def get_certificates_url(course_locator) -> str:
"""
Gets course authoring microfrontend URL for certificates page view.
"""
certificates_url = None
if use_new_certificates_page(course_locator):
mfe_base_url = get_course_authoring_url(course_locator)
course_mfe_url = f'{mfe_base_url}/course/{course_locator}/certificates'
if mfe_base_url:
certificates_url = course_mfe_url
return certificates_url
mfe_base_url = get_course_authoring_url(course_locator)
if mfe_base_url:
return f'{mfe_base_url}/course/{course_locator}/certificates'
return ''


def get_textbooks_url(course_locator) -> str:
Expand Down
9 changes: 2 additions & 7 deletions cms/djangoapps/contentstore/views/certificates.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,14 @@

from cms.djangoapps.contentstore.views.permissions import HasStudioWriteAccess
from cms.djangoapps.contentstore.views.serializers import CertificateActivationSerializer, CertificateSerializer
from common.djangoapps.edxmako.shortcuts import render_to_response
from common.djangoapps.student.auth import has_studio_write_access
from common.djangoapps.student.roles import GlobalStaff
from common.djangoapps.util.json_request import JsonResponse
from openedx.core.lib.api.view_utils import DeveloperErrorViewMixin
from xmodule.modulestore import EdxJSONEncoder # lint-amnesty, pylint: disable=wrong-import-order
from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order

from ..toggles import use_new_certificates_page
from ..utils import get_certificates_context, get_certificates_url, reverse_course_url
from ..utils import get_certificates_url, reverse_course_url
from .certificate_manager import CertificateManager, CertificateValidationError

CERTIFICATE_MINIMUM_ID = 100
Expand Down Expand Up @@ -143,10 +141,7 @@ def certificates_list_handler(request, course_key_string):
return JsonResponse({"error": msg}, status=403)

if 'text/html' in request.META.get('HTTP_ACCEPT', 'text/html'):
if use_new_certificates_page(course_key):
return redirect(get_certificates_url(course_key))
certificates_context = get_certificates_context(course, request.user)
return render_to_response('certificates.html', certificates_context)
return redirect(get_certificates_url(course_key))
elif "application/json" in request.META.get('HTTP_ACCEPT'):
# Retrieve the list of certificates for the specified course
if request.method == 'GET':
Expand Down
79 changes: 1 addition & 78 deletions cms/djangoapps/contentstore/views/tests/test_certificates.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,12 @@

import itertools
import json
from unittest import mock

import ddt
from django.conf import settings
from django.test.utils import override_settings
from edx_toggles.toggles.testutils import override_waffle_flag
from opaque_keys.edx.keys import AssetKey

from cms.djangoapps.contentstore import toggles
from cms.djangoapps.contentstore.tests.utils import CourseTestCase
from cms.djangoapps.contentstore.utils import get_lms_link_for_certificate_web_view, reverse_course_url
from common.djangoapps.course_modes.tests.factories import CourseModeFactory
Expand Down Expand Up @@ -277,11 +274,9 @@ def test_lms_link_for_certificate_web_view(self):
)
self.assertEqual(link, test_url) # noqa: PT009

@override_waffle_flag(toggles.LEGACY_STUDIO_CERTIFICATES, True)
@mock.patch.dict('django.conf.settings.FEATURES', {'CERTIFICATES_HTML_VIEW': True})
def test_certificate_info_in_response(self):
"""
Test that certificate has been created and rendered properly with non-audit course mode.
Test that a created certificate is returned in the JSON GET response.
"""
CourseModeFactory.create(course_id=self.course.id, mode_slug='verified')
response = self.client.ajax_post(
Expand All @@ -291,36 +286,13 @@ def test_certificate_info_in_response(self):

self.assertEqual(response.status_code, 201) # noqa: PT009

# in html response
result = self.client.get_html(self._url())
self.assertContains(result, 'Test certificate')
self.assertContains(result, 'Test description')

# in JSON response
response = self.client.get_json(self._url())
data = json.loads(response.content.decode('utf-8'))
self.assertEqual(len(data), 1) # noqa: PT009
self.assertEqual(data[0]['name'], 'Test certificate') # noqa: PT009
self.assertEqual(data[0]['description'], 'Test description') # noqa: PT009
self.assertEqual(data[0]['version'], CERTIFICATE_SCHEMA_VERSION) # noqa: PT009

@mock.patch.dict('django.conf.settings.FEATURES', {'CERTIFICATES_HTML_VIEW': True})
@override_waffle_flag(toggles.LEGACY_STUDIO_CERTIFICATES, True)
def test_certificate_info_not_in_response(self):
"""
Test that certificate has not been rendered audit only course mode.
"""
response = self.client.ajax_post(
self._url(),
data=CERTIFICATE_JSON_WITH_SIGNATORIES
)

self.assertEqual(response.status_code, 201) # noqa: PT009

# in html response
result = self.client.get_html(self._url())
self.assertNotContains(result, 'Test certificate')

def test_unsupported_http_accept_header(self):
"""
Test if not allowed header present in request.
Expand Down Expand Up @@ -350,55 +322,6 @@ def test_not_permitted(self):
)
self.assertContains(response, "error", status_code=403)

@override_waffle_flag(toggles.LEGACY_STUDIO_CERTIFICATES, True)
def test_audit_course_mode_is_skipped(self):
"""
Tests audit course mode is skipped when rendering certificates page.
"""
CourseModeFactory.create(course_id=self.course.id)
CourseModeFactory.create(course_id=self.course.id, mode_slug='verified')
response = self.client.get_html(
self._url(),
)
self.assertEqual(response.status_code, 200) # noqa: PT009
self.assertContains(response, 'verified')
self.assertNotContains(response, 'audit')

@override_waffle_flag(toggles.LEGACY_STUDIO_CERTIFICATES, True)
def test_audit_only_disables_cert(self):
"""
Tests audit course mode is skipped when rendering certificates page.
"""
CourseModeFactory.create(course_id=self.course.id, mode_slug='audit')
response = self.client.get_html(
self._url(),
)
self.assertEqual(response.status_code, 200) # noqa: PT009
self.assertContains(response, 'This course does not use a mode that offers certificates.')
self.assertNotContains(response, 'This module is not enabled.')
self.assertNotContains(response, 'Loading')

@ddt.data(
['audit', 'verified'],
['verified'],
['audit', 'verified', 'credit'],
['verified', 'credit'],
['professional']
)
@override_waffle_flag(toggles.LEGACY_STUDIO_CERTIFICATES, True)
def test_non_audit_enables_cert(self, slugs):
"""
Tests audit course mode is skipped when rendering certificates page.
"""
for slug in slugs:
CourseModeFactory.create(course_id=self.course.id, mode_slug=slug)
response = self.client.get_html(
self._url(),
)
self.assertEqual(response.status_code, 200) # noqa: PT009
self.assertNotContains(response, 'This course does not use a mode that offers certificates.')
self.assertNotContains(response, 'This module is not enabled.')
self.assertContains(response, 'Loading')

def test_assign_unique_identifier_to_certificates(self):
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
"ENABLE_PROCTORED_EXAMS": True,
},
)
@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)
Expand All @@ -51,7 +50,6 @@ def _get_exam_settings_alert_text(raw_html_content):

@override_waffle_flag(toggles.LEGACY_STUDIO_EXAM_SETTINGS, True)
@ddt.data(
"certificates_list_handler",
"settings_handler",
"group_configurations_list_handler",
"grading_handler",
Expand All @@ -68,7 +66,6 @@ def test_view_without_exam_settings_enabled(self, handler):
self.assertNotContains(resp, 'Proctored Exam Settings')

@ddt.data(
"certificates_list_handler",
"settings_handler",
"group_configurations_list_handler",
"grading_handler",
Expand Down
1 change: 0 additions & 1 deletion cms/static/cms/js/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
'js/factories/course_create_rerun',
'js/factories/export',
'js/factories/group_configurations',
'js/certificates/factories/certificates_page_factory',
'js/factories/index',
'js/factories/manage_users',
'js/factories/outline',
Expand Down
50 changes: 0 additions & 50 deletions cms/static/js/certificates/factories/certificates_page_factory.js

This file was deleted.

Loading
Loading