Unverified Commit e32ff53f by Michael Terry Committed by GitHub

Merge pull request #16935 from edx/mikix/expired-rel-programs

Show programs for expired entitlements
parents 6ea32b7a 4fe60eb1
...@@ -395,16 +395,18 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin): ...@@ -395,16 +395,18 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin):
self.assertIn('You can no longer select a session', response.content) self.assertIn('You can no longer select a session', response.content)
self.assertNotIn('<div class="course-entitlement-selection-container ">', response.content) self.assertNotIn('<div class="course-entitlement-selection-container ">', response.content)
@patch('openedx.core.djangoapps.programs.utils.get_programs')
@patch('student.views.get_course_runs_for_course') @patch('student.views.get_course_runs_for_course')
@patch.object(CourseOverview, 'get_from_id') @patch.object(CourseOverview, 'get_from_id')
@patch('opaque_keys.edx.keys.CourseKey.from_string') @patch('opaque_keys.edx.keys.CourseKey.from_string')
def test_fulfilled_entitlement(self, mock_course_key, mock_course_overview, mock_course_runs): def test_fulfilled_entitlement(self, mock_course_key, mock_course_overview, mock_course_runs, mock_get_programs):
""" """
When a learner has a fulfilled entitlement, their course dashboard should have: When a learner has a fulfilled entitlement, their course dashboard should have:
- exactly one course item, meaning it: - exactly one course item, meaning it:
- has an entitlement card - has an entitlement card
- does NOT have a course card referencing the selected session - does NOT have a course card referencing the selected session
- an unhidden Change Session button - an unhidden Change Session button
- a related programs message
""" """
mocked_course_overview = CourseOverviewFactory( mocked_course_overview = CourseOverviewFactory(
start=self.TOMORROW, self_paced=True, enrollment_end=self.TOMORROW start=self.TOMORROW, self_paced=True, enrollment_end=self.TOMORROW
...@@ -420,20 +422,27 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin): ...@@ -420,20 +422,27 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin):
'type': 'verified' 'type': 'verified'
} }
] ]
CourseEntitlementFactory(user=self.user, enrollment_course_run=course_enrollment) entitlement = CourseEntitlementFactory(user=self.user, enrollment_course_run=course_enrollment)
program = ProgramFactory()
program['courses'][0]['course_runs'] = [{'key': unicode(mocked_course_overview.id)}]
program['courses'][0]['uuid'] = entitlement.course_uuid
mock_get_programs.return_value = [program]
response = self.client.get(self.path) response = self.client.get(self.path)
self.assertEqual(response.content.count('<li class="course-item">'), 1) self.assertEqual(response.content.count('<li class="course-item">'), 1)
self.assertIn('<button class="change-session btn-link "', response.content) self.assertIn('<button class="change-session btn-link "', response.content)
self.assertIn('Related Programs:', response.content)
@patch('openedx.core.djangoapps.programs.utils.get_programs')
@patch('student.views.get_course_runs_for_course') @patch('student.views.get_course_runs_for_course')
@patch.object(CourseOverview, 'get_from_id') @patch.object(CourseOverview, 'get_from_id')
@patch('opaque_keys.edx.keys.CourseKey.from_string') @patch('opaque_keys.edx.keys.CourseKey.from_string')
def test_fulfilled_expired_entitlement(self, mock_course_key, mock_course_overview, mock_course_runs): def test_fulfilled_expired_entitlement(self, mock_course_key, mock_course_overview, mock_course_runs, mock_get_programs):
""" """
When a learner has a fulfilled entitlement that is expired, their course dashboard should have: When a learner has a fulfilled entitlement that is expired, their course dashboard should have:
- exactly one course item, meaning it: - exactly one course item, meaning it:
- has an entitlement card - has an entitlement card
- Message that the learner can no longer change sessions - Message that the learner can no longer change sessions
- a related programs message
""" """
mocked_course_overview = CourseOverviewFactory( mocked_course_overview = CourseOverviewFactory(
start=self.TOMORROW, self_paced=True, enrollment_end=self.TOMORROW start=self.TOMORROW, self_paced=True, enrollment_end=self.TOMORROW
...@@ -449,10 +458,15 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin): ...@@ -449,10 +458,15 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin):
'type': 'verified' 'type': 'verified'
} }
] ]
CourseEntitlementFactory(user=self.user, enrollment_course_run=course_enrollment, created=self.THREE_YEARS_AGO) entitlement = CourseEntitlementFactory(user=self.user, enrollment_course_run=course_enrollment, created=self.THREE_YEARS_AGO)
program = ProgramFactory()
program['courses'][0]['course_runs'] = [{'key': unicode(mocked_course_overview.id)}]
program['courses'][0]['uuid'] = entitlement.course_uuid
mock_get_programs.return_value = [program]
response = self.client.get(self.path) response = self.client.get(self.path)
self.assertEqual(response.content.count('<li class="course-item">'), 1) self.assertEqual(response.content.count('<li class="course-item">'), 1)
self.assertIn('You can no longer change sessions.', response.content) self.assertIn('You can no longer change sessions.', response.content)
self.assertIn('Related Programs:', response.content)
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
......
...@@ -176,7 +176,7 @@ from student.models import CourseEnrollment ...@@ -176,7 +176,7 @@ from student.models import CourseEnrollment
is_course_blocked = (session_id in block_courses) is_course_blocked = (session_id in block_courses)
course_verification_status = verification_status_by_course.get(session_id, {}) course_verification_status = verification_status_by_course.get(session_id, {})
course_requirements = courses_requirements_not_met.get(session_id) course_requirements = courses_requirements_not_met.get(session_id)
related_programs = inverted_programs.get(unicode(entitlement.course_uuid if entitlement else session_id)) related_programs = inverted_programs.get(unicode(entitlement.course_uuid if is_unfulfilled_entitlement else session_id))
show_consent_link = (session_id in consent_required_courses) show_consent_link = (session_id in consent_required_courses)
course_overview = enrollment.course_overview course_overview = enrollment.course_overview
%> %>
......
...@@ -120,7 +120,6 @@ class ProgramProgressMeter(object): ...@@ -120,7 +120,6 @@ class ProgramProgressMeter(object):
program_list = inverted_programs[course_uuid] program_list = inverted_programs[course_uuid]
if program not in program_list: if program not in program_list:
program_list.append(program) program_list.append(program)
continue
for course_run in course['course_runs']: for course_run in course['course_runs']:
course_run_id = course_run['key'] course_run_id = course_run['key']
if course_run_id in self.course_run_ids: if course_run_id in self.course_run_ids:
......
...@@ -172,7 +172,7 @@ from student.models import CourseEnrollment ...@@ -172,7 +172,7 @@ from student.models import CourseEnrollment
is_course_blocked = (session_id in block_courses) is_course_blocked = (session_id in block_courses)
course_verification_status = verification_status_by_course.get(session_id, {}) course_verification_status = verification_status_by_course.get(session_id, {})
course_requirements = courses_requirements_not_met.get(session_id) course_requirements = courses_requirements_not_met.get(session_id)
related_programs = inverted_programs.get(unicode(entitlement.course_uuid if entitlement else session_id)) related_programs = inverted_programs.get(unicode(entitlement.course_uuid if is_unfulfilled_entitlement else session_id))
show_consent_link = (session_id in consent_required_courses) show_consent_link = (session_id in consent_required_courses)
course_overview = enrollment.course_overview course_overview = enrollment.course_overview
%> %>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment