Skip to content

Commit

Permalink
feat: add pagination in course enrollment list API (#32546)
Browse files Browse the repository at this point in the history
* feat: add pagination in course enrollment list API

* refactor: enrollment course list API

* refactor: follow best practice in course enrollment list API
  • Loading branch information
awais-ansari committed Jul 3, 2023
1 parent dab865c commit e543a68
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 21 deletions.
5 changes: 4 additions & 1 deletion openedx/core/djangoapps/notifications/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,12 @@ def test_course_enrollment_list_view(self):
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):
"""
Expand Down
54 changes: 34 additions & 20 deletions openedx/core/djangoapps/notifications/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -63,14 +71,20 @@ def list(self, request, *args, **kwargs):
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):
Expand Down

0 comments on commit e543a68

Please sign in to comment.