feat: update segment events data for passed and failed learners
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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']}]")
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user