From 80e4b6a16582d9a7f415e9eb437ea2e8a79ad945 Mon Sep 17 00:00:00 2001 From: muhammad-ammar Date: Tue, 21 Jun 2022 18:00:56 +0500 Subject: [PATCH] feat: update segment events data for passed and failed learners --- lms/djangoapps/grades/events.py | 10 ++++--- ...send_segment_events_for_failed_learners.py | 28 +++++++++---------- ...send_segment_events_for_failed_learners.py | 17 ++++++----- lms/djangoapps/grades/tests/test_signals.py | 6 ++-- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/lms/djangoapps/grades/events.py b/lms/djangoapps/grades/events.py index db048303e1..659401679f 100644 --- a/lms/djangoapps/grades/events.py +++ b/lms/djangoapps/grades/events.py @@ -227,7 +227,11 @@ def fire_segment_event_on_course_grade_passed_first_time(user_id, course_locator ) try: - __ = CourseEnrollment.objects.get(user_id=user_id, course_id=courserun_key, mode__in=paid_enrollment_modes) + enrollment = CourseEnrollment.objects.get( + user_id=user_id, + course_id=courserun_key, + mode__in=paid_enrollment_modes + ) except CourseEnrollment.DoesNotExist: return @@ -237,11 +241,9 @@ def fire_segment_event_on_course_grade_passed_first_time(user_id, course_locator return event_properties = { - 'LMS_USER_ID': user_id, - 'COURSERUN_KEY': courserun_key, + 'LMS_ENROLLMENT_ID': enrollment.id, 'COURSE_TITLE': courserun_display_name, 'COURSE_ORG_NAME': courserun_org, - 'PASSED': 1, } segment.track(user_id, event_name, event_properties) diff --git a/lms/djangoapps/grades/management/commands/send_segment_events_for_failed_learners.py b/lms/djangoapps/grades/management/commands/send_segment_events_for_failed_learners.py index c586360072..f621de4f45 100644 --- a/lms/djangoapps/grades/management/commands/send_segment_events_for_failed_learners.py +++ b/lms/djangoapps/grades/management/commands/send_segment_events_for_failed_learners.py @@ -58,7 +58,7 @@ class Command(BaseCommand): log.info(f"Found {thirty_one_days_ago_ended_course_keys} courses that were ended on [{thirty_one_days_ago}]") return courses - def get_course_failed_user_ids(self, course): + def get_failed_enrollment_and_user_ids(self, course): """ Get list of all the enrolled users that failed the given course. This method will only consider paid enrolments. @@ -79,15 +79,15 @@ class Command(BaseCommand): failed_grade_user_ids = list(page.object_list) # exclude all non-paid enrollments - failed_user_ids = CourseEnrollment.objects.filter( + failed_enrollment_and_user_ids = CourseEnrollment.objects.filter( course_id=course.id, user_id__in=failed_grade_user_ids, mode__in=PAID_ENROLLMENT_MODES, is_active=True - ).values_list('user_id', flat=True) - failed_user_ids = list(failed_user_ids) + ).values_list('id', 'user_id') + failed_enrollment_and_user_ids = list(failed_enrollment_and_user_ids) - yield failed_user_ids + yield failed_enrollment_and_user_ids def handle(self, *args, **options): """ @@ -100,7 +100,7 @@ class Command(BaseCommand): log_prefix = '[DRY RUN]' stats = { - 'failed_course_user_ids': {}, + 'failed_course_enrollment_ids': {}, } log.info(f'{log_prefix} Command started.') @@ -111,22 +111,20 @@ class Command(BaseCommand): course_id = str(course.id) course_display_name = course.display_name - stats['failed_course_user_ids'][course_id] = [] + stats['failed_course_enrollment_ids'][course_id] = [] - for course_failed_user_ids in self.get_course_failed_user_ids(course): + for enrollment_and_user_ids in self.get_failed_enrollment_and_user_ids(course): # for each failed enrollment, send a segment event - for course_failed_user_id in course_failed_user_ids: + for failed_enrollment_id, failed_user_id in enrollment_and_user_ids: event_properties = { - 'LMS_USER_ID': course_failed_user_id, - 'COURSERUN_KEY': course_id, + 'LMS_ENROLLMENT_ID': failed_enrollment_id, 'COURSE_TITLE': course_display_name, 'COURSE_ORG_NAME': course_org, - 'PASSED': 0, } if should_fire_event: - segment.track(course_failed_user_id, EVENT_NAME, event_properties) + segment.track(failed_user_id, EVENT_NAME, event_properties) - stats['failed_course_user_ids'][course_id].append(course_failed_user_id) + stats['failed_course_enrollment_ids'][course_id].append(failed_enrollment_id) log.info( "{} Segment event fired for failed learner. Event: [{}], Data: [{}]".format( @@ -136,4 +134,4 @@ class Command(BaseCommand): ) ) - log.info(f"{log_prefix} Command completed. Stats: [{stats['failed_course_user_ids']}]") + log.info(f"{log_prefix} Command completed. Stats: [{stats['failed_course_enrollment_ids']}]") diff --git a/lms/djangoapps/grades/management/commands/tests/test_send_segment_events_for_failed_learners.py b/lms/djangoapps/grades/management/commands/tests/test_send_segment_events_for_failed_learners.py index e188a0deb9..bed60d34cd 100644 --- a/lms/djangoapps/grades/management/commands/tests/test_send_segment_events_for_failed_learners.py +++ b/lms/djangoapps/grades/management/commands/tests/test_send_segment_events_for_failed_learners.py @@ -84,17 +84,15 @@ class TestSendSegmentEventsForFailedLearnersCommand(SharedModuleStoreTestCase): """ event_call_data = [] for course in self.command.get_courses(): - for course_failed_user_ids in self.command.get_course_failed_user_ids(course): - for course_failed_user_id in course_failed_user_ids: + for enrollment_and_user_ids in self.command.get_failed_enrollment_and_user_ids(course): + for failed_enrollment_id, failed_user_id in enrollment_and_user_ids: event_call_data.append([ - course_failed_user_id, + failed_user_id, EVENT_NAME, { - 'LMS_USER_ID': course_failed_user_id, - 'COURSERUN_KEY': str(course.id), + 'LMS_ENROLLMENT_ID': failed_enrollment_id, 'COURSE_TITLE': course.display_name, 'COURSE_ORG_NAME': course.org, - 'PASSED': 0, } ]) return event_call_data @@ -111,16 +109,17 @@ class TestSendSegmentEventsForFailedLearnersCommand(SharedModuleStoreTestCase): def test_get_course_failed_user_ids(self): """ - Verify that `get_course_failed_user_ids` method returns correct user ids. + Verify that `get_failed_enrollment_and_user_ids` method returns correct user ids. * user id must have a paid enrollment * user id must have a failed grade """ for course in self.course_overviews: - for user_ids in self.command.get_course_failed_user_ids(course): - for user_id in user_ids: + for enrollment_and_user_ids in self.command.get_failed_enrollment_and_user_ids(course): + for enrollment_id, user_id in enrollment_and_user_ids: # user id must have a paid enrollment assert CourseEnrollment.objects.filter( + id=enrollment_id, course_id=course.id, user_id=user_id, mode__in=PAID_ENROLLMENT_MODES, diff --git a/lms/djangoapps/grades/tests/test_signals.py b/lms/djangoapps/grades/tests/test_signals.py index 8c161d86ac..bc59c0698c 100644 --- a/lms/djangoapps/grades/tests/test_signals.py +++ b/lms/djangoapps/grades/tests/test_signals.py @@ -391,7 +391,7 @@ class CourseEventsSignalsTest(ModuleStoreTestCase): @patch('lms.djangoapps.grades.events.segment.track') def test_segment_event_on_course_grade_passed_first_time(self, segment_track_mock): course = CourseOverviewFactory() - __ = CourseEnrollmentFactory( + enrollment = CourseEnrollmentFactory( is_active=True, mode='verified', course=course, @@ -420,10 +420,8 @@ class CourseEventsSignalsTest(ModuleStoreTestCase): self.user.id, 'edx.course.learner.passed.first_time', { - 'LMS_USER_ID': self.user.id, - 'COURSERUN_KEY': str(course.id), + 'LMS_ENROLLMENT_ID': enrollment.id, 'COURSE_TITLE': course.display_name, 'COURSE_ORG_NAME': course.org, - 'PASSED': 1, } )