Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion partner_catalog/api/v1/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import django_filters

from partner_catalog.models import Partner
from partner_catalog.models import Partner, PartnerCatalog


class PartnerFilter(django_filters.FilterSet):
Expand Down Expand Up @@ -32,3 +32,23 @@ class Meta:
"slug",
"name",
]


class PartnerCatalogFilter(django_filters.FilterSet):
"""
Custom filters for PartnerCatalog model.

Allows filtering by partner ID:
- partner: filters by partner__id
"""

partner = django_filters.NumberFilter(
field_name="partner__id",
help_text="Filter by partner ID",
)

class Meta:
model = PartnerCatalog
fields = [
"partner",
]
7 changes: 2 additions & 5 deletions partner_catalog/api/v1/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,9 @@

router = DefaultRouter()
router.register(r"partners", PartnerViewset, basename="partner")
router.register(r"catalogs", PartnerCatalogViewSet, basename="partner-catalog")

partners_router = NestedDefaultRouter(router, r"partners", lookup="partner")
partners_router.register(r"catalogs", PartnerCatalogViewSet, basename="partner-catalog")

catalogs_router = NestedDefaultRouter(partners_router, r"catalogs", lookup="catalog")
catalogs_router = NestedDefaultRouter(router, r"catalogs", lookup="catalog")
catalogs_router.register(r"learners", CatalogLearnerViewset, basename="catalog-learners")
catalogs_router.register(r"courses", CatalogCourseViewSet, basename="catalog-courses")
catalogs_router.register(r"email_regexes", CatalogEmailRegexViewSet, basename="catalog-email-regexes")
Expand All @@ -31,7 +29,6 @@

urlpatterns = [
path("", include(router.urls)),
path("", include(partners_router.urls)),
path("", include(catalogs_router.urls)),
path("", include(courses_router.urls)),
]
36 changes: 19 additions & 17 deletions partner_catalog/api/v1/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from rest_framework.parsers import MultiPartParser
from rest_framework.response import Response

from partner_catalog.api.v1.filters import PartnerFilter
from partner_catalog.api.v1.filters import PartnerCatalogFilter, PartnerFilter
from partner_catalog.api.v1.mixins import InjectNestedFKMixin
from partner_catalog.api.v1.schemas import (
bulk_remove_invitations_schema,
Expand Down Expand Up @@ -64,10 +64,18 @@ class PartnerViewset(viewsets.ReadOnlyModelViewSet):

def get_queryset(self):
"""
Limit non-staff users to partners where they are active members.
Staff/superusers see all.
Limit non-staff users to partners where they are active managers.
Staff/superusers see all partners.
"""
qs = self.queryset
user = self.request.user

if not (user.is_staff or user.is_superuser):
qs = qs.filter(
catalogs__catalog_managers__user=user,
catalogs__catalog_managers__active=True
).distinct()

qs = qs.annotate(
catalogs_count=Count("catalogs", distinct=True),
courses_count=Count("catalogs__catalog_courses", distinct=True),
Expand All @@ -77,9 +85,7 @@ def get_queryset(self):
return qs


class PartnerCatalogViewSet(
InjectNestedFKMixin, viewsets.ModelViewSet
):
class PartnerCatalogViewSet(viewsets.ModelViewSet):
"""
ViewSet for Corporate Partner Catalog data.
Provides access to corporate partner catalog information.
Expand All @@ -94,24 +100,18 @@ class PartnerCatalogViewSet(
filters.SearchFilter,
filters.OrderingFilter,
]
filterset_class = PartnerCatalogFilter
filterset_fields = ["partner"]
search_fields = ["name", "slug"]
ordering_fields = ["name", "id", "available_start_date", "available_end_date"]
ordering = ["name"]

# Mixin config
nested_lookup_kwarg = "partner_pk"
target_field_name = "partner"

service = PartnerCatalogService()

def get_queryset(self):
"""Limit catalogs to those the user manages or views; staff see all."""
qs = self.queryset
user = self.request.user
partner_pk = self.kwargs.get("partner_pk")
if partner_pk:
qs = qs.filter(partner_id=partner_pk)

if not (user.is_staff or user.is_superuser):
qs = qs.filter(
Expand Down Expand Up @@ -219,9 +219,6 @@ def get_queryset(self):
catalog_pk = self.kwargs.get("catalog_pk")
qs = qs.filter(catalog_id=catalog_pk) if catalog_pk else qs

partner_pk = self.kwargs.get("partner_pk")
qs = qs.filter(catalog__partner_id=partner_pk) if partner_pk else qs

qs = qs.annotate(
enrollments_count=Count(
"enrollments",
Expand Down Expand Up @@ -271,6 +268,10 @@ class CatalogLearnerInvitationViewSet(
filters.OrderingFilter,
]

# Mixin config
nested_lookup_kwarg = "catalog_pk"
target_field_name = "catalog_id"

def get_queryset(self):
"""Get the queryset for catalog learner invitations."""
qs = self.queryset
Expand Down Expand Up @@ -315,10 +316,11 @@ def create(self, request, *args, **kwargs):
"""Create a new invitation."""
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
catalog_id = self.kwargs.get('catalog_pk')

invitation = self.service.create_new_invitation(
invite_email=serializer.validated_data.get('invite_email'),
catalog_id=serializer.validated_data.get('catalog').id,
catalog_id=catalog_id,
invited_by=request.user,
)

Expand Down