From 65f8731a73d66023c1e058663eb273a9533474f7 Mon Sep 17 00:00:00 2001 From: Nimisha Asthagiri Date: Mon, 11 Sep 2017 14:32:19 -0400 Subject: [PATCH] Update schedule start only if new course start date is in the future --- openedx/core/djangoapps/schedules/signals.py | 6 ++- .../schedules/tests/test_signals.py | 39 +++++++++++++------ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/openedx/core/djangoapps/schedules/signals.py b/openedx/core/djangoapps/schedules/signals.py index 1b6e4320b8..2a8f01c44f 100644 --- a/openedx/core/djangoapps/schedules/signals.py +++ b/openedx/core/djangoapps/schedules/signals.py @@ -69,9 +69,11 @@ def create_schedule(sender, **kwargs): @receiver(COURSE_START_DATE_CHANGED, dispatch_uid="update_schedules_on_course_start_changed") def update_schedules_on_course_start_changed(sender, updated_course_overview, previous_start_date, **kwargs): """ - Updates all course schedules if course hasn't started yet. + Updates all course schedules if course hasn't started yet and + the updated start date is still in the future. """ - if previous_start_date > timezone.now(): + current_time = timezone.now() + if previous_start_date > current_time and updated_course_overview.start > current_time: upgrade_deadline = _calculate_upgrade_deadline( updated_course_overview.id, content_availability_date=updated_course_overview.start, diff --git a/openedx/core/djangoapps/schedules/tests/test_signals.py b/openedx/core/djangoapps/schedules/tests/test_signals.py index 11c5454cc0..3d5c550b11 100644 --- a/openedx/core/djangoapps/schedules/tests/test_signals.py +++ b/openedx/core/djangoapps/schedules/tests/test_signals.py @@ -1,4 +1,7 @@ +from collections import namedtuple import datetime +import ddt +from enum import Enum from mock import patch from pytz import utc @@ -78,7 +81,9 @@ class CreateScheduleTests(SharedModuleStoreTestCase): enrollment.schedule +@ddt.ddt @skip_unless_lms +@patch('openedx.core.djangoapps.schedules.signals.get_current_site') class UpdateScheduleTests(SharedModuleStoreTestCase): ENABLED_SIGNALS = ['course_published'] VERIFICATION_DEADLINE_DAYS = 14 @@ -96,30 +101,42 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): _strip_secs(expected_start) + datetime.timedelta(days=self.VERIFICATION_DEADLINE_DAYS), ) - @patch('openedx.core.djangoapps.schedules.signals.get_current_site') - def test_schedule_updated(self, mock_get_current_site): + def test_updated_since_course_not_started(self, mock_get_current_site): mock_get_current_site.return_value = self.site - course = _create_course_run(self_paced=True, start_day_offset=5) + course = _create_course_run(self_paced=True, start_day_offset=5) # course starts in future enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT) - self.assert_schedule_dates(enrollment.schedule, enrollment.course_overview.start) - course.start = course.start + datetime.timedelta(days=3) + + course.start = course.start + datetime.timedelta(days=3) # new course start changes to another future date self.store.update_item(course, ModuleStoreEnum.UserID.test) enrollment = CourseEnrollment.objects.get(id=enrollment.id) - self.assert_schedule_dates(enrollment.schedule, course.start) + self.assert_schedule_dates(enrollment.schedule, course.start) # start set to new course start - @patch('openedx.core.djangoapps.schedules.signals.get_current_site') - def test_schedule_not_updated(self, mock_get_current_site): + def test_not_updated_since_course_already_started(self, mock_get_current_site): mock_get_current_site.return_value = self.site - course = _create_course_run(self_paced=True, start_day_offset=-5) + course = _create_course_run(self_paced=True, start_day_offset=-5) # course starts in past enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT) self.assert_schedule_dates(enrollment.schedule, enrollment.created) - course.start = course.start + datetime.timedelta(days=3) + course.start = course.start + datetime.timedelta(days=3) # new course start changes to another future date self.store.update_item(course, ModuleStoreEnum.UserID.test) - self.assert_schedule_dates(enrollment.schedule, enrollment.created) + enrollment = CourseEnrollment.objects.get(id=enrollment.id) + self.assert_schedule_dates(enrollment.schedule, enrollment.created) # start remains unchanged + + def test_not_updated_since_new_start_in_past(self, mock_get_current_site): + mock_get_current_site.return_value = self.site + + course = _create_course_run(self_paced=True, start_day_offset=5) # course starts in future + enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT) + previous_start = enrollment.course_overview.start + self.assert_schedule_dates(enrollment.schedule, previous_start) + + course.start = course.start + datetime.timedelta(days=-10) # new course start changes to a past date + self.store.update_item(course, ModuleStoreEnum.UserID.test) + enrollment = CourseEnrollment.objects.get(id=enrollment.id) + self.assert_schedule_dates(enrollment.schedule, previous_start) # start remains unchanged def _create_course_run(self_paced=True, start_day_offset=-1):