waffle flag - test_settings.show_review_rules
To toggle proctored exam advanced settings waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings acceptance testing update. waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings acceptance testing update. waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings acceptance testing update. waffle flag - studio.show_review_rules To toggle proctored exam advanced settings acceptance testing update. Added CR comments - moved UI vis toggle to template instead of js. Moved waffle flag to waffle.py waffle flag - studio.show_review_rules To toggle proctored exam advanced settings acceptance testing update. Added CR comments - moved UI vis toggle to template instead of js. Moved waffle flag to waffle.py waffle flag - studio.show_review_rules To toggle proctored exam advanced settings acceptance testing update. Added CR comments - moved UI vis toggle to template instead of js. Moved waffle flag to waffle.py Updated JS UT and acceptance Move common/djangoapps/enrollment to openedx/core/djangoapps/enrollments Fix Pylint for enrollments README for enrollments app Move command arguments to common settings Move command parameter arguments, resend-days and days-range, to common settings. This will help in creating a consistency when the default values are changed in the future. LEARNER-7313 Bumped edx-enterprise version and added cornerstone app Updating Bokchoy testing database cache (#20713) complete waiting enrollments. fixed Remove microsites from user_authn DEPR-30 Remove microsites from certificates DEPR-26 Remove microsites from shoppingcart DEPR-27 Updating Bokchoy testing database cache (#20715) add arch decision of computation of course-user discount Mark missing string for internationalization Remove microsites from static_template_view DEPR-28 README for commerce and shoppingcart README for certificates README for course_experience geoip2: update maxmind geolite country database user existence check updated to use email only Bumped edx-when Use our fork of this repo instead of the mitocw one. Make platform bootstrap footer match other footer Changes: - Add logo back - Fix up spacing - Change font sizes and color Mark alt text for translation waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings acceptance testing update. waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings acceptance testing update. waffle flag - test_settings.show_review_rules To toggle proctored exam advanced settings acceptance testing update. waffle flag - studio.show_review_rules To toggle proctored exam advanced settings acceptance testing update. Added CR comments - moved UI vis toggle to template instead of js. Moved waffle flag to waffle.py waffle flag - studio.show_review_rules To toggle proctored exam advanced settings acceptance testing update. Added CR comments - moved UI vis toggle to template instead of js. Moved waffle flag to waffle.py waffle flag - studio.show_review_rules To toggle proctored exam advanced settings acceptance testing update. Added CR comments - moved UI vis toggle to template instead of js. Moved waffle flag to waffle.py Updated JS UT and acceptance Move common/djangoapps/enrollment to openedx/core/djangoapps/enrollments Fix Pylint for enrollments README for enrollments app Move command arguments to common settings Move command parameter arguments, resend-days and days-range, to common settings. This will help in creating a consistency when the default values are changed in the future. LEARNER-7313 Bumped edx-enterprise version and added cornerstone app Updating Bokchoy testing database cache (#20713) complete waiting enrollments. fixed Remove microsites from user_authn DEPR-30 Remove microsites from certificates DEPR-26 Remove microsites from shoppingcart DEPR-27 Updating Bokchoy testing database cache (#20715) add arch decision of computation of course-user discount Mark missing string for internationalization Remove microsites from static_template_view DEPR-28 README for commerce and shoppingcart README for certificates README for course_experience geoip2: update maxmind geolite country database user existence check updated to use email only Bumped edx-when Use our fork of this repo instead of the mitocw one. Make platform bootstrap footer match other footer Changes: - Add logo back - Fix up spacing - Change font sizes and color Mark alt text for translation
This commit is contained in:
@@ -36,3 +36,9 @@ ENABLE_CHECKLISTS_QUALITY = CourseWaffleFlag(
|
||||
flag_name=u'enable_checklists_quality',
|
||||
flag_undefined_default=True
|
||||
)
|
||||
|
||||
SHOW_REVIEW_RULES_FLAG = CourseWaffleFlag(
|
||||
waffle_namespace=waffle_flags(),
|
||||
flag_name=u'show_review_rules',
|
||||
flag_undefined_default=False
|
||||
)
|
||||
|
||||
@@ -69,6 +69,7 @@ from xmodule.services import ConfigurationService, SettingsService
|
||||
from xmodule.tabs import CourseTabList
|
||||
from xmodule.x_module import DEPRECATION_VSCOMPAT_EVENT, PREVIEW_VIEWS, STUDENT_VIEW, STUDIO_VIEW
|
||||
from edx_proctoring.api import get_exam_configuration_dashboard_url, does_backend_support_onboarding
|
||||
from cms.djangoapps.contentstore.config.waffle import SHOW_REVIEW_RULES_FLAG
|
||||
|
||||
__all__ = [
|
||||
'orphan_handler', 'xblock_handler', 'xblock_view_handler', 'xblock_outline_handler', 'xblock_container_handler'
|
||||
@@ -1218,7 +1219,7 @@ def create_xblock_info(xblock, data=None, metadata=None, include_ancestor_info=F
|
||||
xblock_info.update({
|
||||
'enable_proctored_exams': xblock.enable_proctored_exams,
|
||||
'create_zendesk_tickets': xblock.create_zendesk_tickets,
|
||||
'enable_timed_exams': xblock.enable_timed_exams
|
||||
'enable_timed_exams': xblock.enable_timed_exams,
|
||||
})
|
||||
elif xblock.category == 'sequential':
|
||||
rules_url = settings.PROCTORING_SETTINGS.get('LINK_URLS', {}).get('online_proctoring_rules', "")
|
||||
@@ -1239,6 +1240,7 @@ def create_xblock_info(xblock, data=None, metadata=None, include_ancestor_info=F
|
||||
'default_time_limit_minutes': xblock.default_time_limit_minutes,
|
||||
'proctoring_exam_configuration_link': proctoring_exam_configuration_link,
|
||||
'supports_onboarding': supports_onboarding,
|
||||
'show_review_rules': SHOW_REVIEW_RULES_FLAG.is_enabled(xblock.location.course_key),
|
||||
})
|
||||
|
||||
# Update with gating info
|
||||
|
||||
@@ -14,7 +14,7 @@ describe('CourseOutlinePage', function() {
|
||||
selectVisibilitySettings, selectAdvancedSettings, createMockCourseJSON, createMockSectionJSON,
|
||||
createMockSubsectionJSON, verifyTypePublishable, mockCourseJSON, mockEmptyCourseJSON, setSelfPaced,
|
||||
mockSingleSectionCourseJSON, createMockVerticalJSON, createMockIndexJSON, mockCourseEntranceExamJSON,
|
||||
selectOnboardingExam,
|
||||
selectOnboardingExam, createMockCourseJSONWithReviewRules,mockCourseJSONWithReviewRules,
|
||||
mockOutlinePage = readFixtures('templates/mock/mock-course-outline-page.underscore'),
|
||||
mockRerunNotification = readFixtures('templates/mock/mock-course-rerun-notification.underscore');
|
||||
|
||||
@@ -44,6 +44,33 @@ describe('CourseOutlinePage', function() {
|
||||
}, options, {child_info: {children: children}});
|
||||
};
|
||||
|
||||
createMockCourseJSONWithReviewRules = function(options, children) {
|
||||
return $.extend(true, {}, {
|
||||
id: 'mock-course',
|
||||
display_name: 'Mock Course',
|
||||
category: 'course',
|
||||
enable_proctored_exams: true,
|
||||
enable_timed_exams: true,
|
||||
studio_url: '/course/slashes:MockCourse',
|
||||
is_container: true,
|
||||
has_changes: false,
|
||||
published: true,
|
||||
edited_on: 'Jul 02, 2014 at 20:56 UTC',
|
||||
edited_by: 'MockUser',
|
||||
has_explicit_staff_lock: false,
|
||||
child_info: {
|
||||
category: 'chapter',
|
||||
display_name: 'Section',
|
||||
children: []
|
||||
},
|
||||
user_partitions: [],
|
||||
show_review_rules: true,
|
||||
user_partition_info: {},
|
||||
highlights_enabled: true,
|
||||
highlights_enabled_for_messaging: false
|
||||
}, options, {child_info: {children: children}});
|
||||
};
|
||||
|
||||
createMockSectionJSON = function(options, children) {
|
||||
return $.extend(true, {}, {
|
||||
id: 'mock-section',
|
||||
@@ -281,6 +308,13 @@ describe('CourseOutlinePage', function() {
|
||||
])
|
||||
])
|
||||
]);
|
||||
mockCourseJSONWithReviewRules = createMockCourseJSONWithReviewRules({}, [
|
||||
createMockSectionJSON({}, [
|
||||
createMockSubsectionJSON({}, [
|
||||
createMockVerticalJSON()
|
||||
])
|
||||
])
|
||||
]);
|
||||
mockEmptyCourseJSON = createMockCourseJSON();
|
||||
mockSingleSectionCourseJSON = createMockCourseJSON({}, [
|
||||
createMockSectionJSON()
|
||||
@@ -987,7 +1021,7 @@ describe('CourseOutlinePage', function() {
|
||||
var getDisplayNameWrapper, setEditModalValues, setContentVisibility, mockServerValuesJson,
|
||||
selectDisableSpecialExams, selectTimedExam, selectProctoredExam, selectPracticeExam,
|
||||
selectPrerequisite, selectLastPrerequisiteSubsection, checkOptionFieldVisibility,
|
||||
defaultModalSettings, getMockNoPrereqOrExamsCourseJSON, expectShowCorrectness;
|
||||
defaultModalSettings, modalSettingsWithExamReviewRules, getMockNoPrereqOrExamsCourseJSON, expectShowCorrectness;
|
||||
|
||||
getDisplayNameWrapper = function() {
|
||||
return getItemHeaders('subsection').find('.wrapper-xblock-field');
|
||||
@@ -1075,7 +1109,19 @@ describe('CourseOutlinePage', function() {
|
||||
due: null,
|
||||
is_practice_exam: false,
|
||||
is_time_limited: false,
|
||||
exam_review_rules: '',
|
||||
is_proctored_enabled: false,
|
||||
default_time_limit_minutes: null,
|
||||
is_onboarding_exam: false
|
||||
}
|
||||
};
|
||||
|
||||
modalSettingsWithExamReviewRules = {
|
||||
graderType: 'notgraded',
|
||||
isPrereq: false,
|
||||
metadata: {
|
||||
due: null,
|
||||
is_practice_exam: false,
|
||||
is_time_limited: false,
|
||||
is_proctored_enabled: false,
|
||||
default_time_limit_minutes: null,
|
||||
is_onboarding_exam: false
|
||||
@@ -1277,7 +1323,6 @@ describe('CourseOutlinePage', function() {
|
||||
visible_to_staff_only: null,
|
||||
start: '2014-07-09T00:00:00.000Z',
|
||||
due: '2014-07-10T00:00:00.000Z',
|
||||
exam_review_rules: '',
|
||||
is_time_limited: true,
|
||||
is_practice_exam: false,
|
||||
is_proctored_enabled: false,
|
||||
@@ -1320,6 +1365,14 @@ describe('CourseOutlinePage', function() {
|
||||
expectShowCorrectness('never');
|
||||
});
|
||||
|
||||
it('review rules exists', function() {
|
||||
createCourseOutlinePage(this, mockCourseJSONWithReviewRules, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
$('.wrapper-modal-window .action-save').click();
|
||||
AjaxHelpers.expectJsonRequest(requests, 'POST', '/xblock/mock-subsection', modalSettingsWithExamReviewRules);
|
||||
expect(requests[0].requestHeaders['X-HTTP-Method-Override']).toBe('PATCH');
|
||||
});
|
||||
|
||||
it('can hide time limit and hide after due fields when the None radio box is selected', function() {
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
@@ -1363,6 +1416,7 @@ describe('CourseOutlinePage', function() {
|
||||
is_proctored_exam: true,
|
||||
default_time_limit_minutes: 150,
|
||||
supports_onboarding: true,
|
||||
show_review_rules: true
|
||||
}, [
|
||||
])
|
||||
])
|
||||
@@ -1452,7 +1506,26 @@ describe('CourseOutlinePage', function() {
|
||||
});
|
||||
|
||||
it('can select the Proctored exam option', function() {
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
var mockCourseWithSpecialExamJSON = createMockCourseJSON({}, [
|
||||
createMockSectionJSON({
|
||||
has_changes: true,
|
||||
enable_proctored_exams: true,
|
||||
enable_timed_exams: true
|
||||
|
||||
}, [
|
||||
createMockSubsectionJSON({
|
||||
has_changes: true,
|
||||
is_time_limited: true,
|
||||
is_practice_exam: true,
|
||||
is_proctored_exam: true,
|
||||
default_time_limit_minutes: 150,
|
||||
supports_onboarding: false,
|
||||
show_review_rules: true,
|
||||
}, [
|
||||
])
|
||||
])
|
||||
]);
|
||||
createCourseOutlinePage(this, mockCourseWithSpecialExamJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
setEditModalValues('7/9/2014', '7/10/2014', 'Lab');
|
||||
selectVisibilitySettings();
|
||||
|
||||
@@ -47,30 +47,33 @@
|
||||
</label>
|
||||
<p class='field-message' id='time-limit-description'><%- gettext('Select a time allotment for the exam. If it is over 24 hours, type in the amount of time. You can grant individual learners extra time to complete the exam through the Instructor Dashboard.') %></p>
|
||||
</div>
|
||||
<div class="field field-text field-exam-review-rules">
|
||||
<label class="label">
|
||||
<%- gettext('Review Rules') %>
|
||||
<textarea cols="50" maxlength="255" aria-describedby="review-rules-description"
|
||||
class="review-rules input input-text" autocomplete="off" />
|
||||
</label>
|
||||
<% var online_proctoring_rules = xblockInfo.get('online_proctoring_rules'); %>
|
||||
<p class='field-message' id='review-rules-description'>
|
||||
<% if (online_proctoring_rules) { %>
|
||||
<% // xss-lint: disable=underscore-not-escaped %>
|
||||
<%= edx.HtmlUtils.interpolateHtml(
|
||||
gettext('Specify any rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed. These specified rules are visible to learners before the learners start the exam, along with the {linkStart}general proctored exam rules{linkEnd}.'),
|
||||
{
|
||||
linkStart: edx.HtmlUtils.interpolateHtml(
|
||||
edx.HtmlUtils.HTML('<a href="{onlineProctoringUrl}" title="{onlineProctoringTitle}">'),
|
||||
{ onlineProctoringUrl: online_proctoring_rules, onlineProctoringTitle: gettext('General Proctored Exam Rules')}),
|
||||
linkEnd: edx.HtmlUtils.HTML('</a>')
|
||||
})
|
||||
%>
|
||||
<% } else { %>
|
||||
<%- gettext('Specify any rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed. These specified rules are visible to learners before the learners start the exam.') %>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
<% var show_review_rules = xblockInfo.get('show_review_rules'); %>
|
||||
<% if (show_review_rules) { %>
|
||||
<div class="field field-text field-exam-review-rules">
|
||||
<label class="label">
|
||||
<%- gettext('Review Rules') %>
|
||||
<textarea cols="50" maxlength="255" aria-describedby="review-rules-description"
|
||||
class="review-rules input input-text" autocomplete="off" />
|
||||
</label>
|
||||
<% var online_proctoring_rules = xblockInfo.get('online_proctoring_rules'); %>
|
||||
<p class='field-message' id='review-rules-description'>
|
||||
<% if (online_proctoring_rules) { %>
|
||||
<% // xss-lint: disable=underscore-not-escaped %>
|
||||
<%= edx.HtmlUtils.interpolateHtml(
|
||||
gettext('Specify any rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed. These specified rules are visible to learners before the learners start the exam, along with the {linkStart}general proctored exam rules{linkEnd}.'),
|
||||
{
|
||||
linkStart: edx.HtmlUtils.interpolateHtml(
|
||||
edx.HtmlUtils.HTML('<a href="{onlineProctoringUrl}" title="{onlineProctoringTitle}">'),
|
||||
{ onlineProctoringUrl: online_proctoring_rules, onlineProctoringTitle: gettext('General Proctored Exam Rules')}),
|
||||
linkEnd: edx.HtmlUtils.HTML('</a>')
|
||||
})
|
||||
%>
|
||||
<% } else { %>
|
||||
<%- gettext('Specify any rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed. These specified rules are visible to learners before the learners start the exam.') %>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -154,6 +154,9 @@ class ProctoredExamTest(UniqueCourseTest):
|
||||
course_fix.add_advanced_settings({
|
||||
"enable_proctored_exams": {"value": "true"}
|
||||
})
|
||||
course_fix.add_advanced_settings({
|
||||
"show_review_rules": {"value": "true"}
|
||||
})
|
||||
|
||||
course_fix.add_children(
|
||||
XBlockFixtureDesc('chapter', 'Test Section 1').add_children(
|
||||
@@ -333,7 +336,6 @@ class ProctoredExamTest(UniqueCourseTest):
|
||||
|
||||
self.studio_course_outline.select_proctored_exam()
|
||||
self.assertTrue(self.studio_course_outline.time_allotted_field_visible())
|
||||
self.assertTrue(self.studio_course_outline.exam_review_rules_field_visible())
|
||||
|
||||
self.studio_course_outline.select_practice_exam()
|
||||
self.assertTrue(self.studio_course_outline.time_allotted_field_visible())
|
||||
|
||||
Reference in New Issue
Block a user