From 6a5c1bbf44b8fbfe650214e44e418b6c99892bb7 Mon Sep 17 00:00:00 2001 From: Nawfal Ahmed <111358247+NawfalAhmed@users.noreply.github.com> Date: Mon, 12 Jun 2023 18:07:43 +0500 Subject: [PATCH] feat: update subscription enrollment alert (#32414) --- .../api/v0/tests/test_views.py | 3 +- .../spec/program_alert_list_view_spec.js | 2 +- .../spec/program_list_header_view_spec.js | 4 +- .../views/program_alert_list_view.js | 2 +- .../views/program_details_view.js | 5 +-- .../views/program_list_header_view.js | 19 ++++----- .../djangoapps/programs/tests/test_utils.py | 39 ++++++++++++++++--- openedx/core/djangoapps/programs/utils.py | 3 ++ 8 files changed, 52 insertions(+), 25 deletions(-) diff --git a/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py b/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py index 3d072ca2fc..0587ad7c4f 100644 --- a/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py +++ b/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py @@ -217,7 +217,8 @@ class TestProgramsView(SharedModuleStoreTestCase, ProgramCacheMixin): 'uuid': self.program['uuid'], 'completed': 0, 'in_progress': 0, - 'not_started': 1 + 'not_started': 1, + 'all_unenrolled': False, } @with_site_configuration(configuration={'COURSE_CATALOG_API_URL': 'foo'}) diff --git a/lms/static/js/learner_dashboard/spec/program_alert_list_view_spec.js b/lms/static/js/learner_dashboard/spec/program_alert_list_view_spec.js index c5c5f0ec7a..10c0691737 100644 --- a/lms/static/js/learner_dashboard/spec/program_alert_list_view_spec.js +++ b/lms/static/js/learner_dashboard/spec/program_alert_list_view_spec.js @@ -40,7 +40,7 @@ describe('Program Alert List View', () => { it('should render no enrollement alert', () => { expect(view.$('.alert:first .alert-heading').text().trim()).toEqual( - 'Enroll in a Test Program course' + 'Enroll in a Test Program\'s course' ); expect(view.$('.alert:first .alert-message').text().trim()).toEqual( 'You have an active subscription to the Test Program program but are not enrolled in any courses. Enroll in a remaining course and enjoy verified access.' diff --git a/lms/static/js/learner_dashboard/spec/program_list_header_view_spec.js b/lms/static/js/learner_dashboard/spec/program_list_header_view_spec.js index 558b984487..bc97a07112 100644 --- a/lms/static/js/learner_dashboard/spec/program_list_header_view_spec.js +++ b/lms/static/js/learner_dashboard/spec/program_list_header_view_spec.js @@ -39,12 +39,14 @@ describe('Program List Header View', () => { completed: 0, in_progress: 1, not_started: 0, + all_unenrolled: false, }, { uuid: 'b90d70d5-f981-4508-bdeb-5b792d930c03', completed: 0, in_progress: 0, not_started: 3, + all_unenrolled: true, }, ], isUserB2CSubscriptionsEnabled: true, @@ -79,7 +81,7 @@ describe('Program List Header View', () => { it('should render a program alert', () => { expect( view.$('.js-program-list-alerts .alert .alert-heading').html().trim() - ).toEqual('Enroll in a Test Program course'); + ).toEqual('Enroll in a Test Program\'s course'); expect( view.$('.js-program-list-alerts .alert .alert-message') ).toContainHtml( diff --git a/lms/static/js/learner_dashboard/views/program_alert_list_view.js b/lms/static/js/learner_dashboard/views/program_alert_list_view.js index 4f1ba37961..cf4ed279f1 100644 --- a/lms/static/js/learner_dashboard/views/program_alert_list_view.js +++ b/lms/static/js/learner_dashboard/views/program_alert_list_view.js @@ -36,7 +36,7 @@ class ProgramAlertListView extends Backbone.View { url, urlText: gettext('View program'), title: StringUtils.interpolate( - gettext('Enroll in a {programName} course'), + gettext('Enroll in a {programName}\'s course'), { programName } ), message: this.pageType === 'programDetails' diff --git a/lms/static/js/learner_dashboard/views/program_details_view.js b/lms/static/js/learner_dashboard/views/program_details_view.js index d0acf32cd8..365493afef 100644 --- a/lms/static/js/learner_dashboard/views/program_details_view.js +++ b/lms/static/js/learner_dashboard/views/program_details_view.js @@ -217,10 +217,7 @@ class ProgramDetailsView extends Backbone.View { trialEndingAlerts: [], }; if (this.subscriptionModel.get('subscriptionState') === 'active') { - if ( - this.courseData.get('in_progress').length === 0 && - this.courseData.get('not_started').length >= 1 - ) { + if (this.courseData.get('all_unenrolled')) { alerts.enrollmentAlerts.push({ title: this.programModel.get('title'), }); diff --git a/lms/static/js/learner_dashboard/views/program_list_header_view.js b/lms/static/js/learner_dashboard/views/program_list_header_view.js index 1019d682bf..6520caf086 100644 --- a/lms/static/js/learner_dashboard/views/program_list_header_view.js +++ b/lms/static/js/learner_dashboard/views/program_list_header_view.js @@ -58,18 +58,15 @@ class ProgramListHeaderView extends Backbone.View { getEnrollmentAlerts() { return this.programAndSubscriptionData - .map(({ programData, subscriptionData }) => { - const progress = this.context.progressCollection?.findWhere({ + .map(({ programData, subscriptionData }) => + this.context.progressCollection?.findWhere({ uuid: programData.uuid, - in_progress: 0, - }); - return ( - progress?.get('not_started') >= 1 && { - title: programData.title, - url: programData.detail_url, - } - ); - }) + all_unenrolled: true, + }) ? { + title: programData.title, + url: programData.detail_url, + } : null + ) .filter(Boolean); } diff --git a/openedx/core/djangoapps/programs/tests/test_utils.py b/openedx/core/djangoapps/programs/tests/test_utils.py index 572efb348e..b2ddf6d904 100644 --- a/openedx/core/djangoapps/programs/tests/test_utils.py +++ b/openedx/core/djangoapps/programs/tests/test_utils.py @@ -157,7 +157,11 @@ class TestProgramProgressMeter(ModuleStoreTestCase): assert meter.engaged_programs == [program] self._assert_progress( meter, - ProgressFactory(uuid=program['uuid'], in_progress=1) + ProgressFactory( + uuid=program['uuid'], + in_progress=1, + all_unenrolled=False, + ) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -256,6 +260,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): completed=[], in_progress=[program['courses'][0]], not_started=[], + all_unenrolled=False, ) ] @@ -292,6 +297,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): completed=[], in_progress=[program['courses'][0]], not_started=[], + all_unenrolled=False, ) ] @@ -333,6 +339,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): completed=0, in_progress=1 if offset in [None, 1] else 0, not_started=1 if offset in [-1] else 0, + all_unenrolled=False, ) ] @@ -374,7 +381,11 @@ class TestProgramProgressMeter(ModuleStoreTestCase): self._assert_progress( meter, - *(ProgressFactory(uuid=program['uuid'], in_progress=1) for program in programs) + *(ProgressFactory( + uuid=program['uuid'], + in_progress=1, + all_unenrolled=False, + ) for program in programs) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -442,7 +453,11 @@ class TestProgramProgressMeter(ModuleStoreTestCase): self._assert_progress( meter, - *(ProgressFactory(uuid=program['uuid'], in_progress=1) for program in programs) + *(ProgressFactory( + uuid=program['uuid'], + in_progress=1, + all_unenrolled=False, + ) for program in programs) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -531,7 +546,12 @@ class TestProgramProgressMeter(ModuleStoreTestCase): _, program_uuid = data[0], data[0]['uuid'] self._assert_progress( meter, - ProgressFactory(uuid=program_uuid, in_progress=1, not_started=2) + ProgressFactory( + uuid=program_uuid, + in_progress=1, + not_started=2, + all_unenrolled=False, + ) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -544,6 +564,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): ProgressFactory( uuid=program_uuid, in_progress=3, + all_unenrolled=False, ) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -557,6 +578,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): uuid=program_uuid, completed=1, in_progress=2, + all_unenrolled=False, ) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -571,6 +593,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): uuid=program_uuid, completed=1, in_progress=2, + all_unenrolled=False, ) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -585,6 +608,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): uuid=program_uuid, completed=2, in_progress=1, + all_unenrolled=False, ) ) assert not list(meter.completed_programs_with_available_dates.keys()) @@ -598,6 +622,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): uuid=program_uuid, completed=2, not_started=1, + all_unenrolled=False, ) ) assert list(meter.completed_programs_with_available_dates.keys()) == [program_uuid] @@ -614,6 +639,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): ProgressFactory( uuid=program_uuid, completed=3, + all_unenrolled=False, ) ) assert list(meter.completed_programs_with_available_dates.keys()) == [program_uuid] @@ -641,7 +667,8 @@ class TestProgramProgressMeter(ModuleStoreTestCase): meter, ProgressFactory( uuid=program_data['uuid'], - not_started=1 + not_started=1, + all_unenrolled=False, ) ) @@ -674,7 +701,7 @@ class TestProgramProgressMeter(ModuleStoreTestCase): program_uuid = program['uuid'] self._assert_progress( meter, - ProgressFactory(uuid=program_uuid, completed=1) + ProgressFactory(uuid=program_uuid, completed=1, all_unenrolled=False) ) assert list(meter.completed_programs_with_available_dates.keys()) == [program_uuid] diff --git a/openedx/core/djangoapps/programs/utils.py b/openedx/core/djangoapps/programs/utils.py index a8a5c6b51b..8a9b861f49 100644 --- a/openedx/core/djangoapps/programs/utils.py +++ b/openedx/core/djangoapps/programs/utils.py @@ -352,6 +352,9 @@ class ProgramProgressMeter: 'completed': len(completed) if count_only else completed, 'in_progress': len(in_progress) if count_only else in_progress, 'not_started': len(not_started) if count_only else not_started, + 'all_unenrolled': all( + not self._is_course_enrolled(course) for course in program_copy['courses'] + ), }) return progress