From dac0eec3854b4c12b29b3e2aeb0fa58828c5c51b Mon Sep 17 00:00:00 2001 From: Matthew Piatetsky Date: Fri, 8 Mar 2019 14:11:02 -0500 Subject: [PATCH] handle incorrectly set schedules --- common/djangoapps/student/tests/test_views.py | 2 +- lms/djangoapps/mobile_api/users/tests.py | 2 +- openedx/features/course_duration_limits/access.py | 8 ++++++++ .../course_experience/tests/views/test_course_home.py | 4 ++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/common/djangoapps/student/tests/test_views.py b/common/djangoapps/student/tests/test_views.py index 3a32eba078..11a229730b 100644 --- a/common/djangoapps/student/tests/test_views.py +++ b/common/djangoapps/student/tests/test_views.py @@ -741,7 +741,7 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin, user=self.user, course_id=course.id ) - schedule = ScheduleFactory(start=self.THREE_YEARS_AGO, enrollment=enrollment) + schedule = ScheduleFactory(start=self.THREE_YEARS_AGO + timedelta(days=1), enrollment=enrollment) response = self.client.get(reverse('dashboard')) dashboard_html = self._remove_whitespace_from_html_string(response.content) diff --git a/lms/djangoapps/mobile_api/users/tests.py b/lms/djangoapps/mobile_api/users/tests.py index bb27e2780f..a11c4fdabc 100644 --- a/lms/djangoapps/mobile_api/users/tests.py +++ b/lms/djangoapps/mobile_api/users/tests.py @@ -261,7 +261,7 @@ class TestUserEnrollmentApi(UrlResetMixin, MobileAPITestCase, MobileAuthUserTest user=self.user, course_id=course.id ) - ScheduleFactory(start=self.THREE_YEARS_AGO, enrollment=enrollment) + ScheduleFactory(start=self.THREE_YEARS_AGO + datetime.timedelta(days=1), enrollment=enrollment) else: course = CourseFactory.create(start=self.LAST_WEEK, mobile_available=True) self.enroll(course.id) diff --git a/openedx/features/course_duration_limits/access.py b/openedx/features/course_duration_limits/access.py index 8b98cff757..2fe39a9b96 100644 --- a/openedx/features/course_duration_limits/access.py +++ b/openedx/features/course_duration_limits/access.py @@ -77,6 +77,14 @@ def get_user_course_expiration_date(user, course): # for most people. Using the schedule date will provide flexibility to deal with # more complex business rules in the future. content_availability_date = enrollment.schedule.start + # We have anecdotally observed a case where the schedule.start was + # equal to the course start, but should have been equal to the enrollment start + # https://openedx.atlassian.net/browse/PROD-58 + # This section is meant to address that case + if enrollment.created and course.start: + if (content_availability_date.date() == course.start.date() and + course.start < enrollment.created < timezone.now()): + content_availability_date = enrollment.created except CourseEnrollment.schedule.RelatedObjectDoesNotExist: content_availability_date = max(enrollment.created, course.start) diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py index 0fb2f77597..3615f32c04 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -523,11 +523,11 @@ class TestCourseHomePageAccess(CourseHomePageTestCase): audit_user = UserFactory(password=self.TEST_PASSWORD) self.client.login(username=audit_user.username, password=self.TEST_PASSWORD) audit_enrollment = CourseEnrollment.enroll(audit_user, course.id, mode=CourseMode.AUDIT) - ScheduleFactory(start=THREE_YEARS_AGO, enrollment=audit_enrollment) + ScheduleFactory(start=THREE_YEARS_AGO + timedelta(days=1), enrollment=audit_enrollment) response = self.client.get(url) - expiration_date = strftime_localized(course.start + timedelta(weeks=4), u'%b. %-d, %Y') + expiration_date = strftime_localized(course.start + timedelta(weeks=4) + timedelta(days=1), u'%b. %-d, %Y') expected_params = QueryDict(mutable=True) course_name = CourseOverview.get_from_id(course.id).display_name_with_default expected_params['access_response_error'] = u'Access to {run} expired on {expiration_date}'.format(