feat: update segment events data for passed and failed learners

This commit is contained in:
muhammad-ammar
2022-06-21 18:00:56 +05:00
parent d9f54b9f46
commit 80e4b6a165
4 changed files with 29 additions and 32 deletions

View File

@@ -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)

View File

@@ -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']}]")

View File

@@ -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,

View File

@@ -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,
}
)