From 63f327b6829a18439f39b432d57605fa9387a9f0 Mon Sep 17 00:00:00 2001 From: Ahtisham Shahid Date: Thu, 8 Aug 2024 14:57:32 +0500 Subject: [PATCH] feat: added events to bulk email tool (#35147) * feat: added events to bulk email tool --- lms/djangoapps/bulk_email/apps.py | 4 ++++ lms/djangoapps/bulk_email/signals.py | 30 ++++++++++++++++++++++++++-- lms/djangoapps/bulk_email/tasks.py | 10 +++++++++- lms/djangoapps/bulk_email/views.py | 9 +++++++++ requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 8 files changed, 54 insertions(+), 7 deletions(-) diff --git a/lms/djangoapps/bulk_email/apps.py b/lms/djangoapps/bulk_email/apps.py index 2cfb725ba8..63a44fcfcd 100644 --- a/lms/djangoapps/bulk_email/apps.py +++ b/lms/djangoapps/bulk_email/apps.py @@ -7,3 +7,7 @@ class BulkEmailConfig(AppConfig): Application Configuration for bulk_email. """ name = 'lms.djangoapps.bulk_email' + + def ready(self): + import lms.djangoapps.bulk_email.signals # lint-amnesty, pylint: disable=unused-import + from edx_ace.signals import ACE_MESSAGE_SENT # lint-amnesty, pylint: disable=unused-import diff --git a/lms/djangoapps/bulk_email/signals.py b/lms/djangoapps/bulk_email/signals.py index 818d222b7a..d45d0ae017 100644 --- a/lms/djangoapps/bulk_email/signals.py +++ b/lms/djangoapps/bulk_email/signals.py @@ -1,12 +1,13 @@ """ Signal handlers for the bulk_email app """ - - +from django.contrib.auth import get_user_model from django.dispatch import receiver +from eventtracking import tracker from common.djangoapps.student.models import CourseEnrollment from openedx.core.djangoapps.user_api.accounts.signals import USER_RETIRE_MAILINGS +from edx_ace.signals import ACE_MESSAGE_SENT from .models import Optout @@ -24,3 +25,28 @@ def force_optout_all(sender, **kwargs): # lint-amnesty, pylint: disable=unused- for enrollment in CourseEnrollment.objects.filter(user=user): Optout.objects.get_or_create(user=user, course_id=enrollment.course.id) + + +@receiver(ACE_MESSAGE_SENT) +def ace_email_sent_handler(sender, **kwargs): + """ + When an email is sent using ACE, this method will create an event to detect ace email success status + """ + # Fetch the message object from kwargs, defaulting to None if not present + message = kwargs.get('message', None) + + user_model = get_user_model() + try: + user_id = user_model.objects.get(email=message.recipient.email_address).id + except user_model.DoesNotExist: + user_id = None + course_email = message.context.get('course_email', None) + course_id = course_email.course_id if course_email else None + tracker.emit( + 'edx.bulk_email.sent', + { + 'message_type': message.name, + 'course_id': course_id, + 'user_id': user_id, + } + ) diff --git a/lms/djangoapps/bulk_email/tasks.py b/lms/djangoapps/bulk_email/tasks.py index afad888fe0..60d45c1564 100644 --- a/lms/djangoapps/bulk_email/tasks.py +++ b/lms/djangoapps/bulk_email/tasks.py @@ -26,6 +26,7 @@ from django.utils import timezone from django.utils.translation import gettext as _ from django.utils.translation import override as override_language from edx_django_utils.monitoring import set_code_owner_attribute +from eventtracking import tracker from markupsafe import escape from common.djangoapps.util.date_utils import get_default_time_display @@ -467,7 +468,14 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas "send." ) raise exc - + tracker.emit( + 'edx.bulk_email.created', + { + 'course_id': str(course_email.course_id), + 'to_list': to_list, + 'total_recipients': total_recipients, + } + ) # Exclude optouts (if not a retry): # Note that we don't have to do the optout logic at all if this is a retry, # because we have presumably already performed the optout logic on the first diff --git a/lms/djangoapps/bulk_email/views.py b/lms/djangoapps/bulk_email/views.py index 528baf97b5..9276990915 100644 --- a/lms/djangoapps/bulk_email/views.py +++ b/lms/djangoapps/bulk_email/views.py @@ -7,6 +7,7 @@ import logging from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user from django.http import Http404 +from eventtracking import tracker from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey @@ -60,4 +61,12 @@ def opt_out_email_updates(request, token, course_id): course_id, ) + tracker.emit( + 'edx.bulk_email.opt_out', + { + 'course_id': course_id, + 'user_id': user.id, + } + ) + return render_to_response('bulk_email/unsubscribe_success.html', context) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 70250e00b8..bb2b85fe92 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -399,7 +399,7 @@ drf-yasg==1.21.7 # via # django-user-tasks # edx-api-doc-tools -edx-ace==1.11.0 +edx-ace==1.11.1 # via -r requirements/edx/kernel.in edx-api-doc-tools==1.8.0 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index da816531b5..349cbd91fe 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -656,7 +656,7 @@ drf-yasg==1.21.7 # -r requirements/edx/testing.txt # django-user-tasks # edx-api-doc-tools -edx-ace==1.11.0 +edx-ace==1.11.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index bda63ad22b..b7c4a67228 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -479,7 +479,7 @@ drf-yasg==1.21.7 # -r requirements/edx/base.txt # django-user-tasks # edx-api-doc-tools -edx-ace==1.11.0 +edx-ace==1.11.1 # via -r requirements/edx/base.txt edx-api-doc-tools==1.8.0 # via diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index deecea0d7e..6137e1cea1 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -503,7 +503,7 @@ drf-yasg==1.21.7 # -r requirements/edx/base.txt # django-user-tasks # edx-api-doc-tools -edx-ace==1.11.0 +edx-ace==1.11.1 # via -r requirements/edx/base.txt edx-api-doc-tools==1.8.0 # via