Add expiration banner to progress page

In audit mode, add expiration banner to course progress page

REVE-6
This commit is contained in:
Bill Filler
2018-11-05 11:30:49 -05:00
parent 7a80e91af0
commit cebd85e681
3 changed files with 94 additions and 31 deletions

View File

@@ -13,6 +13,7 @@ from lms.djangoapps.courseware.field_overrides import OverrideFieldData
from courseware.testutils import FieldOverrideTestMixin
from courseware.views.views import progress
from django.conf import settings
from django.contrib.messages.storage.fallback import FallbackStorage
from django.core.cache import caches
from django.test.client import RequestFactory
from django.test.utils import override_settings
@@ -68,6 +69,8 @@ class FieldOverridePerformanceTestCase(FieldOverrideTestMixin, ProceduralCourseT
self.request = self.request_factory.get("foo")
self.request.session = {}
self.request.user = self.student
messages = FallbackStorage(self.request)
self.request._messages = messages # pylint: disable=protected-access
patcher = mock.patch('edxmako.request_context.get_current_request', return_value=self.request)
patcher.start()
@@ -237,18 +240,18 @@ class TestFieldOverrideMongoPerformance(FieldOverridePerformanceTestCase):
# # of sql queries to default,
# # of mongo queries,
# )
('no_overrides', 1, True, False): (21, 1),
('no_overrides', 2, True, False): (21, 1),
('no_overrides', 3, True, False): (21, 1),
('ccx', 1, True, False): (21, 1),
('ccx', 2, True, False): (21, 1),
('ccx', 3, True, False): (21, 1),
('no_overrides', 1, False, False): (21, 1),
('no_overrides', 2, False, False): (21, 1),
('no_overrides', 3, False, False): (21, 1),
('ccx', 1, False, False): (21, 1),
('ccx', 2, False, False): (21, 1),
('ccx', 3, False, False): (21, 1),
('no_overrides', 1, True, False): (24, 1),
('no_overrides', 2, True, False): (24, 1),
('no_overrides', 3, True, False): (24, 1),
('ccx', 1, True, False): (24, 1),
('ccx', 2, True, False): (24, 1),
('ccx', 3, True, False): (24, 1),
('no_overrides', 1, False, False): (24, 1),
('no_overrides', 2, False, False): (24, 1),
('no_overrides', 3, False, False): (24, 1),
('ccx', 1, False, False): (24, 1),
('ccx', 2, False, False): (24, 1),
('ccx', 3, False, False): (24, 1),
}
@@ -260,19 +263,19 @@ class TestFieldOverrideSplitPerformance(FieldOverridePerformanceTestCase):
__test__ = True
TEST_DATA = {
('no_overrides', 1, True, False): (21, 3),
('no_overrides', 2, True, False): (21, 3),
('no_overrides', 3, True, False): (21, 3),
('ccx', 1, True, False): (21, 3),
('ccx', 2, True, False): (21, 3),
('ccx', 3, True, False): (21, 3),
('ccx', 1, True, True): (22, 3),
('ccx', 2, True, True): (22, 3),
('ccx', 3, True, True): (22, 3),
('no_overrides', 1, False, False): (21, 3),
('no_overrides', 2, False, False): (21, 3),
('no_overrides', 3, False, False): (21, 3),
('ccx', 1, False, False): (21, 3),
('ccx', 2, False, False): (21, 3),
('ccx', 3, False, False): (21, 3),
('no_overrides', 1, True, False): (24, 3),
('no_overrides', 2, True, False): (24, 3),
('no_overrides', 3, True, False): (24, 3),
('ccx', 1, True, False): (24, 3),
('ccx', 2, True, False): (24, 3),
('ccx', 3, True, False): (24, 3),
('ccx', 1, True, True): (25, 3),
('ccx', 2, True, True): (25, 3),
('ccx', 3, True, True): (25, 3),
('no_overrides', 1, False, False): (24, 3),
('no_overrides', 2, False, False): (24, 3),
('no_overrides', 3, False, False): (24, 3),
('ccx', 1, False, False): (24, 3),
('ccx', 2, False, False): (24, 3),
('ccx', 3, False, False): (24, 3),
}

View File

@@ -1438,8 +1438,8 @@ class ProgressPageTests(ProgressPageBaseTests):
@override_waffle_flag(CONTENT_TYPE_GATING_FLAG, True)
@ddt.data(
(True, 39),
(False, 38)
(True, 40),
(False, 39)
)
@ddt.unpack
def test_progress_queries_paced_courses(self, self_paced, query_count):
@@ -1451,8 +1451,8 @@ class ProgressPageTests(ProgressPageBaseTests):
@override_waffle_flag(CONTENT_TYPE_GATING_FLAG, True)
@patch.dict(settings.FEATURES, {'ASSUME_ZERO_GRADE_IF_ABSENT_FOR_ALL_TESTS': False})
@ddt.data(
(False, 46, 29),
(True, 38, 25)
(False, 47, 30),
(True, 39, 26)
)
@ddt.unpack
def test_progress_queries(self, enable_waffle, initial, subsequent):
@@ -1648,6 +1648,64 @@ class ProgressPageTests(ProgressPageBaseTests):
u'You are enrolled in the audit track for this course. The audit track does not include a certificate.'
)
@override_waffle_flag(CONTENT_TYPE_GATING_FLAG, True)
@ddt.data(
*itertools.product(
(
CourseMode.AUDIT,
CourseMode.HONOR,
CourseMode.VERIFIED,
CourseMode.PROFESSIONAL,
CourseMode.NO_ID_PROFESSIONAL_MODE,
CourseMode.CREDIT_MODE
)
)
)
@ddt.unpack
def test_progress_with_course_duration_limits(self, course_mode):
"""
Verify that expired banner message appears on progress page, if learner is enrolled
in audit mode.
"""
user = UserFactory.create()
self.assertTrue(self.client.login(username=user.username, password='test'))
CourseEnrollmentFactory(user=user, course_id=self.course.id, mode=course_mode)
response = self._get_progress_page()
bannerText = get_expiration_banner_text(user, self.course)
if course_mode == CourseMode.AUDIT:
self.assertContains(response, bannerText, html=True)
else:
self.assertNotContains(response, bannerText, html=True)
@override_waffle_flag(CONTENT_TYPE_GATING_FLAG, False)
@ddt.data(
*itertools.product(
(
CourseMode.AUDIT,
CourseMode.HONOR,
CourseMode.VERIFIED,
CourseMode.PROFESSIONAL,
CourseMode.NO_ID_PROFESSIONAL_MODE,
CourseMode.CREDIT_MODE
)
)
)
@ddt.unpack
def test_progress_without_course_duration_limits(self, course_mode):
"""
Verify that expired banner message never appears on progress page, regardless
of course_mode
"""
user = UserFactory.create()
self.assertTrue(self.client.login(username=user.username, password='test'))
CourseEnrollmentFactory(user=user, course_id=self.course.id, mode=course_mode)
response = self._get_progress_page()
bannerText = get_expiration_banner_text(user, self.course)
self.assertNotContains(response, bannerText, html=True)
@patch('courseware.views.views.is_course_passed', PropertyMock(return_value=True))
@patch('lms.djangoapps.certificates.api.get_active_web_certificate', PropertyMock(return_value=True))
def test_message_for_honor_mode(self):

View File

@@ -985,6 +985,8 @@ def _progress(request, course_key, student_id):
# checking certificate generation configuration
enrollment_mode, _ = CourseEnrollment.enrollment_mode_for_user(student, course_key)
register_course_expired_message(request, course)
context = {
'course': course,
'courseware_summary': courseware_summary,