diff --git a/lms/djangoapps/courseware/tests/helpers.py b/lms/djangoapps/courseware/tests/helpers.py index 5bc45686ac..fe9dc8611b 100644 --- a/lms/djangoapps/courseware/tests/helpers.py +++ b/lms/djangoapps/courseware/tests/helpers.py @@ -19,7 +19,7 @@ from lms.djangoapps.courseware.date_summary import verified_upgrade_deadline_lin from lms.djangoapps.lms_xblock.field_data import LmsFieldData from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.lib.url_utils import quote_slashes -from student.models import Registration +from student.models import Registration, CourseEnrollment from student.tests.factories import CourseEnrollmentFactory, UserFactory from xblock.field_data import DictFieldData from xmodule.modulestore.django import modulestore @@ -358,12 +358,21 @@ def get_expiration_banner_text(user, course): Get text for banner that messages user course expiration date for different tests that depend on it. """ - expiration_date = (now() + timedelta(weeks=4)).strftime('%b %-d') + expiration_date = (now() + timedelta(weeks=4)).strftime('%b. %-d, %Y') upgrade_link = verified_upgrade_deadline_link(user=user, course=course) - bannerText = 'Your access to this course expires on {expiration_date}. \ - Upgrade now to retain access past {expiration_date}.\ - '.format( + enrollment = CourseEnrollment.get_enrollment(user, course.id) + upgrade_deadline = enrollment.upgrade_deadline + if upgrade_deadline is None: + return + if now() < upgrade_deadline: + upgrade_deadline = enrollment.course_upgrade_deadline + bannerText = 'Audit Access Expires {expiration_date}
\ + You lose all access to this course, including your progress, on {expiration_date}.
\ + Upgrade by {upgrade_deadline} to get unlimited access to the course as long as it exists on the site.\ + Upgrade now to retain access past {expiration_date}\ + '.format( expiration_date=expiration_date, - upgrade_link=upgrade_link + upgrade_link=upgrade_link, + upgrade_deadline=upgrade_deadline.strftime('%b. %-d, %Y') ) return bannerText diff --git a/lms/static/sass/bootstrap/_components.scss b/lms/static/sass/bootstrap/_components.scss index 740bea92a3..c2a298b7da 100644 --- a/lms/static/sass/bootstrap/_components.scss +++ b/lms/static/sass/bootstrap/_components.scss @@ -34,6 +34,7 @@ .alert.alert-info a { // Need to have sufficient contrast for blue links on blue background // Based this on some existing css for this use case - color: #245269; + color: #0075b4; + text-decoration: underline; font-weight: bold; } diff --git a/openedx/features/course_duration_limits/access.py b/openedx/features/course_duration_limits/access.py index 91798fb6d0..7b4ab5d370 100644 --- a/openedx/features/course_duration_limits/access.py +++ b/openedx/features/course_duration_limits/access.py @@ -9,6 +9,7 @@ from django.apps import apps from django.utils import timezone from django.utils.translation import ugettext as _ +from student.models import CourseEnrollment from util.date_utils import DEFAULT_SHORT_DATE_FORMAT, strftime_localized from course_modes.models import CourseMode @@ -43,7 +44,7 @@ class AuditExpiredError(AccessError): ) except CourseOverview.DoesNotExist: additional_context_user_message = _("Access to the course you were looking" - "for expired on {expiration_date}").format( + " for expired on {expiration_date}").format( expiration_date=expiration_date ) super(AuditExpiredError, self).__init__(error_code, developer_message, user_message, @@ -130,12 +131,30 @@ def register_course_expired_message(request, course): ) ) else: - upgrade_message = _('Your access to this course expires on {expiration_date}. \ - {a_open}Upgrade now {sronly_span_open}to retain access past {expiration_date}.\ - {span_close}{a_close}{sighted_only_span_open}for unlimited access.{span_close}') + enrollment = CourseEnrollment.get_enrollment(request.user, course.id) + if enrollment is None: + return + + upgrade_deadline = enrollment.upgrade_deadline + if upgrade_deadline is None: + return + now = timezone.now() + if now < upgrade_deadline: + upgrade_deadline = enrollment.course_upgrade_deadline + + expiration_message = _('{strong_open}Audit Access Expires {expiration_date}{strong_close}' + '{line_break}You lose all access to this course, including your progress, on ' + '{expiration_date}.') + upgrade_deadline_message = _('{line_break}Upgrade by {upgrade_deadline} to get unlimited access to the course ' + 'as long as it exists on the site. {a_open}Upgrade now{sronly_span_open} to ' + 'retain access past {expiration_date}{span_close}{a_close}') + full_message = expiration_message + if now < upgrade_deadline: + full_message += upgrade_deadline_message + PageLevelMessages.register_info_message( request, - Text(upgrade_message).format( + Text(full_message).format( a_open=HTML('').format( upgrade_link=verified_upgrade_deadline_link(user=request.user, course=course) ), @@ -143,6 +162,10 @@ def register_course_expired_message(request, course): sighted_only_span_open=HTML(''), a_close=HTML(''), - expiration_date=expiration_date.strftime('%b %-d'), + expiration_date=expiration_date.strftime('%b. %-d, %Y'), + strong_open=HTML(''), + strong_close=HTML(''), + line_break=HTML('
'), + upgrade_deadline=upgrade_deadline.strftime('%b. %-d, %Y') ) ) diff --git a/openedx/features/course_duration_limits/tests/test_course_expiration.py b/openedx/features/course_duration_limits/tests/test_course_expiration.py index 97b059f52d..f67df661e8 100644 --- a/openedx/features/course_duration_limits/tests/test_course_expiration.py +++ b/openedx/features/course_duration_limits/tests/test_course_expiration.py @@ -180,7 +180,7 @@ class CourseExpirationTestCase(ModuleStoreTestCase): response = self.client.get(course_home_url, follow=True) self.assertEqual(response.status_code, 200) self.assertItemsEqual(response.redirect_chain, []) - banner_text = 'Your access to this course expires on' + banner_text = 'You lose all access to this course, including your progress,' if show_expiration_banner: self.assertIn(banner_text, response.content) else: @@ -245,7 +245,7 @@ class CourseExpirationTestCase(ModuleStoreTestCase): response = self.client.get(course_home_url, follow=True) self.assertEqual(response.status_code, 200) self.assertItemsEqual(response.redirect_chain, []) - banner_text = 'Your access to this course expires on' + banner_text = 'You lose all access to this course, including your progress,' self.assertNotIn(banner_text, response.content) @mock.patch("openedx.features.course_duration_limits.access.get_course_run_details")