Merge pull request #21689 from edx/mikix/show-upgrade-deadline

Show Upgrade Deadline in Studio
This commit is contained in:
Michael Terry
2019-09-17 15:31:51 -04:00
committed by GitHub
5 changed files with 60 additions and 5 deletions

View File

@@ -22,6 +22,7 @@ from pytz import UTC
from contentstore.config.waffle import ENABLE_PROCTORING_PROVIDER_OVERRIDES
from contentstore.utils import reverse_course_url, reverse_usage_url
from course_modes.models import CourseMode
from models.settings.course_grading import GRADING_POLICY_CHANGED_EVENT_TYPE, CourseGradingModel, hash_grading_policy
from models.settings.course_metadata import CourseMetadata
from models.settings.encoder import CourseSettingsEncoder
@@ -179,6 +180,29 @@ class CourseDetailsViewTest(CourseTestCase, MilestonesTestCaseMixin):
elif field in encoded and encoded[field] is not None:
self.fail(field + " included in encoding but missing from details at " + context)
@ddt.data(
(False, False),
(True, False),
(True, True),
)
@ddt.unpack
def test_upgrade_deadline(self, has_verified_mode, has_expiration_date):
if has_verified_mode:
deadline = None
if has_expiration_date:
deadline = self.course.start + datetime.timedelta(days=2)
CourseMode.objects.get_or_create(
course_id=self.course.id,
mode_display_name="Verified",
mode_slug="verified",
min_price=1,
_expiration_datetime=deadline,
)
settings_details_url = get_url(self.course.id)
response = self.client.get_html(settings_details_url)
self.assertEqual("Upgrade Deadline Date" in response.content, has_expiration_date and has_verified_mode)
@mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True})
def test_pre_requisite_course_list_present(self):
settings_details_url = get_url(self.course.id)

View File

@@ -54,6 +54,7 @@ from contentstore.views.entrance_exam import create_entrance_exam, delete_entran
from course_action_state.managers import CourseActionStateItemNotFoundError
from course_action_state.models import CourseRerunState, CourseRerunUIStateManager
from course_creators.views import add_user_with_status_unrequested, get_course_creator_status
from course_modes.models import CourseMode
from edxmako.shortcuts import render_to_response
from models.settings.course_grading import CourseGradingModel
from models.settings.course_metadata import CourseMetadata
@@ -1066,6 +1067,10 @@ def settings_handler(request, course_key_string):
sidebar_html_enabled = course_experience_waffle().is_enabled(ENABLE_COURSE_ABOUT_SIDEBAR_HTML)
# self_paced_enabled = SelfPacedConfiguration.current().enabled
verified_mode = CourseMode.verified_mode_for_course(course_key)
upgrade_deadline = (verified_mode and verified_mode.expiration_datetime and
verified_mode.expiration_datetime.isoformat())
settings_context = {
'context_course': course_module,
'course_locator': course_key,
@@ -1086,7 +1091,8 @@ def settings_handler(request, course_key_string):
'enrollment_end_editable': enrollment_end_editable,
'is_prerequisite_courses_enabled': is_prerequisite_courses_enabled(),
'is_entrance_exams_enabled': is_entrance_exams_enabled(),
'enable_extended_course_details': enable_extended_course_details
'enable_extended_course_details': enable_extended_course_details,
'upgrade_deadline': upgrade_deadline,
}
if is_prerequisite_courses_enabled():
courses, in_process_course_actions = get_courses_accessible_to_user(request)

View File

@@ -2,7 +2,7 @@ define([
'jquery', 'js/models/settings/course_details', 'js/views/settings/main'
], function($, CourseDetailsModel, MainView) {
'use strict';
return function(detailsUrl, showMinGradeWarning, showCertificateAvailableDate) {
return function(detailsUrl, showMinGradeWarning, showCertificateAvailableDate, upgradeDeadline) {
var model;
// highlighting labels when fields are focused in
$('form :input')
@@ -16,6 +16,7 @@ define([
model = new CourseDetailsModel();
model.urlRoot = detailsUrl;
model.showCertificateAvailableDate = showCertificateAvailableDate;
model.set('upgrade_deadline', upgradeDeadline);
model.fetch({
success: function(model) {
var editor = new MainView({

View File

@@ -83,6 +83,7 @@ define(['js/views/validation', 'codemirror', 'underscore', 'jquery', 'jquery.ui'
DateUtils.setupDatePicker('certificate_available_date', this);
DateUtils.setupDatePicker('enrollment_start', this);
DateUtils.setupDatePicker('enrollment_end', this);
DateUtils.setupDatePicker('upgrade_deadline', this);
this.$el.find('#' + this.fieldToSelectorMap.overview).val(this.model.get('overview'));
this.codeMirrorize(null, $('#course-overview')[0]);
@@ -162,6 +163,7 @@ define(['js/views/validation', 'codemirror', 'underscore', 'jquery', 'jquery.ui'
end_date: 'course-end',
enrollment_start: 'enrollment-start',
enrollment_end: 'enrollment-end',
upgrade_deadline: 'upgrade-deadline',
certificate_available_date: 'certificate-available',
overview: 'course-overview',
title: 'course-title',

View File

@@ -39,7 +39,8 @@ CMS.URL.UPLOAD_ASSET = '${upload_asset_url | n, js_escaped_string}'
SettingsFactory(
"${details_url | n, js_escaped_string}",
${show_min_grade_warning | n, dump_js_escaped_json},
${can_show_certificate_available_date_field(context_course) | n, dump_js_escaped_json}
${can_show_certificate_available_date_field(context_course) | n, dump_js_escaped_json},
"${upgrade_deadline | n, js_escaped_string}"
);
});
</%block>
@@ -203,9 +204,9 @@ CMS.URL.UPLOAD_ASSET = '${upload_asset_url | n, js_escaped_string}'
</ol>
</fieldset>
</div>
<hr class="divide" />
<div id="schedule" class="group-settings schedule">
<header>
<h2 class="title-2">${_('Course Schedule')}</h2>
@@ -291,6 +292,27 @@ CMS.URL.UPLOAD_ASSET = '${upload_asset_url | n, js_escaped_string}'
</div>
</li>
</ol>
% if upgrade_deadline:
<ol class="list-input">
<li class="field-group field-group-upgrade-deadline" id="upgrade-deadline">
<div class="field date is-not-editable" id="field-upgrade-deadline-date">
<label for="course-upgrade-deadline-date">${_("Upgrade Deadline Date")}</label>
<input type="text" class="date upgrade-deadline" id="course-upgrade-deadline-date" placeholder="MM/DD/YYYY" autocomplete="off" readonly aria-readonly="true" />
<span class="tip tip-stacked">
${_("Last day students can upgrade to a verified enrollment.")}
${_("Contact your edX partner manager to update these settings.")}
</span>
</div>
<div class="field time is-not-editable" id="field-upgrade-deadline-time">
<label for="course-upgrade-deadline-time">${_("Upgrade Deadline Time")}</label>
<input type="text" class="time upgrade-deadline" id="course-upgrade-deadline-time" placeholder="HH:MM" autocomplete="off" readonly aria-readonly="true" />
<span class="tip tip-stacked timezone">${_("(UTC)")}</span>
</div>
</li>
</ol>
% endif
</div>
% if about_page_editable: