From e543a68990d55324b0e665ae08b09047ff4ac4b8 Mon Sep 17 00:00:00 2001 From: Awais Ansari <79941147+awais-ansari@users.noreply.github.com> Date: Mon, 3 Jul 2023 13:52:15 +0500 Subject: [PATCH] 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 --- .../notifications/tests/test_views.py | 5 +- .../core/djangoapps/notifications/views.py | 54 ++++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/openedx/core/djangoapps/notifications/tests/test_views.py b/openedx/core/djangoapps/notifications/tests/test_views.py index 84f7116964..8bce8898d0 100644 --- a/openedx/core/djangoapps/notifications/tests/test_views.py +++ b/openedx/core/djangoapps/notifications/tests/test_views.py @@ -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): """ diff --git a/openedx/core/djangoapps/notifications/views.py b/openedx/core/djangoapps/notifications/views.py index 04543dc524..f083649989 100644 --- a/openedx/core/djangoapps/notifications/views.py +++ b/openedx/core/djangoapps/notifications/views.py @@ -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):