Commit 7e984342 by Greg Price

Make notifier API resilient to bad enrollments

Previously, the user endpoint would would return 404 for any request
involving a user having an enrollment for a course that no longer
existed.
parent 62b840c5
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.http import Http404
from rest_framework import serializers from rest_framework import serializers
from course_groups.cohorts import is_course_cohorted from course_groups.cohorts import is_course_cohorted
...@@ -47,16 +48,20 @@ class NotifierUserSerializer(serializers.ModelSerializer): ...@@ -47,16 +48,20 @@ class NotifierUserSerializer(serializers.ModelSerializer):
for role in user.roles.all() for role in user.roles.all()
for perm in role.permissions.all() if perm.name == "see_all_cohorts" for perm in role.permissions.all() if perm.name == "see_all_cohorts"
} }
return { ret = {}
unicode(enrollment.course_id): { for enrollment in user.courseenrollment_set.all():
"cohort_id": cohort_id_map.get(enrollment.course_id), if enrollment.is_active:
"see_all_cohorts": ( try:
enrollment.course_id in see_all_cohorts_set or ret[unicode(enrollment.course_id)] = {
not is_course_cohorted(enrollment.course_id) "cohort_id": cohort_id_map.get(enrollment.course_id),
), "see_all_cohorts": (
} enrollment.course_id in see_all_cohorts_set or
for enrollment in user.courseenrollment_set.all() if enrollment.is_active not is_course_cohorted(enrollment.course_id)
} ),
}
except Http404: # is_course_cohorted raises this if course does not exist
pass
return ret
class Meta: class Meta:
model = User model = User
......
...@@ -120,6 +120,11 @@ class NotifierUsersViewSetTest(UrlResetMixin, ModuleStoreTestCase): ...@@ -120,6 +120,11 @@ class NotifierUsersViewSetTest(UrlResetMixin, ModuleStoreTestCase):
result = self._get_detail() result = self._get_detail()
self.assertEqual(result["course_info"], {}) self.assertEqual(result["course_info"], {})
def test_course_info_non_existent_course_enrollment(self):
CourseEnrollmentFactory(user=self.user)
result = self._get_detail()
self.assertEqual(result["course_info"], {})
def test_preferences(self): def test_preferences(self):
lang_pref = UserPreferenceFactory( lang_pref = UserPreferenceFactory(
user=self.user, user=self.user,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment