feat: add pagination in course enrollment list API (#32546)
* feat: add pagination in course enrollment list API * refactor: enrollment course list API * refactor: follow best practice in course enrollment list API
This commit is contained in:
@@ -76,9 +76,12 @@ class CourseEnrollmentListViewTest(ModuleStoreTestCase):
|
||||
response = self.client.get(url)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
data = response.data['results']
|
||||
enrollments = CourseEnrollment.objects.filter(user=self.user, is_active=True)
|
||||
expected_data = NotificationCourseEnrollmentSerializer(enrollments, many=True).data
|
||||
self.assertEqual(response.data, expected_data)
|
||||
|
||||
self.assertEqual(len(data), 1)
|
||||
self.assertEqual(data, expected_data)
|
||||
|
||||
def test_course_enrollment_api_permission(self):
|
||||
"""
|
||||
|
||||
@@ -36,23 +36,31 @@ class CourseEnrollmentListView(generics.ListAPIView):
|
||||
API endpoint to get active CourseEnrollments for requester.
|
||||
|
||||
**Permissions**: User must be authenticated.
|
||||
**Response Format** (paginated):
|
||||
|
||||
**Response Format**:
|
||||
[
|
||||
{
|
||||
"course": {
|
||||
"id": (int) course_id,
|
||||
"display_name": (str) course_display_name
|
||||
{
|
||||
"next": (str) url_to_next_page_of_courses,
|
||||
"previous": (str) url_to_previous_page_of_courses,
|
||||
"count": (int) total_number_of_courses,
|
||||
"num_pages": (int) total_number_of_pages,
|
||||
"current_page": (int) current_page_number,
|
||||
"start": (int) index_of_first_course_on_page,
|
||||
"results" : [
|
||||
{
|
||||
"course": {
|
||||
"id": (int) course_id,
|
||||
"display_name": (str) course_display_name
|
||||
},
|
||||
},
|
||||
},
|
||||
...
|
||||
]
|
||||
**Response Error Codes**:
|
||||
- 403: The requester cannot access resource.
|
||||
...
|
||||
],
|
||||
}
|
||||
|
||||
Response Error Codes:
|
||||
- 403: The requester cannot access resource.
|
||||
"""
|
||||
serializer_class = NotificationCourseEnrollmentSerializer
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
pagination_class = None
|
||||
|
||||
def get_queryset(self):
|
||||
user = self.request.user
|
||||
@@ -63,14 +71,20 @@ class CourseEnrollmentListView(generics.ListAPIView):
|
||||
Returns the list of active course enrollments for which ENABLE_NOTIFICATIONS
|
||||
Waffle flag is enabled
|
||||
"""
|
||||
enrollment_queryset = self.get_queryset().select_related('course')
|
||||
enrollments = [
|
||||
enrollment
|
||||
for enrollment in enrollment_queryset
|
||||
if ENABLE_NOTIFICATIONS.is_enabled(enrollment.course.id)
|
||||
]
|
||||
serializer = self.get_serializer(enrollments, many=True)
|
||||
return Response(serializer.data)
|
||||
queryset = self.filter_queryset(self.get_queryset())
|
||||
course_ids = queryset.values_list('course_id', flat=True)
|
||||
|
||||
for course_id in course_ids:
|
||||
if not ENABLE_NOTIFICATIONS.is_enabled(course_id):
|
||||
queryset = queryset.exclude(course_id=course_id)
|
||||
|
||||
queryset = queryset.select_related('course').order_by('-id')
|
||||
page = self.paginate_queryset(queryset)
|
||||
if page is not None:
|
||||
serializer = self.get_serializer(page, many=True)
|
||||
return self.get_paginated_response(serializer.data)
|
||||
|
||||
return Response(self.get_serializer(queryset, many=True).data)
|
||||
|
||||
|
||||
class UserNotificationPreferenceView(APIView):
|
||||
|
||||
Reference in New Issue
Block a user