Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions cms/djangoapps/contentstore/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from common.djangoapps.student.models import CourseEnrollment
from common.djangoapps.student.tests.factories import GlobalStaffFactory, InstructorFactory, UserFactory
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS
from openedx.core.djangoapps.notifications.models import CourseNotificationPreference, Notification
from openedx.core.djangoapps.notifications.models import Notification
from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration_context
from xmodule.modulestore import ModuleStoreEnum # lint-amnesty, pylint: disable=wrong-import-order
from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order
Expand Down Expand Up @@ -954,7 +954,6 @@ def setUp(self):
super().setUp()
self.user = UserFactory()
self.course = CourseFactory.create(org='testorg', number='testcourse', run='testrun')
CourseNotificationPreference.objects.create(user_id=self.user.id, course_id=self.course.id)

def test_course_update_notification_sent(self):
"""
Expand Down

This file was deleted.

51 changes: 23 additions & 28 deletions openedx/core/djangoapps/enrollments/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
from openedx.core.djangoapps.enrollments.errors import CourseEnrollmentError
from openedx.core.djangoapps.enrollments.views import EnrollmentUserThrottle
from openedx.core.djangoapps.notifications.config.waffle import ENABLE_NOTIFICATIONS
from openedx.core.djangoapps.notifications.models import CourseNotificationPreference
from openedx.core.djangoapps.oauth_dispatch.jwt import create_jwt_for_user
from openedx.core.djangoapps.user_api.models import RetirementState, UserOrgTag, UserRetirementStatus
from openedx.core.djangolib.testing.utils import skip_unless_lms
Expand All @@ -56,20 +55,20 @@ class EnrollmentTestMixin:
API_KEY = "i am a key"

def assert_enrollment_status(
self,
course_id=None,
username=None,
expected_status=status.HTTP_200_OK,
email_opt_in=None,
as_server=False,
mode=CourseMode.DEFAULT_MODE_SLUG,
is_active=None,
enrollment_attributes=None,
min_mongo_calls=0,
max_mongo_calls=0,
linked_enterprise_customer=None,
cohort=None,
force_enrollment=False,
self,
course_id=None,
username=None,
expected_status=status.HTTP_200_OK,
email_opt_in=None,
as_server=False,
mode=CourseMode.DEFAULT_MODE_SLUG,
is_active=None,
enrollment_attributes=None,
min_mongo_calls=0,
max_mongo_calls=0,
linked_enterprise_customer=None,
cohort=None,
force_enrollment=False,
):
"""
Enroll in the course and verify the response's status code. If the expected status is 200, also validates
Expand Down Expand Up @@ -199,10 +198,6 @@ def setUp(self):
password=self.PASSWORD,
)
self.client.login(username=self.USERNAME, password=self.PASSWORD)
CourseNotificationPreference.objects.create(
user=self.user,
course_id=self.course.id,
)

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

@ddt.data(
((CourseMode.DEFAULT_MODE_SLUG, ), CourseMode.DEFAULT_MODE_SLUG),
((CourseMode.DEFAULT_MODE_SLUG,), CourseMode.DEFAULT_MODE_SLUG),
((CourseMode.DEFAULT_MODE_SLUG, CourseMode.VERIFIED), CourseMode.DEFAULT_MODE_SLUG),
((CourseMode.DEFAULT_MODE_SLUG, CourseMode.VERIFIED), CourseMode.VERIFIED),
((CourseMode.PROFESSIONAL, ), CourseMode.PROFESSIONAL),
((CourseMode.NO_ID_PROFESSIONAL_MODE, ), CourseMode.NO_ID_PROFESSIONAL_MODE),
((CourseMode.PROFESSIONAL,), CourseMode.PROFESSIONAL),
((CourseMode.NO_ID_PROFESSIONAL_MODE,), CourseMode.NO_ID_PROFESSIONAL_MODE),
((CourseMode.VERIFIED, CourseMode.CREDIT_MODE), CourseMode.VERIFIED),
((CourseMode.VERIFIED, CourseMode.CREDIT_MODE), CourseMode.CREDIT_MODE),
)
Expand Down Expand Up @@ -1274,7 +1269,7 @@ def test_enterprise_course_enrollment_with_ec_uuid(self, mock_enterprise_custome
username='enterprise_worker',
linked_enterprise_customer='this-is-a-real-uuid',
)
assert httpretty.last_request().path == '/consent/api/v1/data_sharing_consent' # pylint: disable=no-member
assert httpretty.last_request().path == '/consent/api/v1/data_sharing_consent' # pylint: disable=no-member
assert httpretty.last_request().method == httpretty.POST

def test_enrollment_attributes_always_written(self):
Expand Down Expand Up @@ -1907,15 +1902,15 @@ def test_query_string_parameters_invalid_errors(self, query_params, error_fields

@ddt.data(
# Non-existent user
({'username': 'nobody'}, ),
({'username': 'nobody', 'course_id': 'e/d/X'}, ),
({'username': 'nobody'},),
({'username': 'nobody', 'course_id': 'e/d/X'},),

# Non-existent course
({'course_id': 'a/b/c'}, ),
({'course_id': 'a/b/c', 'username': 'student1'}, ),
({'course_id': 'a/b/c'},),
({'course_id': 'a/b/c', 'username': 'student1'},),

# Non-existent course and user
({'course_id': 'a/b/c', 'username': 'dummy'}, )
({'course_id': 'a/b/c', 'username': 'dummy'},)
)
@ddt.unpack
def test_non_existent_course_user(self, query_params):
Expand Down
63 changes: 5 additions & 58 deletions openedx/core/djangoapps/notifications/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.utils.translation import gettext_lazy as _

from .base_notification import COURSE_NOTIFICATION_APPS, COURSE_NOTIFICATION_TYPES
from .models import CourseNotificationPreference, Notification
from .models import Notification


class NotificationAppNameListFilter(admin.SimpleListFilter):
Expand All @@ -19,13 +19,13 @@ class NotificationAppNameListFilter(admin.SimpleListFilter):
def lookups(self, request, model_admin):
lookup_list = [
(app_name, app_name)
for app_name in COURSE_NOTIFICATION_APPS.keys()
for app_name in COURSE_NOTIFICATION_APPS
]
return lookup_list

def queryset(self, request, queryset):
app_name = self.value()
if app_name not in COURSE_NOTIFICATION_APPS.keys():
if app_name not in COURSE_NOTIFICATION_APPS:
return queryset
return queryset.filter(app_name=app_name)

Expand All @@ -40,13 +40,13 @@ class NotificationTypeListFilter(admin.SimpleListFilter):
def lookups(self, request, model_admin):
lookup_list = [
(notification_type, notification_type)
for notification_type in COURSE_NOTIFICATION_TYPES.keys()
for notification_type in COURSE_NOTIFICATION_TYPES
]
return lookup_list

def queryset(self, request, queryset):
notification_type = self.value()
if notification_type not in COURSE_NOTIFICATION_TYPES.keys():
if notification_type not in COURSE_NOTIFICATION_TYPES:
return queryset
return queryset.filter(notification_type=notification_type)

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


class CourseNotificationPreferenceAdmin(admin.ModelAdmin):
"""
Admin for Course Notification Preferences
"""
model = CourseNotificationPreference
raw_id_fields = ('user',)
list_display = ('get_username', 'course_id')
search_fields = ('course_id', 'user__username')
search_help_text = _('Search by username, course_id. '
'Specify fields with username: or course_id: prefixes. '
'If no prefix is specified, search will be done on username. \n'
'Examples: \n'
' - testuser (default username search) \n'
' - username:testuser (username keyword search) \n'
' - course_id:course-v1:edX+DemoX+Demo_Course (course_id keyword search) \n'
' - username:testuser, course_id:course-v1:edX+DemoX+Demo_Course (combined keyword search) \n'
)

@admin.display(description='Username', ordering='user__username')
def get_username(self, obj):
return obj.user.username

def get_queryset(self, request):
queryset = super().get_queryset(request)
return queryset.select_related("user").only("id", "user__username", "course_id")

def get_search_results(self, request, queryset, search_term):
"""
Custom search for CourseNotificationPreference model
"""
if search_term:
criteria = search_term.split(',')

for criterion in criteria:
criterion = criterion.strip()
if criterion.startswith('username:'):
queryset = queryset.filter(user__username=criterion.split(':')[1])

elif criterion.startswith('course_id:'):
criteria = criterion.split(':')
course_id = ':'.join(criteria[1:]).strip()
queryset = queryset.filter(course_id=course_id)

else:
queryset = queryset.filter(user__username=search_term)

else:
queryset = queryset.all()

return queryset, True


admin.site.register(Notification, NotificationAdmin)
admin.site.register(CourseNotificationPreference, CourseNotificationPreferenceAdmin)
Loading
Loading