feat: fetched notifications based on time not date (#35250)

This commit is contained in:
Muhammad Adeel Tajamul
2024-08-12 06:18:33 +05:00
committed by GitHub
parent 10a427c28c
commit 25d5d084e0
3 changed files with 51 additions and 21 deletions

View File

@@ -70,10 +70,12 @@ def get_user_preferences_for_courses(course_ids, user):
return new_preferences
def send_digest_email_to_user(user, cadence_type, course_language='en', courses_data=None):
def send_digest_email_to_user(user, cadence_type, start_date, end_date, course_language='en', courses_data=None):
"""
Send [cadence_type] email to user.
Cadence Type can be EmailCadence.DAILY or EmailCadence.WEEKLY
start_date: Datetime object
end_date: Datetime object
"""
if cadence_type not in [EmailCadence.DAILY, EmailCadence.WEEKLY]:
raise ValueError('Invalid cadence_type')
@@ -81,7 +83,6 @@ def send_digest_email_to_user(user, cadence_type, course_language='en', courses_
if not is_email_notification_flag_enabled(user):
logger.info(f'<Email Cadence> Flag disabled for {user.username} ==Temp Log==')
return
start_date, end_date = get_start_end_date(cadence_type)
notifications = Notification.objects.filter(user=user, email=True,
created__gte=start_date, created__lte=end_date)
if not notifications:
@@ -115,6 +116,7 @@ def send_digest_email_to_all_users(cadence_type):
logger.info(f'<Email Cadence> Sending cadence email of type {cadence_type}')
users = get_audience_for_cadence_email(cadence_type)
courses_data = {}
start_date, end_date = get_start_end_date(cadence_type)
logger.info(f'<Email Cadence> Email Cadence Audience {len(users)}')
for user in users:
send_digest_email_to_user(user, cadence_type, courses_data=courses_data)
send_digest_email_to_user(user, cadence_type, start_date, end_date, courses_data=courses_data)

View File

@@ -16,6 +16,7 @@ from openedx.core.djangoapps.notifications.email.tasks import (
send_digest_email_to_all_users,
send_digest_email_to_user
)
from openedx.core.djangoapps.notifications.email.utils import get_start_end_date
from openedx.core.djangoapps.notifications.models import CourseNotificationPreference
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
@@ -42,8 +43,9 @@ class TestEmailDigestForUser(ModuleStoreTestCase):
"""
Tests email is sent iff waffle flag is enabled
"""
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert not mock_func.called
@ddt.data(True, False)
@@ -54,8 +56,9 @@ class TestEmailDigestForUser(ModuleStoreTestCase):
"""
created_date = datetime.datetime.now() - datetime.timedelta(days=1)
create_notification(self.user, self.course.id, created=created_date)
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, flag_value):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert mock_func.called is flag_value
@patch('edx_ace.ace.send')
@@ -63,9 +66,10 @@ class TestEmailDigestForUser(ModuleStoreTestCase):
"""
Tests email is not sent if notification is created on next day
"""
create_notification(self.user, self.course.id)
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
create_notification(self.user, self.course.id, created=end_date + datetime.timedelta(minutes=2))
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert not mock_func.called
@patch('edx_ace.ace.send')
@@ -73,12 +77,35 @@ class TestEmailDigestForUser(ModuleStoreTestCase):
"""
Tests email is not sent if notification is created day before yesterday
"""
created_date = datetime.datetime.now() - datetime.timedelta(days=2)
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
created_date = datetime.datetime.now() - datetime.timedelta(days=1, minutes=18)
create_notification(self.user, self.course.id, created=created_date)
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert not mock_func.called
@ddt.data(
(EmailCadence.DAILY, datetime.datetime.now() - datetime.timedelta(days=1, minutes=30), False),
(EmailCadence.DAILY, datetime.datetime.now() - datetime.timedelta(minutes=10), True),
(EmailCadence.DAILY, datetime.datetime.now() - datetime.timedelta(days=1), True),
(EmailCadence.DAILY, datetime.datetime.now() + datetime.timedelta(minutes=20), False),
(EmailCadence.WEEKLY, datetime.datetime.now() - datetime.timedelta(days=7, minutes=30), False),
(EmailCadence.WEEKLY, datetime.datetime.now() - datetime.timedelta(days=7), True),
(EmailCadence.WEEKLY, datetime.datetime.now() - datetime.timedelta(minutes=20), True),
(EmailCadence.WEEKLY, datetime.datetime.now() + datetime.timedelta(minutes=20), False),
)
@ddt.unpack
@patch('edx_ace.ace.send')
def test_notification_content(self, cadence_type, created_time, notification_created, mock_func):
"""
Tests email only contains notification created within date
"""
start_date, end_date = get_start_end_date(cadence_type)
create_notification(self.user, self.course.id, created=created_time)
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert mock_func.called is notification_created
@ddt.ddt
class TestEmailDigestAudience(ModuleStoreTestCase):
@@ -146,10 +173,11 @@ class TestEmailDigestAudience(ModuleStoreTestCase):
"""
Tests email is sent only when notifications with email=True exists
"""
created_date = datetime.datetime.now() - datetime.timedelta(days=1)
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
created_date = datetime.datetime.now() - datetime.timedelta(hours=23, minutes=59)
create_notification(self.user, self.course.id, created=created_date, email=email_value)
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert mock_func.called is email_value
@@ -166,7 +194,7 @@ class TestPreferences(ModuleStoreTestCase):
self.user = UserFactory()
self.course = CourseFactory.create(display_name='test course', run="Testing_course")
self.preference = CourseNotificationPreference.objects.create(user=self.user, course_id=self.course.id)
created_date = datetime.datetime.now() - datetime.timedelta(days=1)
created_date = datetime.datetime.now() - datetime.timedelta(hours=23)
create_notification(self.user, self.course.id, notification_type='new_discussion_post', created=created_date)
@patch('edx_ace.ace.send')
@@ -174,13 +202,14 @@ class TestPreferences(ModuleStoreTestCase):
"""
Tests email is send for digest notification preference
"""
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
config = self.preference.notification_preference_config
types = config['discussion']['notification_types']
types['new_discussion_post']['email_cadence'] = EmailCadence.DAILY
types['new_discussion_post']['email'] = True
self.preference.save()
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert mock_func.called
@ddt.data(True, False)
@@ -189,13 +218,14 @@ class TestPreferences(ModuleStoreTestCase):
"""
Tests email is sent iff preference value is True
"""
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
config = self.preference.notification_preference_config
types = config['discussion']['notification_types']
types['new_discussion_post']['email_cadence'] = EmailCadence.DAILY
types['new_discussion_post']['email'] = pref_value
self.preference.save()
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert mock_func.called is pref_value
@patch('edx_ace.ace.send')
@@ -203,10 +233,11 @@ class TestPreferences(ModuleStoreTestCase):
"""
Tests email is not send if digest notification preference doesnot match
"""
start_date, end_date = get_start_end_date(EmailCadence.DAILY)
config = self.preference.notification_preference_config
types = config['discussion']['notification_types']
types['new_discussion_post']['email_cadence'] = EmailCadence.WEEKLY
self.preference.save()
with override_waffle_flag(ENABLE_EMAIL_NOTIFICATIONS, True):
send_digest_email_to_user(self.user, EmailCadence.DAILY)
send_digest_email_to_user(self.user, EmailCadence.DAILY, start_date, end_date)
assert not mock_func.called

View File

@@ -171,13 +171,10 @@ def get_start_end_date(cadence_type):
"""
if cadence_type not in [EmailCadence.DAILY, EmailCadence.WEEKLY]:
raise ValueError('Invalid cadence_type')
date_today = datetime.datetime.now()
yesterday = date_today - datetime.timedelta(days=1)
end_date = datetime.datetime.combine(yesterday, datetime.time.max)
start_date = end_date
end_date = datetime.datetime.now()
start_date = end_date - datetime.timedelta(days=1, minutes=15)
if cadence_type == EmailCadence.WEEKLY:
start_date = end_date - datetime.timedelta(days=6)
start_date = datetime.datetime.combine(start_date, datetime.time.min)
start_date = start_date - datetime.timedelta(days=6)
return utc.localize(start_date), utc.localize(end_date)