From cf197c9733f24748a6d7c1216af9c26c9be68d71 Mon Sep 17 00:00:00 2001 From: Alejandro Cardenas Date: Tue, 13 Jan 2026 15:30:16 +0900 Subject: [PATCH 1/3] refactor: move catalog enrollments to new viewset --- partner_catalog/api/v1/urls.py | 2 ++ partner_catalog/api/v1/views.py | 35 +++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/partner_catalog/api/v1/urls.py b/partner_catalog/api/v1/urls.py index 9201e50..a4c901e 100644 --- a/partner_catalog/api/v1/urls.py +++ b/partner_catalog/api/v1/urls.py @@ -12,6 +12,7 @@ CatalogLearnerViewset, PartnerCatalogViewSet, PartnerViewset, + CatalogEnrollmentsViewSet ) router = DefaultRouter() @@ -26,6 +27,7 @@ manage_catalogs_router.register(r"learners", CatalogLearnerViewset, basename="catalog-learners") manage_catalogs_router.register(r"courses", CatalogCourseViewSet, basename="catalog-courses") manage_catalogs_router.register(r"invitations", CatalogLearnerInvitationViewSet, basename="catalog-learner-invitations") +manage_catalogs_router.register(r"enrollments", CatalogEnrollmentsViewSet, basename="catalog-enrollments") courses_router = NestedDefaultRouter(manage_catalogs_router, r"courses", lookup="course") courses_router.register(r"enrollments", CatalogCourseEnrollmentViewSet, basename="catalog-course-enrollments") diff --git a/partner_catalog/api/v1/views.py b/partner_catalog/api/v1/views.py index 89968b2..936d082 100644 --- a/partner_catalog/api/v1/views.py +++ b/partner_catalog/api/v1/views.py @@ -216,21 +216,6 @@ def available_courses(self, request, **kwargs): } return Response(response_data) - @action(detail=True, methods=["get"], url_path="enrollments") - def enrollments(self, request, pk=None): - """Get all course enrollments for this catalog.""" - enrollments = CatalogCourseEnrollment.objects.filter( - catalog_course__catalog_id=pk - ).select_related("user", "catalog_course", "catalog_course__course_overview") - - page = self.paginate_queryset(enrollments) - if page is not None: - serializer = CatalogCourseEnrollmentSerializer(page, many=True) - return self.get_paginated_response(serializer.data) - - serializer = CatalogCourseEnrollmentSerializer(enrollments, many=True) - return Response(serializer.data) - class CatalogLearnerViewset(InjectNestedFKMixin, viewsets.ReadOnlyModelViewSet): """ @@ -504,3 +489,23 @@ def get_queryset(self): qs = self.queryset course_pk = self.kwargs.get("course_pk") return qs.filter(catalog_course_id=course_pk) if course_pk else qs + + +class CatalogEnrollmentsViewSet(viewsets.ReadOnlyModelViewSet): + serializer_class = CatalogCourseEnrollmentSerializer + permission_classes = [IsPartnerCatalogManager] + filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] + + filterset_fields = ["active", "user"] + search_fields = ["user__username", "user__email"] + ordering_fields = ["id"] + ordering = ["-id"] + + def get_queryset(self): + catalog_pk = self.kwargs["catalog_pk"] + return ( + CatalogCourseEnrollment.objects.filter( + catalog_course__catalog_id=catalog_pk + ) + .select_related("user", "catalog_course", "catalog_course__course_overview") + ) From 0b7813d43f97ae4ead6e800ffd3b4fbb51f63f46 Mon Sep 17 00:00:00 2001 From: Alejandro Cardenas Date: Fri, 23 Jan 2026 12:31:46 +0900 Subject: [PATCH 2/3] feat: add names to enrollments search fields Co-authored-by: Diana Olarte --- partner_catalog/api/v1/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner_catalog/api/v1/views.py b/partner_catalog/api/v1/views.py index 936d082..61c1aa6 100644 --- a/partner_catalog/api/v1/views.py +++ b/partner_catalog/api/v1/views.py @@ -497,7 +497,7 @@ class CatalogEnrollmentsViewSet(viewsets.ReadOnlyModelViewSet): filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] filterset_fields = ["active", "user"] - search_fields = ["user__username", "user__email"] + search_fields = ["user__username", "user__first_name", "user__last_name", "user__email"] ordering_fields = ["id"] ordering = ["-id"] From 8ec8aec416c8422856677b95e092143dd26d4e00 Mon Sep 17 00:00:00 2001 From: Alejandro Cardenas Date: Fri, 23 Jan 2026 12:35:59 +0900 Subject: [PATCH 3/3] docs: add missing docstring --- partner_catalog/api/v1/urls.py | 2 +- partner_catalog/api/v1/views.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/partner_catalog/api/v1/urls.py b/partner_catalog/api/v1/urls.py index a4c901e..304053e 100644 --- a/partner_catalog/api/v1/urls.py +++ b/partner_catalog/api/v1/urls.py @@ -8,11 +8,11 @@ from partner_catalog.api.v1.views import ( CatalogCourseEnrollmentViewSet, CatalogCourseViewSet, + CatalogEnrollmentsViewSet, CatalogLearnerInvitationViewSet, CatalogLearnerViewset, PartnerCatalogViewSet, PartnerViewset, - CatalogEnrollmentsViewSet ) router = DefaultRouter() diff --git a/partner_catalog/api/v1/views.py b/partner_catalog/api/v1/views.py index 61c1aa6..2c176a6 100644 --- a/partner_catalog/api/v1/views.py +++ b/partner_catalog/api/v1/views.py @@ -492,6 +492,14 @@ def get_queryset(self): class CatalogEnrollmentsViewSet(viewsets.ReadOnlyModelViewSet): + """ + ViewSet for retrieving enrollments across all courses in a specific corporate partner catalog. + + This view provides read-only access to all user enrollments associated with a given PartnerCatalog, + including user details and course enrollment information. Useful for administrators to list and audit + active or historical enrollments for compliance and support purposes. + """ + serializer_class = CatalogCourseEnrollmentSerializer permission_classes = [IsPartnerCatalogManager] filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]