From f13b0e0e8ab18525dc9f0a3ad88dd241b7e81b1f Mon Sep 17 00:00:00 2001 From: Saleem Latif Date: Thu, 19 May 2022 14:02:33 +0500 Subject: [PATCH] feat: Enterprise learner with enabled learner portal should be redirect to B2B course about page. --- .../send_program_course_nudge_email.py | 30 ++++++++++++++----- .../test_send_program_course_nudge_email.py | 7 +++++ lms/envs/test.py | 4 +++ .../enterprise_support/tests/factories.py | 1 + 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lms/djangoapps/program_enrollments/management/commands/send_program_course_nudge_email.py b/lms/djangoapps/program_enrollments/management/commands/send_program_course_nudge_email.py index f9d4a969c7..23edf2046b 100644 --- a/lms/djangoapps/program_enrollments/management/commands/send_program_course_nudge_email.py +++ b/lms/djangoapps/program_enrollments/management/commands/send_program_course_nudge_email.py @@ -20,6 +20,7 @@ from lms.djangoapps.grades.models import PersistentCourseGrade from openedx.core.constants import COURSE_PUBLISHED from openedx.core.djangoapps.catalog.utils import get_programs from openedx.core.djangoapps.programs.utils import ProgramProgressMeter +from openedx.features.enterprise_support.api import get_enterprise_learner_data_from_db User = get_user_model() @@ -84,10 +85,10 @@ class Command(BaseCommand): Returns: Suggested program and course_run dicts """ for program in programs_progress: - for not_started_courses in program['not_started']: - for course_run in not_started_courses['course_runs']: + for not_started_course in program['not_started']: + for course_run in not_started_course['course_runs']: if self.valid_course_run(course_run) and course_run['key'] != completed_course_id: - return program, course_run + return program, course_run, not_started_course return None, None def sort_programs(self, programs): @@ -124,17 +125,28 @@ class Command(BaseCommand): if program['uuid'] == program_progress['uuid']: return program - def emit_event(self, user, program, suggested_course_run, completed_course_run): + def emit_event(self, user, program, suggested_course_run, suggested_course, completed_course_run): """ Emit the Segment event which will be used by Braze to send the email """ + learner_data = get_enterprise_learner_data_from_db(user) + enterprise_customer = learner_data[0]['enterprise_customer'] if learner_data else None + if enterprise_customer and enterprise_customer['enable_learner_portal']: + # If user is an enterprise learner then we want to redirect to B2B course landing page on learner portal. + recommended_course_url = urljoin( + settings.ENTERPRISE_LEARNER_PORTAL_BASE_URL, + '/'.join([enterprise_customer['slug'], 'course', suggested_course['key']]), + ) + else: + recommended_course_url = urljoin(settings.MKTG_URLS.get('ROOT'), suggested_course_run['marketing_url']) + event_properties = { 'COURSE_ONE_NAME': completed_course_run['title'], 'PROGRAM_TYPE': program['type'], 'PROGRAM_TITLE': program['title'], 'COURSE_TWO_NAME': suggested_course_run['title'], 'COURSE_TWO_SHORT_DESCRIPTION': suggested_course_run['short_description'], - 'COURSE_TWO_LINK': urljoin(settings.MKTG_URLS.get('ROOT'), suggested_course_run['marketing_url']), + 'COURSE_TWO_LINK': recommended_course_url, 'COURSE_TWO_IMAGE_LINK': suggested_course_run['image'].get('src'), } segment.track(user.id, 'edx.bi.program.course-enrollment.nudge', event_properties) @@ -177,14 +189,16 @@ class Command(BaseCommand): for user in users: meter = ProgramProgressMeter(site=site, user=user, include_course_entitlements=False) programs_progress = meter.progress(programs=course_linked_programs, count_only=False) - suggested_program_progress, suggested_course_run = self.get_course_run_to_suggest( + suggested_program_progress, suggested_course_run, suggested_course = self.get_course_run_to_suggest( programs_progress, completed_course_id ) - if suggested_course_run: + if suggested_course_run and suggested_course: suggested_program = self.get_program(course_linked_programs, suggested_program_progress) completed_course_run = self.get_course_run(suggested_program, completed_course_id) if should_commit: - self.emit_event(user, suggested_program, suggested_course_run, completed_course_run) + self.emit_event( + user, suggested_program, suggested_course_run, suggested_course, completed_course_run, + ) email_sent_records.append( f'User: {user.username}, Completed Course: {completed_course_id}, ' f'Suggested Course: {suggested_course_run["key"]}' diff --git a/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py b/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py index 9b04c04170..6c449c5871 100644 --- a/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py +++ b/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py @@ -7,12 +7,14 @@ from unittest.mock import patch import ddt from django.core.management import call_command from django.test import TestCase +from django.test.utils import override_settings from django.utils import timezone from testfixtures import LogCapture from common.djangoapps.student.tests.factories import UserFactory from lms.djangoapps.grades.models import PersistentCourseGrade from openedx.core.djangoapps.catalog.tests.factories import CourseFactory, CourseRunFactory, ProgramFactory +from openedx.features.enterprise_support.tests.factories import EnterpriseCustomerUserFactory LOG_PATH = 'lms.djangoapps.program_enrollments.management.commands.send_program_course_nudge_email' @@ -33,6 +35,10 @@ class TestSendProgramCourseNudgeEmailCommand(TestCase): self.user_1 = UserFactory() self.user_2 = UserFactory() + self.enterprise_customer_user = EnterpriseCustomerUserFactory.create( + user_id=self.user_1.id, enterprise_customer__enable_learner_portal=True + ) + self.enrolled_course_run = CourseRunFactory() self.course_run_1 = CourseRunFactory() self.course_run_2 = CourseRunFactory() @@ -73,6 +79,7 @@ class TestSendProgramCourseNudgeEmailCommand(TestCase): ) @patch('common.djangoapps.student.models.segment.track') @patch('lms.djangoapps.program_enrollments.management.commands.send_program_course_nudge_email.get_programs') + @override_settings(FEATURES=dict(ENABLE_ENTERPRISE_INTEGRATION=True)) def test_email_send(self, add_no_commit, get_programs_mock, mock_track): """ Test Segment fired as expected. diff --git a/lms/envs/test.py b/lms/envs/test.py index b50f3e5e8a..61cece154a 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -484,6 +484,10 @@ ECOMMERCE_PUBLIC_URL_ROOT = None ENTERPRISE_API_URL = 'http://enterprise.example.com/enterprise/api/v1/' ENTERPRISE_CONSENT_API_URL = 'http://enterprise.example.com/consent/api/v1/' +########################## ENTERPRISE LEARNER PORTAL ############################## +ENTERPRISE_LEARNER_PORTAL_NETLOC = 'example.com:8734' +ENTERPRISE_LEARNER_PORTAL_BASE_URL = 'http://' + ENTERPRISE_LEARNER_PORTAL_NETLOC + ACTIVATION_EMAIL_FROM_ADDRESS = 'test_activate@edx.org' TEMPLATES[0]['OPTIONS']['debug'] = True diff --git a/openedx/features/enterprise_support/tests/factories.py b/openedx/features/enterprise_support/tests/factories.py index 260c684d4d..a0244f2bcc 100644 --- a/openedx/features/enterprise_support/tests/factories.py +++ b/openedx/features/enterprise_support/tests/factories.py @@ -42,6 +42,7 @@ class EnterpriseCustomerFactory(factory.django.DjangoModelFactory): site = factory.SubFactory(SiteFactory) enable_data_sharing_consent = True enforce_data_sharing_consent = EnterpriseCustomer.AT_ENROLLMENT + enable_learner_portal = False class EnterpriseCustomerUserFactory(factory.django.DjangoModelFactory):