Skip to content

Commit 47a920d

Browse files
feat: added a policy to prevent sending ace messages to disabled users (#36584)
1 parent 7252348 commit 47a920d

7 files changed

Lines changed: 40 additions & 4 deletions

File tree

lms/djangoapps/bulk_email/messages.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def __init__(self, site, email_context):
8383
language=email_context['course_language'],
8484
user_context={"name": email_context['name']},
8585
)
86+
message.options['skip_disable_user_policy'] = True
8687
self.message = message
8788

8889
def send(self):

lms/djangoapps/course_goals/management/commands/goal_reminder_email.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,18 @@ def send_ace_message(goal, session_id):
105105
'programs_url': getattr(settings, 'ACE_EMAIL_PROGRAMS_URL', None),
106106
})
107107

108-
options = {'transactional': True}
108+
options = {
109+
'transactional': True,
110+
'skip_disable_user_policy': True
111+
}
109112

110113
is_ses_enabled = ENABLE_SES_FOR_GOALREMINDER.is_enabled(goal.course_key)
111114

112115
if is_ses_enabled:
113-
options = {
114-
'transactional': True,
116+
options.update({
115117
'from_address': settings.LMS_COMM_DEFAULT_FROM_EMAIL,
116118
'override_default_channel': 'django_email',
117-
}
119+
})
118120

119121
msg = Message(
120122
name="goalreminder",
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""Disable User Email OptOut Policy"""
2+
3+
import logging
4+
5+
from django.contrib.auth import get_user_model
6+
from edx_ace.channel import ChannelType
7+
from edx_ace.policy import Policy, PolicyResult
8+
9+
10+
User = get_user_model()
11+
log = logging.getLogger(__name__)
12+
13+
14+
class DisableUserOptout(Policy):
15+
"""
16+
Skips sending ace messages to disabled users
17+
"""
18+
def check(self, message):
19+
"""
20+
Checks if the user is disabled and if so, skips sending the message
21+
"""
22+
skip_disable_user_policy = message.options.get('skip_disable_user_policy', False)
23+
if skip_disable_user_policy:
24+
return PolicyResult(deny=set())
25+
user = User.objects.get(id=message.recipient.lms_user_id)
26+
if user.has_usable_password():
27+
return PolicyResult(deny=set())
28+
log.info(f"===> User is disabled - {user.email} - {message.name}")
29+
return PolicyResult(deny=set(ChannelType))

openedx/core/djangoapps/notifications/email/message_type.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ def __init__(self, *args, **kwargs):
1616
super().__init__(*args, **kwargs)
1717
self.options['transactional'] = True
1818
self.options['from_address'] = settings.NOTIFICATIONS_DEFAULT_FROM_EMAIL
19+
self.options['skip_disable_user_policy'] = True

openedx/core/djangoapps/schedules/tasks.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ def _schedule_send(msg_str, site_id, delivery_config_var, log_prefix): # lint-a
274274
site = Site.objects.select_related('configuration').get(pk=site_id)
275275
if _is_delivery_enabled(site, delivery_config_var, log_prefix):
276276
msg = Message.from_string(msg_str)
277+
msg.options['skip_disable_user_policy'] = True
277278

278279
user = User.objects.get(id=msg.recipient.lms_user_id)
279280
if not user.has_usable_password():

openedx/core/djangoapps/user_authn/message_types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ def __init__(self, *args, **kwargs):
1414

1515
# pylint: disable=unsupported-assignment-operation
1616
self.options['transactional'] = True
17+
self.options['skip_disable_user_policy'] = True
1718

1819

1920
class PasswordResetSuccess(BaseMessageType):

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
"openedx.ace.policy": [
133133
"bulk_email_optout = lms.djangoapps.bulk_email.policies:CourseEmailOptout",
134134
"course_push_notification_optout = openedx.core.djangoapps.notifications.policies:CoursePushNotificationOptout", # lint-amnesty, pylint: disable=line-too-long
135+
"disabled_user_optout = openedx.core.djangoapps.ace_common.policies:DisableUserOptout",
135136
],
136137
"openedx.call_to_action": [
137138
"personalized_learner_schedules = openedx.features.personalized_learner_schedules.call_to_action:PersonalizedLearnerScheduleCallToAction" # lint-amnesty, pylint: disable=line-too-long

0 commit comments

Comments
 (0)