Files
edx-platform/lms/djangoapps/course_home_api/tasks.py
Justin Hynes f509bceac2 fix: setup context for emitting event to segment if desired (#36692)
If we wish this event to be sent to Segment through the event-tracking lib, we must ensure that the context includes at least the `user_id` field in the context dict.
2025-05-09 10:54:37 -04:00

63 lines
2.0 KiB
Python

"""
Celery tasks used by the `course_home_api` app.
"""
import logging
from celery import shared_task
from django.contrib.auth import get_user_model
from edx_django_utils.monitoring import set_code_owner_attribute
from eventtracking import tracker
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
from common.djangoapps.student.models_api import get_course_enrollment
from lms.djangoapps.course_home_api.progress.api import calculate_progress_for_learner_in_course
User = get_user_model()
COURSE_COMPLETION_FOR_USER_EVENT_NAME = "edx.bi.user.course-progress"
log = logging.getLogger(__name__)
@shared_task
@set_code_owner_attribute
def collect_progress_for_user_in_course(course_id: str, user_id: str) -> None:
"""
Celery task that retrieves a learner's progress in a given course.
"""
try:
course_key = CourseKey.from_string(course_id)
except InvalidKeyError:
log.warning(f"Invalid course id {course_id}, aborting task.")
return
try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
log.warning(f"Could not retrieve a user with id {user_id}, aborting task.")
return
try:
enrollment = get_course_enrollment(user, course_key)
enrollment_mode = enrollment.mode
except AttributeError:
log.warning(f"Could not retrieve enrollment info for user {user.id} in course {course_id}")
return
progress = calculate_progress_for_learner_in_course(course_key, user)
# add a few extra fields to the returned data to make the event payload a bit more usable
progress["user_id"] = user.id
progress["course_id"] = course_id
progress["enrollment_mode"] = enrollment_mode
context = {
"course_id": course_id,
"user_id": user.id,
}
with tracker.get_tracker().context(COURSE_COMPLETION_FOR_USER_EVENT_NAME, context):
tracker.emit(
COURSE_COMPLETION_FOR_USER_EVENT_NAME,
progress
)