Skip to content

Commit 9d2bbb1

Browse files
refactor: removed all references to CourseNotificationPreference (#37768)
1 parent 360a97f commit 9d2bbb1

File tree

20 files changed

+81
-953
lines changed

20 files changed

+81
-953
lines changed

cms/djangoapps/contentstore/tests/test_utils.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from common.djangoapps.student.models import CourseEnrollment
2626
from common.djangoapps.student.tests.factories import GlobalStaffFactory, InstructorFactory, UserFactory
2727
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS
28-
from openedx.core.djangoapps.notifications.models import CourseNotificationPreference, Notification
28+
from openedx.core.djangoapps.notifications.models import Notification
2929
from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration_context
3030
from xmodule.modulestore import ModuleStoreEnum # lint-amnesty, pylint: disable=wrong-import-order
3131
from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order
@@ -954,7 +954,6 @@ def setUp(self):
954954
super().setUp()
955955
self.user = UserFactory()
956956
self.course = CourseFactory.create(org='testorg', number='testcourse', run='testrun')
957-
CourseNotificationPreference.objects.create(user_id=self.user.id, course_id=self.course.id)
958957

959958
def test_course_update_notification_sent(self):
960959
"""

openedx/core/djangoapps/content/course_overviews/tests/test_serializers.py

Lines changed: 0 additions & 39 deletions
This file was deleted.

openedx/core/djangoapps/enrollments/tests/test_views.py

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
from openedx.core.djangoapps.enrollments.errors import CourseEnrollmentError
4141
from openedx.core.djangoapps.enrollments.views import EnrollmentUserThrottle
4242
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS
43-
from openedx.core.djangoapps.notifications.models import CourseNotificationPreference
4443
from openedx.core.djangoapps.oauth_dispatch.jwt import create_jwt_for_user
4544
from openedx.core.djangoapps.user_api.models import RetirementState, UserOrgTag, UserRetirementStatus
4645
from openedx.core.djangolib.testing.utils import skip_unless_lms
@@ -56,20 +55,20 @@ class EnrollmentTestMixin:
5655
API_KEY = "i am a key"
5756

5857
def assert_enrollment_status(
59-
self,
60-
course_id=None,
61-
username=None,
62-
expected_status=status.HTTP_200_OK,
63-
email_opt_in=None,
64-
as_server=False,
65-
mode=CourseMode.DEFAULT_MODE_SLUG,
66-
is_active=None,
67-
enrollment_attributes=None,
68-
min_mongo_calls=0,
69-
max_mongo_calls=0,
70-
linked_enterprise_customer=None,
71-
cohort=None,
72-
force_enrollment=False,
58+
self,
59+
course_id=None,
60+
username=None,
61+
expected_status=status.HTTP_200_OK,
62+
email_opt_in=None,
63+
as_server=False,
64+
mode=CourseMode.DEFAULT_MODE_SLUG,
65+
is_active=None,
66+
enrollment_attributes=None,
67+
min_mongo_calls=0,
68+
max_mongo_calls=0,
69+
linked_enterprise_customer=None,
70+
cohort=None,
71+
force_enrollment=False,
7372
):
7473
"""
7574
Enroll in the course and verify the response's status code. If the expected status is 200, also validates
@@ -199,10 +198,6 @@ def setUp(self):
199198
password=self.PASSWORD,
200199
)
201200
self.client.login(username=self.USERNAME, password=self.PASSWORD)
202-
CourseNotificationPreference.objects.create(
203-
user=self.user,
204-
course_id=self.course.id,
205-
)
206201

207202
@ddt.data(
208203
# Default (no course modes in the database)
@@ -982,11 +977,11 @@ def test_downgrade_enrollment_with_mode(self):
982977
assert course_mode == CourseMode.DEFAULT_MODE_SLUG
983978

984979
@ddt.data(
985-
((CourseMode.DEFAULT_MODE_SLUG, ), CourseMode.DEFAULT_MODE_SLUG),
980+
((CourseMode.DEFAULT_MODE_SLUG,), CourseMode.DEFAULT_MODE_SLUG),
986981
((CourseMode.DEFAULT_MODE_SLUG, CourseMode.VERIFIED), CourseMode.DEFAULT_MODE_SLUG),
987982
((CourseMode.DEFAULT_MODE_SLUG, CourseMode.VERIFIED), CourseMode.VERIFIED),
988-
((CourseMode.PROFESSIONAL, ), CourseMode.PROFESSIONAL),
989-
((CourseMode.NO_ID_PROFESSIONAL_MODE, ), CourseMode.NO_ID_PROFESSIONAL_MODE),
983+
((CourseMode.PROFESSIONAL,), CourseMode.PROFESSIONAL),
984+
((CourseMode.NO_ID_PROFESSIONAL_MODE,), CourseMode.NO_ID_PROFESSIONAL_MODE),
990985
((CourseMode.VERIFIED, CourseMode.CREDIT_MODE), CourseMode.VERIFIED),
991986
((CourseMode.VERIFIED, CourseMode.CREDIT_MODE), CourseMode.CREDIT_MODE),
992987
)
@@ -1274,7 +1269,7 @@ def test_enterprise_course_enrollment_with_ec_uuid(self, mock_enterprise_custome
12741269
username='enterprise_worker',
12751270
linked_enterprise_customer='this-is-a-real-uuid',
12761271
)
1277-
assert httpretty.last_request().path == '/consent/api/v1/data_sharing_consent' # pylint: disable=no-member
1272+
assert httpretty.last_request().path == '/consent/api/v1/data_sharing_consent' # pylint: disable=no-member
12781273
assert httpretty.last_request().method == httpretty.POST
12791274

12801275
def test_enrollment_attributes_always_written(self):
@@ -1907,15 +1902,15 @@ def test_query_string_parameters_invalid_errors(self, query_params, error_fields
19071902

19081903
@ddt.data(
19091904
# Non-existent user
1910-
({'username': 'nobody'}, ),
1911-
({'username': 'nobody', 'course_id': 'e/d/X'}, ),
1905+
({'username': 'nobody'},),
1906+
({'username': 'nobody', 'course_id': 'e/d/X'},),
19121907
19131908
# Non-existent course
1914-
({'course_id': 'a/b/c'}, ),
1915-
({'course_id': 'a/b/c', 'username': 'student1'}, ),
1909+
({'course_id': 'a/b/c'},),
1910+
({'course_id': 'a/b/c', 'username': 'student1'},),
19161911
19171912
# Non-existent course and user
1918-
({'course_id': 'a/b/c', 'username': 'dummy'}, )
1913+
({'course_id': 'a/b/c', 'username': 'dummy'},)
19191914
)
19201915
@ddt.unpack
19211916
def test_non_existent_course_user(self, query_params):

openedx/core/djangoapps/notifications/admin.py

Lines changed: 5 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.utils.translation import gettext_lazy as _
77

88
from .base_notification import COURSE_NOTIFICATION_APPS, COURSE_NOTIFICATION_TYPES
9-
from .models import CourseNotificationPreference, Notification
9+
from .models import Notification
1010

1111

1212
class NotificationAppNameListFilter(admin.SimpleListFilter):
@@ -19,13 +19,13 @@ class NotificationAppNameListFilter(admin.SimpleListFilter):
1919
def lookups(self, request, model_admin):
2020
lookup_list = [
2121
(app_name, app_name)
22-
for app_name in COURSE_NOTIFICATION_APPS.keys()
22+
for app_name in COURSE_NOTIFICATION_APPS
2323
]
2424
return lookup_list
2525

2626
def queryset(self, request, queryset):
2727
app_name = self.value()
28-
if app_name not in COURSE_NOTIFICATION_APPS.keys():
28+
if app_name not in COURSE_NOTIFICATION_APPS:
2929
return queryset
3030
return queryset.filter(app_name=app_name)
3131

@@ -40,13 +40,13 @@ class NotificationTypeListFilter(admin.SimpleListFilter):
4040
def lookups(self, request, model_admin):
4141
lookup_list = [
4242
(notification_type, notification_type)
43-
for notification_type in COURSE_NOTIFICATION_TYPES.keys()
43+
for notification_type in COURSE_NOTIFICATION_TYPES
4444
]
4545
return lookup_list
4646

4747
def queryset(self, request, queryset):
4848
notification_type = self.value()
49-
if notification_type not in COURSE_NOTIFICATION_TYPES.keys():
49+
if notification_type not in COURSE_NOTIFICATION_TYPES:
5050
return queryset
5151
return queryset.filter(notification_type=notification_type)
5252

@@ -60,57 +60,4 @@ class NotificationAdmin(admin.ModelAdmin):
6060
list_filter = (NotificationAppNameListFilter, NotificationTypeListFilter)
6161

6262

63-
class CourseNotificationPreferenceAdmin(admin.ModelAdmin):
64-
"""
65-
Admin for Course Notification Preferences
66-
"""
67-
model = CourseNotificationPreference
68-
raw_id_fields = ('user',)
69-
list_display = ('get_username', 'course_id')
70-
search_fields = ('course_id', 'user__username')
71-
search_help_text = _('Search by username, course_id. '
72-
'Specify fields with username: or course_id: prefixes. '
73-
'If no prefix is specified, search will be done on username. \n'
74-
'Examples: \n'
75-
' - testuser (default username search) \n'
76-
' - username:testuser (username keyword search) \n'
77-
' - course_id:course-v1:edX+DemoX+Demo_Course (course_id keyword search) \n'
78-
' - username:testuser, course_id:course-v1:edX+DemoX+Demo_Course (combined keyword search) \n'
79-
)
80-
81-
@admin.display(description='Username', ordering='user__username')
82-
def get_username(self, obj):
83-
return obj.user.username
84-
85-
def get_queryset(self, request):
86-
queryset = super().get_queryset(request)
87-
return queryset.select_related("user").only("id", "user__username", "course_id")
88-
89-
def get_search_results(self, request, queryset, search_term):
90-
"""
91-
Custom search for CourseNotificationPreference model
92-
"""
93-
if search_term:
94-
criteria = search_term.split(',')
95-
96-
for criterion in criteria:
97-
criterion = criterion.strip()
98-
if criterion.startswith('username:'):
99-
queryset = queryset.filter(user__username=criterion.split(':')[1])
100-
101-
elif criterion.startswith('course_id:'):
102-
criteria = criterion.split(':')
103-
course_id = ':'.join(criteria[1:]).strip()
104-
queryset = queryset.filter(course_id=course_id)
105-
106-
else:
107-
queryset = queryset.filter(user__username=search_term)
108-
109-
else:
110-
queryset = queryset.all()
111-
112-
return queryset, True
113-
114-
11563
admin.site.register(Notification, NotificationAdmin)
116-
admin.site.register(CourseNotificationPreference, CourseNotificationPreferenceAdmin)

0 commit comments

Comments
 (0)