chore: Remove notification app waffle flags (#37086)
This commit is contained in:
@@ -29,37 +29,6 @@ ENABLE_NOTIFICATIONS = CourseWaffleFlag(f'{WAFFLE_NAMESPACE}.enable_notification
|
||||
# .. toggle_tickets: INF-1259
|
||||
ENABLE_EMAIL_NOTIFICATIONS = WaffleFlag(f'{WAFFLE_NAMESPACE}.enable_email_notifications', __name__)
|
||||
|
||||
# .. toggle_name: notifications.enable_ora_grade_notifications
|
||||
# .. toggle_implementation: CourseWaffleFlag
|
||||
# .. toggle_default: False
|
||||
# .. toggle_description: Waffle flag to enable ORA grade notifications
|
||||
# .. toggle_use_cases: temporary, open_edx
|
||||
# .. toggle_creation_date: 2024-09-10
|
||||
# .. toggle_target_removal_date: 2024-10-10
|
||||
# .. toggle_tickets: INF-1304
|
||||
ENABLE_ORA_GRADE_NOTIFICATION = CourseWaffleFlag(f"{WAFFLE_NAMESPACE}.enable_ora_grade_notifications", __name__)
|
||||
|
||||
# .. toggle_name: notifications.enable_notification_grouping
|
||||
# .. toggle_implementation: CourseWaffleFlag
|
||||
# .. toggle_default: False
|
||||
# .. toggle_description: Waffle flag to enable the Notifications Grouping feature
|
||||
# .. toggle_use_cases: temporary, open_edx
|
||||
# .. toggle_creation_date: 2024-07-22
|
||||
# .. toggle_target_removal_date: 2025-06-01
|
||||
# .. toggle_warning: When the flag is ON, Notifications Grouping feature is enabled.
|
||||
# .. toggle_tickets: INF-1472
|
||||
ENABLE_NOTIFICATION_GROUPING = CourseWaffleFlag(f'{WAFFLE_NAMESPACE}.enable_notification_grouping', __name__)
|
||||
|
||||
# .. toggle_name: notifications.post_enable_notify_all_learners
|
||||
# .. toggle_implementation: CourseWaffleFlag
|
||||
# .. toggle_default: False
|
||||
# .. toggle_description: Waffle flag to enable the notify all learners on discussion post
|
||||
# .. toggle_use_cases: open_edx
|
||||
# .. toggle_creation_date: 2025-06-11
|
||||
# .. toggle_warning: When the flag is ON, notification to all learners feature is enabled on discussion post.
|
||||
# .. toggle_tickets: INF-1917
|
||||
ENABLE_NOTIFY_ALL_LEARNERS = CourseWaffleFlag(f'{WAFFLE_NAMESPACE}.enable_post_notify_all_learners', __name__)
|
||||
|
||||
# .. toggle_name: notifications.enable_push_notifications
|
||||
# .. toggle_implementation: CourseWaffleFlag
|
||||
# .. toggle_default: False
|
||||
@@ -69,14 +38,3 @@ ENABLE_NOTIFY_ALL_LEARNERS = CourseWaffleFlag(f'{WAFFLE_NAMESPACE}.enable_post_n
|
||||
# .. toggle_target_removal_date: 2026-05-27
|
||||
# .. toggle_warning: When the flag is ON, Notifications will go through ace push channels.
|
||||
ENABLE_PUSH_NOTIFICATIONS = CourseWaffleFlag(f'{WAFFLE_NAMESPACE}.enable_push_notifications', __name__)
|
||||
|
||||
# .. toggle_name: notifications.enable_account_level_preferences
|
||||
# .. toggle_implementation: CourseWaffleFlag
|
||||
# .. toggle_default: False
|
||||
# .. toggle_description: Waffle flag to enable account level preferences for notifications
|
||||
# .. toggle_use_cases: temporary, open_edx
|
||||
# .. toggle_creation_date: 2025-04-29
|
||||
# .. toggle_target_removal_date: 2025-07-29
|
||||
# .. toggle_warning: When the flag is ON, account level preferences for notifications are enabled.
|
||||
# .. toggle_tickets: INF-1472
|
||||
ENABLE_ACCOUNT_LEVEL_PREFERENCES = WaffleFlag(f'{WAFFLE_NAMESPACE}.enable_account_level_preferences', __name__)
|
||||
|
||||
@@ -10,7 +10,6 @@ from edx_ace import ace
|
||||
from edx_ace.recipient import Recipient
|
||||
from edx_django_utils.monitoring import set_code_owner_attribute
|
||||
|
||||
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_ACCOUNT_LEVEL_PREFERENCES
|
||||
from openedx.core.djangoapps.notifications.email_notifications import EmailCadence
|
||||
from openedx.core.djangoapps.notifications.models import (
|
||||
CourseNotificationPreference,
|
||||
@@ -26,12 +25,10 @@ from .utils import (
|
||||
create_email_digest_context,
|
||||
create_email_template_context,
|
||||
filter_email_enabled_notifications,
|
||||
filter_notification_with_email_enabled_preferences,
|
||||
get_course_info,
|
||||
get_language_preference_for_users,
|
||||
get_start_end_date,
|
||||
get_text_for_notification_type,
|
||||
get_unique_course_ids,
|
||||
is_email_notification_flag_enabled,
|
||||
)
|
||||
|
||||
@@ -102,14 +99,9 @@ def send_digest_email_to_user(user, cadence_type, start_date, end_date, user_lan
|
||||
return
|
||||
|
||||
with translation_override(user_language):
|
||||
if ENABLE_ACCOUNT_LEVEL_PREFERENCES.is_enabled():
|
||||
preferences = NotificationPreference.objects.filter(user=user)
|
||||
notifications = filter_email_enabled_notifications(notifications, preferences, user,
|
||||
cadence_type=cadence_type)
|
||||
else:
|
||||
course_ids = get_unique_course_ids(notifications)
|
||||
preferences = get_user_preferences_for_courses(course_ids, user)
|
||||
notifications = filter_notification_with_email_enabled_preferences(notifications, preferences, cadence_type)
|
||||
preferences = NotificationPreference.objects.filter(user=user)
|
||||
notifications = filter_email_enabled_notifications(notifications, preferences, user,
|
||||
cadence_type=cadence_type)
|
||||
|
||||
if not notifications:
|
||||
logger.info(f'<Email Cadence> No filtered notification for {user.username} ==Temp Log==')
|
||||
|
||||
@@ -10,7 +10,7 @@ from edx_toggles.toggles.testutils import override_waffle_flag
|
||||
|
||||
from common.djangoapps.student.tests.factories import UserFactory
|
||||
from openedx.core.djangoapps.notifications.config.waffle import (
|
||||
ENABLE_ACCOUNT_LEVEL_PREFERENCES, ENABLE_NOTIFICATIONS, ENABLE_EMAIL_NOTIFICATIONS
|
||||
ENABLE_NOTIFICATIONS, ENABLE_EMAIL_NOTIFICATIONS
|
||||
)
|
||||
from openedx.core.djangoapps.notifications.tasks import send_notifications
|
||||
from openedx.core.djangoapps.notifications.email_notifications import EmailCadence
|
||||
@@ -127,7 +127,6 @@ class TestEmailDigestForUser(ModuleStoreTestCase):
|
||||
assert mock_func.called is notification_created
|
||||
|
||||
|
||||
@override_waffle_flag(ENABLE_ACCOUNT_LEVEL_PREFERENCES, True)
|
||||
@ddt.ddt
|
||||
class TestEmailDigestForUserWithAccountPreferences(ModuleStoreTestCase):
|
||||
"""
|
||||
@@ -331,11 +330,10 @@ class TestPreferences(ModuleStoreTestCase):
|
||||
self.preference.save()
|
||||
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
|
||||
assert not mock_func.called
|
||||
|
||||
@ddt.data(True, False)
|
||||
@patch('edx_ace.ace.send')
|
||||
def test_email_send_for_email_preference_value(self, pref_value, mock_func):
|
||||
def test_email_send_for_email_preference_value(self, mock_func):
|
||||
"""
|
||||
Tests email is sent iff preference value is True
|
||||
"""
|
||||
@@ -343,11 +341,11 @@ class TestPreferences(ModuleStoreTestCase):
|
||||
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
|
||||
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, start_date, end_date)
|
||||
assert mock_func.called is pref_value
|
||||
assert not mock_func.called
|
||||
|
||||
@patch('edx_ace.ace.send')
|
||||
def test_email_not_send_if_different_digest_preference(self, mock_func):
|
||||
@@ -364,7 +362,6 @@ class TestPreferences(ModuleStoreTestCase):
|
||||
assert not mock_func.called
|
||||
|
||||
|
||||
@override_waffle_flag(ENABLE_ACCOUNT_LEVEL_PREFERENCES, True)
|
||||
@ddt.ddt
|
||||
class TestAccountPreferences(ModuleStoreTestCase):
|
||||
"""
|
||||
@@ -435,17 +432,21 @@ class TestImmediateEmail(ModuleStoreTestCase):
|
||||
super().setUp()
|
||||
self.user = UserFactory()
|
||||
self.course = CourseFactory.create(display_name='test course', run="Testing_course")
|
||||
self.preference, _ = NotificationPreference.objects.get_or_create(
|
||||
user=self.user,
|
||||
type='new_discussion_post',
|
||||
app='discussion'
|
||||
)
|
||||
|
||||
@patch('edx_ace.ace.send')
|
||||
def test_email_sent_when_cadence_is_immediate(self, mock_func):
|
||||
"""
|
||||
Tests email is sent when cadence is immediate
|
||||
"""
|
||||
preference = CourseNotificationPreference.objects.create(user=self.user, course_id=self.course.id)
|
||||
app_prefs = preference.notification_preference_config['discussion']['notification_types']
|
||||
app_prefs['new_discussion_post']['email'] = True
|
||||
app_prefs['new_discussion_post']['email_cadence'] = EmailCadence.IMMEDIATELY
|
||||
preference.save()
|
||||
|
||||
self.preference.email = True
|
||||
self.preference.email_cadence = EmailCadence.IMMEDIATELY
|
||||
self.preference.save()
|
||||
context = {
|
||||
'username': 'User',
|
||||
'post_title': 'title'
|
||||
@@ -461,7 +462,9 @@ class TestImmediateEmail(ModuleStoreTestCase):
|
||||
"""
|
||||
Tests email is not sent when cadence is not immediate
|
||||
"""
|
||||
CourseNotificationPreference.objects.create(user=self.user, course_id=self.course.id)
|
||||
self.preference.email = True
|
||||
self.preference.email_cadence = EmailCadence.DAILY
|
||||
self.preference.save()
|
||||
context = {
|
||||
'replier_name': 'User',
|
||||
'post_title': 'title'
|
||||
|
||||
@@ -24,7 +24,7 @@ from openedx.core.djangoapps.notifications.audience_filters import (
|
||||
TeamAudienceFilter
|
||||
)
|
||||
from openedx.core.djangoapps.notifications.base_notification import NotificationAppManager, COURSE_NOTIFICATION_TYPES
|
||||
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS, ENABLE_ORA_GRADE_NOTIFICATION
|
||||
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS
|
||||
from openedx.core.djangoapps.notifications.email import ONE_CLICK_EMAIL_UNSUB_KEY
|
||||
from openedx.core.djangoapps.notifications.models import CourseNotificationPreference, NotificationPreference
|
||||
from openedx.core.djangoapps.notifications.tasks import create_notification_preference
|
||||
@@ -107,11 +107,6 @@ def generate_user_notifications(signal, sender, notification_data, metadata, **k
|
||||
"""
|
||||
Watches for USER_NOTIFICATION_REQUESTED signal and calls send_web_notifications task
|
||||
"""
|
||||
if (
|
||||
notification_data.notification_type == 'ora_grade_assigned'
|
||||
and not ENABLE_ORA_GRADE_NOTIFICATION.is_enabled(notification_data.course_key)
|
||||
):
|
||||
return
|
||||
|
||||
from openedx.core.djangoapps.notifications.tasks import send_notifications
|
||||
notification_data = notification_data.__dict__
|
||||
|
||||
@@ -24,9 +24,7 @@ from openedx.core.djangoapps.notifications.base_notification import (
|
||||
|
||||
from openedx.core.djangoapps.notifications.email.tasks import send_immediate_cadence_email
|
||||
from openedx.core.djangoapps.notifications.config.waffle import (
|
||||
ENABLE_NOTIFICATION_GROUPING,
|
||||
ENABLE_NOTIFICATIONS,
|
||||
ENABLE_ACCOUNT_LEVEL_PREFERENCES,
|
||||
ENABLE_PUSH_NOTIFICATIONS
|
||||
)
|
||||
from openedx.core.djangoapps.notifications.email_notifications import EmailCadence
|
||||
@@ -141,14 +139,11 @@ def send_notifications(user_ids, course_key: str, app_name, notification_type, c
|
||||
if not is_notification_valid(notification_type, context):
|
||||
raise ValidationError(f"Notification is not valid {app_name} {notification_type} {context}")
|
||||
|
||||
account_level_pref_enabled = ENABLE_ACCOUNT_LEVEL_PREFERENCES.is_enabled()
|
||||
|
||||
user_ids = list(set(user_ids))
|
||||
batch_size = settings.NOTIFICATION_CREATION_BATCH_SIZE
|
||||
group_by_id = context.pop('group_by_id', '')
|
||||
grouping_function = NotificationRegistry.get_grouper(notification_type)
|
||||
waffle_flag_enabled = ENABLE_NOTIFICATION_GROUPING.is_enabled(course_key)
|
||||
grouping_enabled = waffle_flag_enabled and group_by_id and grouping_function is not None
|
||||
grouping_enabled = group_by_id and grouping_function is not None
|
||||
generated_notification = None
|
||||
sender_id = context.pop('sender_id', None)
|
||||
default_web_config = get_default_values_of_preference(app_name, notification_type).get('web', False)
|
||||
@@ -157,13 +152,6 @@ def send_notifications(user_ids, course_key: str, app_name, notification_type, c
|
||||
push_notification_audience = []
|
||||
is_push_notification_enabled = ENABLE_PUSH_NOTIFICATIONS.is_enabled(course_key)
|
||||
|
||||
if group_by_id and not grouping_enabled:
|
||||
logger.info(
|
||||
f"Waffle flag for group notifications: {waffle_flag_enabled}. "
|
||||
f"Grouper registered for '{notification_type}': {bool(grouping_function)}. "
|
||||
f"Group by ID: {group_by_id} ==Temp Log=="
|
||||
)
|
||||
|
||||
for batch_user_ids in get_list_in_batches(user_ids, batch_size):
|
||||
logger.debug(f'Sending notifications to {len(batch_user_ids)} users in {course_key}')
|
||||
batch_user_ids = NotificationFilter().apply_filters(batch_user_ids, course_key, notification_type)
|
||||
@@ -174,27 +162,19 @@ def send_notifications(user_ids, course_key: str, app_name, notification_type, c
|
||||
if grouping_enabled else {}
|
||||
|
||||
# check if what is preferences of user and make decision to send notification or not
|
||||
if account_level_pref_enabled:
|
||||
preferences = NotificationPreference.objects.filter(
|
||||
user_id__in=batch_user_ids,
|
||||
app=app_name,
|
||||
type=notification_type
|
||||
|
||||
)
|
||||
else:
|
||||
preferences = CourseNotificationPreference.objects.filter(
|
||||
user_id__in=batch_user_ids,
|
||||
course_id=course_key,
|
||||
)
|
||||
preferences = NotificationPreference.objects.filter(
|
||||
user_id__in=batch_user_ids,
|
||||
app=app_name,
|
||||
type=notification_type
|
||||
|
||||
)
|
||||
|
||||
preferences = list(preferences)
|
||||
if default_web_config:
|
||||
if account_level_pref_enabled:
|
||||
preferences = create_account_notification_pref_if_not_exists(
|
||||
batch_user_ids, preferences, notification_type
|
||||
)
|
||||
else:
|
||||
preferences = create_notification_pref_if_not_exists(batch_user_ids, preferences, course_key)
|
||||
preferences = create_account_notification_pref_if_not_exists(
|
||||
batch_user_ids, preferences, notification_type
|
||||
)
|
||||
|
||||
if not preferences:
|
||||
continue
|
||||
@@ -202,8 +182,6 @@ def send_notifications(user_ids, course_key: str, app_name, notification_type, c
|
||||
notifications = []
|
||||
for preference in preferences:
|
||||
user_id = preference.user_id
|
||||
if not account_level_pref_enabled:
|
||||
preference = update_user_preference(preference, user_id, course_key)
|
||||
|
||||
if (
|
||||
preference and
|
||||
|
||||
@@ -15,7 +15,7 @@ from common.djangoapps.student.tests.factories import UserFactory
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory
|
||||
|
||||
from ..config.waffle import ENABLE_NOTIFICATION_GROUPING, ENABLE_NOTIFICATIONS, ENABLE_PUSH_NOTIFICATIONS
|
||||
from ..config.waffle import ENABLE_NOTIFICATIONS, ENABLE_PUSH_NOTIFICATIONS
|
||||
from ..models import CourseNotificationPreference, Notification
|
||||
from ..tasks import (
|
||||
create_notification_pref_if_not_exists,
|
||||
@@ -190,9 +190,8 @@ class SendNotificationsTest(ModuleStoreTestCase):
|
||||
preference.save()
|
||||
|
||||
send_notifications([self.user.id], str(self.course_1.id), app_name, notification_type, context, content_url)
|
||||
self.assertEqual(len(Notification.objects.all()), 0)
|
||||
self.assertEqual(len(Notification.objects.all()), 1)
|
||||
|
||||
@override_waffle_flag(ENABLE_NOTIFICATION_GROUPING, True)
|
||||
@override_waffle_flag(ENABLE_NOTIFICATIONS, active=True)
|
||||
@override_waffle_flag(ENABLE_PUSH_NOTIFICATIONS, active=True)
|
||||
def test_send_notification_with_grouping_enabled(self):
|
||||
@@ -227,8 +226,8 @@ class SendNotificationsTest(ModuleStoreTestCase):
|
||||
{**context},
|
||||
content_url
|
||||
)
|
||||
self.assertEqual(Notification.objects.filter(user_id=self.user.id).count(), 1)
|
||||
user_notifications_mock.assert_called_once()
|
||||
self.assertEqual(Notification.objects.filter(user_id=self.user.id).count(), 0)
|
||||
user_notifications_mock.assert_not_called()
|
||||
|
||||
@override_waffle_flag(ENABLE_NOTIFICATIONS, active=True)
|
||||
def test_notification_not_created_when_context_is_incomplete(self):
|
||||
@@ -269,9 +268,9 @@ class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
|
||||
@override_waffle_flag(ENABLE_NOTIFICATIONS, active=True)
|
||||
@ddt.data(
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE, 14, 7),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE + 10, 16, 10),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE - 10, 14, 6),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE, 10, 3),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE + 10, 12, 5),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE - 10, 10, 3),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_notification_is_send_in_batch(self, creation_size, prefs_query_count, notifications_query_count):
|
||||
@@ -322,7 +321,7 @@ class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
"username": "Test Author"
|
||||
}
|
||||
with override_waffle_flag(ENABLE_NOTIFICATIONS, active=True):
|
||||
with self.assertNumQueries(14):
|
||||
with self.assertNumQueries(10):
|
||||
send_notifications(user_ids, str(self.course.id), notification_app, notification_type,
|
||||
context, "http://test.url")
|
||||
|
||||
@@ -342,7 +341,7 @@ class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
}
|
||||
with override_waffle_flag(ENABLE_NOTIFICATIONS, active=True):
|
||||
with override_waffle_flag(ENABLE_PUSH_NOTIFICATIONS, active=True):
|
||||
with self.assertNumQueries(16):
|
||||
with self.assertNumQueries(12):
|
||||
send_notifications(user_ids, str(self.course.id), notification_app, notification_type,
|
||||
context, "http://test.url")
|
||||
|
||||
@@ -481,9 +480,9 @@ class NotificationCreationOnChannelsTests(ModuleStoreTestCase):
|
||||
@override_waffle_flag(ENABLE_NOTIFICATIONS, active=True)
|
||||
@ddt.data(
|
||||
(False, False, 0),
|
||||
(False, True, 1),
|
||||
(True, False, 1),
|
||||
(True, True, 1),
|
||||
(False, True, 0),
|
||||
(True, False, 0),
|
||||
(True, True, 0),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_notification_is_created_when_any_channel_is_enabled(self, web_value, email_value, generated_count):
|
||||
|
||||
@@ -15,7 +15,7 @@ from common.djangoapps.student.tests.factories import UserFactory
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory
|
||||
|
||||
from ..config.waffle import ENABLE_ACCOUNT_LEVEL_PREFERENCES, ENABLE_NOTIFICATION_GROUPING, ENABLE_NOTIFICATIONS
|
||||
from ..config.waffle import ENABLE_NOTIFICATIONS
|
||||
from ..models import CourseNotificationPreference, Notification, NotificationPreference
|
||||
from ..tasks import (
|
||||
create_notification_pref_if_not_exists,
|
||||
@@ -27,7 +27,6 @@ from .utils import create_notification
|
||||
|
||||
|
||||
@patch('openedx.core.djangoapps.notifications.models.COURSE_NOTIFICATION_CONFIG_VERSION', 1)
|
||||
@override_waffle_flag(ENABLE_ACCOUNT_LEVEL_PREFERENCES, active=True)
|
||||
class TestNotificationsTasks(ModuleStoreTestCase):
|
||||
"""
|
||||
Tests for notifications tasks.
|
||||
@@ -92,7 +91,6 @@ class TestNotificationsTasks(ModuleStoreTestCase):
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@override_waffle_flag(ENABLE_ACCOUNT_LEVEL_PREFERENCES, active=True)
|
||||
class SendNotificationsTest(ModuleStoreTestCase):
|
||||
"""
|
||||
Tests for send_notifications.
|
||||
@@ -201,7 +199,6 @@ class SendNotificationsTest(ModuleStoreTestCase):
|
||||
send_notifications([self.user.id], str(self.course_1.id), app_name, notification_type, context, content_url)
|
||||
self.assertEqual(len(Notification.objects.all()), 0)
|
||||
|
||||
@override_waffle_flag(ENABLE_NOTIFICATION_GROUPING, True)
|
||||
@override_waffle_flag(ENABLE_NOTIFICATIONS, active=True)
|
||||
def test_send_notification_with_grouping_enabled(self):
|
||||
"""
|
||||
@@ -255,7 +252,6 @@ class SendNotificationsTest(ModuleStoreTestCase):
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@override_waffle_flag(ENABLE_ACCOUNT_LEVEL_PREFERENCES, active=True)
|
||||
class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
"""
|
||||
Test that notification and notification preferences are created in batches
|
||||
@@ -286,9 +282,9 @@ class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
|
||||
@override_waffle_flag(ENABLE_NOTIFICATIONS, active=True)
|
||||
@ddt.data(
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE, 14, 5),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE + 10, 16, 7),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE - 10, 14, 5),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE, 10, 3),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE + 10, 12, 5),
|
||||
(settings.NOTIFICATION_CREATION_BATCH_SIZE - 10, 10, 3),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_notification_is_send_in_batch(self, creation_size, prefs_query_count, notifications_query_count):
|
||||
@@ -338,7 +334,7 @@ class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
"username": "Test Author"
|
||||
}
|
||||
with override_waffle_flag(ENABLE_NOTIFICATIONS, active=True):
|
||||
with self.assertNumQueries(14):
|
||||
with self.assertNumQueries(10):
|
||||
send_notifications(user_ids, str(self.course.id), notification_app, notification_type,
|
||||
context, "http://test.url")
|
||||
|
||||
@@ -358,7 +354,7 @@ class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
"replier_name": "Replier Name"
|
||||
}
|
||||
with override_waffle_flag(ENABLE_NOTIFICATIONS, active=True):
|
||||
with self.assertNumQueries(16):
|
||||
with self.assertNumQueries(12):
|
||||
send_notifications(user_ids, str(self.course.id), notification_app, notification_type,
|
||||
context, "http://test.url")
|
||||
|
||||
@@ -403,7 +399,6 @@ class SendBatchNotificationsTest(ModuleStoreTestCase):
|
||||
self.assertEqual(len(Notification.objects.all()), generated_count)
|
||||
|
||||
|
||||
@override_waffle_flag(ENABLE_ACCOUNT_LEVEL_PREFERENCES, active=True)
|
||||
class TestDeleteNotificationTask(ModuleStoreTestCase):
|
||||
"""
|
||||
Tests delete_notification_function
|
||||
@@ -509,45 +504,6 @@ class NotificationCreationOnChannelsTests(ModuleStoreTestCase):
|
||||
(True, True, 1),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_notification_is_created_when_any_channel_is_enabled(self, web_value, email_value, generated_count):
|
||||
"""
|
||||
Tests if notification is created if any preference is enabled
|
||||
"""
|
||||
app_name = 'discussion'
|
||||
notification_type = 'new_discussion_post'
|
||||
app_prefs = self.preference.notification_preference_config[app_name]
|
||||
app_prefs['notification_types'][notification_type]['web'] = web_value
|
||||
app_prefs['notification_types'][notification_type]['email'] = email_value
|
||||
kwargs = {
|
||||
'user_ids': [self.user.id],
|
||||
'course_key': str(self.course.id),
|
||||
'app_name': app_name,
|
||||
'notification_type': notification_type,
|
||||
'content_url': 'https://example.com/',
|
||||
'context': {
|
||||
'post_title': 'Post title',
|
||||
'username': 'user name',
|
||||
},
|
||||
}
|
||||
self.preference.save()
|
||||
with patch('openedx.core.djangoapps.notifications.tasks.notification_generated_event') as event_mock:
|
||||
send_notifications(**kwargs)
|
||||
notifications = Notification.objects.all()
|
||||
assert len(notifications) == generated_count
|
||||
if notifications:
|
||||
notification = Notification.objects.all()[0]
|
||||
assert notification.web == web_value
|
||||
assert notification.email == email_value
|
||||
|
||||
@override_waffle_flag(ENABLE_NOTIFICATIONS, active=True)
|
||||
@override_waffle_flag(ENABLE_ACCOUNT_LEVEL_PREFERENCES, active=True)
|
||||
@ddt.data(
|
||||
(False, False, 0),
|
||||
(False, True, 1),
|
||||
(True, False, 1),
|
||||
(True, True, 1),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_notification_is_created_when_any_channel_is_account_level(self, web_value, email_value, generated_count):
|
||||
"""
|
||||
Tests if notification is created if any preference is enabled on account level preferences
|
||||
|
||||
@@ -341,10 +341,18 @@ class UserNotificationPreferenceAPITest(ModuleStoreTestCase):
|
||||
'info': '',
|
||||
'email_cadence': 'Daily',
|
||||
},
|
||||
'new_instructor_all_learners_post': {
|
||||
'web': True,
|
||||
'email': False,
|
||||
'push': False,
|
||||
'email_cadence': 'Daily',
|
||||
'info': ''
|
||||
},
|
||||
},
|
||||
'non_editable': {
|
||||
'new_discussion_post': ['push'],
|
||||
'new_question_post': ['push'],
|
||||
'new_instructor_all_learners_post': ['push'],
|
||||
}
|
||||
},
|
||||
'updates': {
|
||||
@@ -1450,6 +1458,7 @@ class GetAggregateNotificationPreferencesTest(APITestCase):
|
||||
self.assertDictEqual(prefs['discussion']['non_editable'], {
|
||||
'new_discussion_post': ['push'],
|
||||
'new_question_post': ['push'],
|
||||
'new_instructor_all_learners_post': ['push'],
|
||||
'core': ['web']
|
||||
})
|
||||
|
||||
|
||||
@@ -4,11 +4,9 @@ Utils function for notifications app
|
||||
import copy
|
||||
from typing import Dict, List, Set
|
||||
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
|
||||
from common.djangoapps.student.models import CourseAccessRole, CourseEnrollment
|
||||
from openedx.core.djangoapps.django_comment_common.models import Role
|
||||
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS, ENABLE_NOTIFY_ALL_LEARNERS
|
||||
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS
|
||||
from openedx.core.djangoapps.notifications.email_notifications import EmailCadence
|
||||
from openedx.core.lib.cache_utils import request_cached
|
||||
|
||||
@@ -143,13 +141,6 @@ def remove_preferences_with_no_access(preferences: dict, user) -> dict:
|
||||
user_course_roles
|
||||
)
|
||||
|
||||
course_key = CourseKey.from_string(preferences['course_id'])
|
||||
discussion_config = user_preferences.get('discussion', {})
|
||||
notification_types = discussion_config.get('notification_types', {})
|
||||
|
||||
if notification_types and not ENABLE_NOTIFY_ALL_LEARNERS.is_enabled(course_key):
|
||||
notification_types.pop('new_instructor_all_learners_post', None)
|
||||
|
||||
return preferences
|
||||
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ from openedx.core.djangoapps.user_api.models import UserPreference
|
||||
|
||||
from .base_notification import COURSE_NOTIFICATION_APPS, NotificationAppManager, COURSE_NOTIFICATION_TYPES, \
|
||||
NotificationTypeManager
|
||||
from .config.waffle import ENABLE_NOTIFICATIONS, ENABLE_NOTIFY_ALL_LEARNERS
|
||||
from .config.waffle import ENABLE_NOTIFICATIONS
|
||||
from .events import (
|
||||
notification_preference_update_event,
|
||||
notification_preferences_viewed_event,
|
||||
@@ -619,12 +619,6 @@ class AggregatedNotificationPreferences(APIView):
|
||||
notification_preferences_viewed_event(request)
|
||||
notification_configs = add_info_to_notification_config(notification_configs)
|
||||
|
||||
discussion_config = notification_configs.get('discussion', {})
|
||||
notification_types = discussion_config.get('notification_types', {})
|
||||
|
||||
if not any(ENABLE_NOTIFY_ALL_LEARNERS.is_enabled(course_key) for course_key in course_ids):
|
||||
notification_types.pop('new_instructor_all_learners_post', None)
|
||||
|
||||
return Response({
|
||||
'status': 'success',
|
||||
'message': 'Notification preferences retrieved',
|
||||
|
||||
Reference in New Issue
Block a user