Commit b4835c40 by Renzo Lucioni

Allow programs to be filtered by type

ECOM-5167
parent 32b7fd14
...@@ -8,7 +8,7 @@ from dry_rest_permissions.generics import DRYPermissionFiltersBase ...@@ -8,7 +8,7 @@ from dry_rest_permissions.generics import DRYPermissionFiltersBase
from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_objects_for_user
from rest_framework.exceptions import PermissionDenied, NotFound from rest_framework.exceptions import PermissionDenied, NotFound
from course_discovery.apps.course_metadata.models import Course, CourseRun from course_discovery.apps.course_metadata.models import Course, CourseRun, Program
User = get_user_model() User = get_user_model()
...@@ -89,3 +89,11 @@ class CourseRunFilter(django_filters.FilterSet): ...@@ -89,3 +89,11 @@ class CourseRunFilter(django_filters.FilterSet):
class Meta: class Meta:
model = CourseRun model = CourseRun
fields = ['keys'] fields = ['keys']
class ProgramFilter(django_filters.FilterSet):
type = django_filters.CharFilter(name='type__name', lookup_expr='iexact')
class Meta:
model = Program
fields = ['type']
...@@ -4,7 +4,7 @@ from rest_framework.test import APITestCase ...@@ -4,7 +4,7 @@ from rest_framework.test import APITestCase
from course_discovery.apps.api.serializers import ProgramSerializer from course_discovery.apps.api.serializers import ProgramSerializer
from course_discovery.apps.core.tests.factories import USER_PASSWORD, UserFactory from course_discovery.apps.core.tests.factories import USER_PASSWORD, UserFactory
from course_discovery.apps.course_metadata.models import Program from course_discovery.apps.course_metadata.models import Program
from course_discovery.apps.course_metadata.tests.factories import ProgramFactory from course_discovery.apps.course_metadata.tests.factories import ProgramFactory, ProgramTypeFactory
class ProgramViewSetTests(APITestCase): class ProgramViewSetTests(APITestCase):
...@@ -41,3 +41,16 @@ class ProgramViewSetTests(APITestCase): ...@@ -41,3 +41,16 @@ class ProgramViewSetTests(APITestCase):
response = self.client.get(url) response = self.client.get(url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['results'], ProgramSerializer(Program.objects.all(), many=True).data) self.assertEqual(response.data['results'], ProgramSerializer(Program.objects.all(), many=True).data)
def test_filter_by_type(self):
""" Verify that the endpoint filters programs to those of a given type. """
url = reverse('api:v1:program-list') + '?type='
self.program.type = ProgramTypeFactory(name='Foo')
self.program.save() # pylint: disable=no-member
response = self.client.get(url + 'foo')
self.assertEqual(response.data['results'][0], ProgramSerializer(Program.objects.get()).data)
response = self.client.get(url + 'bar')
self.assertEqual(response.data['results'], [])
...@@ -333,6 +333,8 @@ class ProgramViewSet(viewsets.ReadOnlyModelViewSet): ...@@ -333,6 +333,8 @@ class ProgramViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Program.objects.all() queryset = Program.objects.all()
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)
serializer_class = serializers.ProgramSerializer serializer_class = serializers.ProgramSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = filters.ProgramFilter
class ManagementViewSet(viewsets.ViewSet): class ManagementViewSet(viewsets.ViewSet):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment