From 90d6b18711e47dfb3c64952dbb1829a297d2db95 Mon Sep 17 00:00:00 2001
From: alangsto <46360176+alangsto@users.noreply.github.com>
Date: Thu, 9 Jul 2020 10:13:18 -0400
Subject: [PATCH] Add link to exam settings page from studio (#24405)
* testing
* updates to drop down
* unit tests. env changes were copied based on other MFEs in LMS
* added exam settings link to other course settings pages
* fixed pylint errors
* updates for requested changes
* updates for requested changes, as well as changes for xss linter
---
.../views/tests/test_exam_settings_view.py | 72 +++++++++++++++++++
.../views/tests/test_header_menu.py | 28 ++++++++
cms/envs/common.py | 3 +
cms/envs/test.py | 2 +
cms/templates/certificates.html | 6 ++
cms/templates/group_configurations.html | 6 ++
cms/templates/settings.html | 6 ++
cms/templates/settings_advanced.html | 6 ++
cms/templates/settings_graders.html | 13 +++-
cms/templates/widgets/header.html | 8 +++
10 files changed, 147 insertions(+), 3 deletions(-)
create mode 100644 cms/djangoapps/contentstore/views/tests/test_exam_settings_view.py
diff --git a/cms/djangoapps/contentstore/views/tests/test_exam_settings_view.py b/cms/djangoapps/contentstore/views/tests/test_exam_settings_view.py
new file mode 100644
index 0000000000..adca08d9ab
--- /dev/null
+++ b/cms/djangoapps/contentstore/views/tests/test_exam_settings_view.py
@@ -0,0 +1,72 @@
+#-*- coding: utf-8 -*-
+
+"""
+Exam Settings View Tests
+"""
+
+import ddt
+
+from django.conf import settings
+from django.test.utils import override_settings
+
+from contentstore.tests.utils import CourseTestCase
+from contentstore.utils import reverse_course_url
+from util.testing import UrlResetMixin
+
+FEATURES_WITH_CERTS_ENABLED = settings.FEATURES.copy()
+FEATURES_WITH_CERTS_ENABLED['CERTIFICATES_HTML_VIEW'] = True
+
+FEATURES_WITH_EXAM_SETTINGS_ENABLED = FEATURES_WITH_CERTS_ENABLED.copy()
+FEATURES_WITH_EXAM_SETTINGS_ENABLED['ENABLE_EXAM_SETTINGS_HTML_VIEW'] = True
+
+FEATURES_WITH_EXAM_SETTINGS_DISABLED = FEATURES_WITH_CERTS_ENABLED.copy()
+FEATURES_WITH_EXAM_SETTINGS_DISABLED['ENABLE_EXAM_SETTINGS_HTML_VIEW'] = False
+
+
+@ddt.ddt
+class TestExamSettingsView(CourseTestCase, UrlResetMixin):
+ """
+ Unit tests for the exam settings view.
+ """
+ def setUp(self):
+ """
+ Set up the for the exam settings view tests.
+ """
+ super(TestExamSettingsView, self).setUp()
+ self.reset_urls()
+
+ @override_settings(FEATURES=FEATURES_WITH_EXAM_SETTINGS_DISABLED)
+ @ddt.data(
+ "certificates_list_handler",
+ "settings_handler",
+ "group_configurations_list_handler",
+ "grading_handler",
+ "advanced_settings_handler"
+ )
+ def test_view_without_exam_settings_enabled(self, handler):
+ """
+ Tests pages should not have `Exam Settings` item
+ if course does not have the Exam Settings view enabled.
+ """
+ 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)
+ self.assertNotContains(resp, 'Proctored Exam Settings')
+
+ @override_settings(FEATURES=FEATURES_WITH_EXAM_SETTINGS_ENABLED)
+ @ddt.data(
+ "certificates_list_handler",
+ "settings_handler",
+ "group_configurations_list_handler",
+ "grading_handler",
+ "advanced_settings_handler"
+ )
+ def test_view_with_exam_settings_enabled(self, handler):
+ """
+ Tests pages should have `Exam Settings` item
+ if course does have Exam Settings view enabled.
+ """
+ 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)
+ self.assertContains(resp, 'Proctored Exam Settings')
diff --git a/cms/djangoapps/contentstore/views/tests/test_header_menu.py b/cms/djangoapps/contentstore/views/tests/test_header_menu.py
index 1109327910..c2b00f3063 100644
--- a/cms/djangoapps/contentstore/views/tests/test_header_menu.py
+++ b/cms/djangoapps/contentstore/views/tests/test_header_menu.py
@@ -15,6 +15,12 @@ from util.testing import UrlResetMixin
FEATURES_WITH_CERTS_ENABLED = settings.FEATURES.copy()
FEATURES_WITH_CERTS_ENABLED['CERTIFICATES_HTML_VIEW'] = True
+FEATURES_WITH_EXAM_SETTINGS_ENABLED = settings.FEATURES.copy()
+FEATURES_WITH_EXAM_SETTINGS_ENABLED['ENABLE_EXAM_SETTINGS_HTML_VIEW'] = True
+
+FEATURES_WITH_EXAM_SETTINGS_DISABLED = settings.FEATURES.copy()
+FEATURES_WITH_EXAM_SETTINGS_DISABLED['ENABLE_EXAM_SETTINGS_HTML_VIEW'] = False
+
@override_settings(FEATURES=FEATURES_WITH_CERTS_ENABLED)
class TestHeaderMenu(CourseTestCase, UrlResetMixin):
@@ -49,3 +55,25 @@ class TestHeaderMenu(CourseTestCase, UrlResetMixin):
resp = self.client.get(outline_url, HTTP_ACCEPT='text/html')
self.assertEqual(resp.status_code, 200)
self.assertContains(resp, '
')
+
+ @override_settings(FEATURES=FEATURES_WITH_EXAM_SETTINGS_DISABLED)
+ def test_header_menu_without_exam_settings_enabled(self):
+ """
+ Tests course header menu should not have `Exam Settings` menu item
+ if course does not have the Exam Settings view enabled.
+ """
+ outline_url = reverse_course_url('course_handler', self.course.id)
+ resp = self.client.get(outline_url, HTTP_ACCEPT='text/html')
+ self.assertEqual(resp.status_code, 200)
+ self.assertNotContains(resp, '
')
+
+ @override_settings(FEATURES=FEATURES_WITH_EXAM_SETTINGS_ENABLED)
+ def test_header_menu_with_exam_settings_enabled(self):
+ """
+ Tests course header menu should have `Exam Settings` menu item
+ if course does have Exam Settings view enabled.
+ """
+ outline_url = reverse_course_url('course_handler', self.course.id)
+ resp = self.client.get(outline_url, HTTP_ACCEPT='text/html')
+ self.assertEqual(resp.status_code, 200)
+ self.assertContains(resp, '
')
diff --git a/cms/envs/common.py b/cms/envs/common.py
index 11dc5dd9cc..c495596554 100644
--- a/cms/envs/common.py
+++ b/cms/envs/common.py
@@ -412,6 +412,9 @@ ENABLE_JASMINE = False
# IDA for which the social auth flow uses DOT (Django OAuth Toolkit).
IDA_LOGOUT_URI_LIST = []
+############################# MICROFRONTENDS ###################################
+COURSE_AUTHORING_MICROFRONTEND_URL = None
+
############################# SOCIAL MEDIA SHARING #############################
SOCIAL_SHARING_SETTINGS = {
# Note: Ensure 'CUSTOM_COURSE_URLS' has a matching value in lms/envs/common.py
diff --git a/cms/envs/test.py b/cms/envs/test.py
index ff22d4134a..fcfd77b6d6 100644
--- a/cms/envs/test.py
+++ b/cms/envs/test.py
@@ -135,6 +135,8 @@ LMS_BASE = "localhost:8000"
LMS_ROOT_URL = "http://{}".format(LMS_BASE)
FEATURES['PREVIEW_LMS_BASE'] = "preview.localhost"
+COURSE_AUTHORING_MICROFRONTEND_URL = "http://course-authoring-mfe/"
+
CACHES = {
# This is the cache used for most things. Askbot will not work without a
# functioning cache -- it relies on caching to load its settings in places.
diff --git a/cms/templates/certificates.html b/cms/templates/certificates.html
index 13792d216b..43dbb5bdde 100644
--- a/cms/templates/certificates.html
+++ b/cms/templates/certificates.html
@@ -106,6 +106,9 @@ CMS.User.isGlobalStaff = '${is_global_staff | n, js_escaped_string}'=='True' ? t
grading_url = utils.reverse_course_url('grading_handler', context_course.id)
course_team_url = utils.reverse_course_url('course_team_handler', context_course.id)
advanced_settings_url = utils.reverse_course_url('advanced_settings_handler', context_course.id)
+ exams_url = ''
+ if settings.FEATURES.get('ENABLE_EXAM_SETTINGS_HTML_VIEW'):
+ exams_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL
%>