From 26303580a5d65b17a20a5e1d2e24f74833fdc362 Mon Sep 17 00:00:00 2001 From: Gabe Mulley Date: Fri, 17 Nov 2017 13:28:31 -0500 Subject: [PATCH 1/3] update schedule start when course start date changes --- openedx/core/djangoapps/schedules/signals.py | 24 +++++++++---------- .../schedules/tests/test_signals.py | 4 ++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/openedx/core/djangoapps/schedules/signals.py b/openedx/core/djangoapps/schedules/signals.py index d94966a4b4..2e57795622 100644 --- a/openedx/core/djangoapps/schedules/signals.py +++ b/openedx/core/djangoapps/schedules/signals.py @@ -89,19 +89,17 @@ def update_schedules_on_course_start_changed(sender, updated_course_overview, pr Updates all course schedules if course hasn't started yet and the updated start date is still in the future. """ - 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, - ) - update_course_schedules.apply_async( - kwargs=dict( - course_id=unicode(updated_course_overview.id), - new_start_date_str=date.serialize(updated_course_overview.start), - new_upgrade_deadline_str=date.serialize(upgrade_deadline), - ), - ) + upgrade_deadline = _calculate_upgrade_deadline( + updated_course_overview.id, + content_availability_date=updated_course_overview.start, + ) + update_course_schedules.apply_async( + kwargs=dict( + course_id=unicode(updated_course_overview.id), + new_start_date_str=date.serialize(updated_course_overview.start), + new_upgrade_deadline_str=date.serialize(upgrade_deadline), + ), + ) def _calculate_upgrade_deadline(course_id, content_availability_date): diff --git a/openedx/core/djangoapps/schedules/tests/test_signals.py b/openedx/core/djangoapps/schedules/tests/test_signals.py index e4eb10579a..ba1ea6de0f 100644 --- a/openedx/core/djangoapps/schedules/tests/test_signals.py +++ b/openedx/core/djangoapps/schedules/tests/test_signals.py @@ -165,7 +165,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): 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, enrollment.created) # start remains unchanged + self.assert_schedule_dates(enrollment.schedule, course.start) # start set to new course start def test_not_updated_since_new_start_in_past(self, mock_get_current_site): mock_get_current_site.return_value = self.site @@ -178,7 +178,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): 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 + self.assert_schedule_dates(enrollment.schedule, course.start) # start set to new course start def _create_course_run(self_paced=True, start_day_offset=-1): From a6387c0e5f5d6a113fce605d8f753c10fc568ab9 Mon Sep 17 00:00:00 2001 From: Gabe Mulley Date: Fri, 17 Nov 2017 13:34:15 -0500 Subject: [PATCH 2/3] log changes to the start date --- .../content/course_overviews/signals.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/openedx/core/djangoapps/content/course_overviews/signals.py b/openedx/core/djangoapps/content/course_overviews/signals.py index 0cd0da4e4c..2b67e39045 100644 --- a/openedx/core/djangoapps/content/course_overviews/signals.py +++ b/openedx/core/djangoapps/content/course_overviews/signals.py @@ -1,12 +1,16 @@ """ Signal handler for invalidating cached course overviews """ +import logging + from django.dispatch.dispatcher import receiver from .models import CourseOverview from openedx.core.djangoapps.signals.signals import COURSE_PACING_CHANGED, COURSE_START_DATE_CHANGED from xmodule.modulestore.django import SignalHandler +LOG = logging.getLogger(__name__) + @receiver(SignalHandler.course_published) def _listen_for_course_publish(sender, course_key, **kwargs): # pylint: disable=unused-argument @@ -40,6 +44,7 @@ def _check_for_course_changes(previous_course_overview, updated_course_overview) def _check_for_course_date_changes(previous_course_overview, updated_course_overview): if previous_course_overview.start != updated_course_overview.start: + _log_start_date_change(previous_course_overview, updated_course_overview) COURSE_START_DATE_CHANGED.send( sender=None, updated_course_overview=updated_course_overview, @@ -47,6 +52,19 @@ def _check_for_course_date_changes(previous_course_overview, updated_course_over ) +def _log_start_date_change(previous_course_overview, updated_course_overview): + previous_start_str = 'None' + if previous_course_overview.start is not None: + previous_start_str = previous_course_overview.start.isoformat() + new_start_str = 'None' + if updated_course_overview.start is not None: + new_start_str = updated_course_overview.start.isoformat() + LOG.info('Course start date changed: previous={0} new={1}'.format( + previous_start_str, + new_start_str, + )) + + def _check_for_pacing_changes(previous_course_overview, updated_course_overview): if previous_course_overview.self_paced != updated_course_overview.self_paced: COURSE_PACING_CHANGED.send( From 1f3085b2bc4501c4f90ae5763cfa566da1e748b9 Mon Sep 17 00:00:00 2001 From: Gabe Mulley Date: Fri, 17 Nov 2017 14:05:15 -0500 Subject: [PATCH 3/3] rename test methods --- openedx/core/djangoapps/schedules/tests/test_signals.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openedx/core/djangoapps/schedules/tests/test_signals.py b/openedx/core/djangoapps/schedules/tests/test_signals.py index ba1ea6de0f..167744e4c5 100644 --- a/openedx/core/djangoapps/schedules/tests/test_signals.py +++ b/openedx/core/djangoapps/schedules/tests/test_signals.py @@ -143,7 +143,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): _strip_secs(expected_start) + datetime.timedelta(days=self.VERIFICATION_DEADLINE_DAYS), ) - def test_updated_since_course_not_started(self, mock_get_current_site): + def test_updated_when_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 starts in future @@ -155,7 +155,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): enrollment = CourseEnrollment.objects.get(id=enrollment.id) self.assert_schedule_dates(enrollment.schedule, course.start) # start set to new course start - def test_not_updated_since_course_already_started(self, mock_get_current_site): + def test_updated_when_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 starts in past @@ -167,7 +167,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): enrollment = CourseEnrollment.objects.get(id=enrollment.id) self.assert_schedule_dates(enrollment.schedule, course.start) # start set to new course start - def test_not_updated_since_new_start_in_past(self, mock_get_current_site): + def test_updated_when_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