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:
Awais Ansari
2023-07-03 13:52:15 +05:00
committed by GitHub
parent dab865c4ee
commit e543a68990
2 changed files with 38 additions and 21 deletions

View File

@@ -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):
"""

View File

@@ -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):