Commit 6a352f33 by Simon Chen

ECOM-5635 allow filter of unpublished course_runs

parent fff1422f
......@@ -13,6 +13,7 @@ from taggit_serializer.serializers import TagListSerializerField, TaggitSerializ
from course_discovery.apps.api.fields import StdImageSerializerField, ImageField
from course_discovery.apps.catalogs.models import Catalog
from course_discovery.apps.course_metadata.choices import CourseRunStatus
from course_discovery.apps.course_metadata.models import (
Course, CourseRun, Image, Organization, Person, Prerequisite, Seat, Subject, Video, Program, ProgramType, FAQ,
CorporateEndorsement, Endorsement, Position
......@@ -353,6 +354,8 @@ class ProgramCourseSerializer(CourseSerializer):
def get_course_runs(self, course):
program = self.context['program']
course_runs = program.course_runs.filter(course=course)
if self.context.get('published_course_runs_only'):
course_runs = course_runs.filter(status=CourseRunStatus.Published)
return CourseRunSerializer(
course_runs,
many=True,
......@@ -391,7 +394,8 @@ class ProgramSerializer(serializers.ModelSerializer):
many=True,
context={
'request': self.context.get('request'),
'program': program
'program': program,
'published_course_runs_only': self.context.get('published_course_runs_only'),
}
)
......
......@@ -176,6 +176,7 @@ class CourseRunSerializerTests(TestCase):
self.assertDictEqual(serializer.data, expected)
@ddt.ddt
class ProgramCourseSerializerTests(TestCase):
def setUp(self):
super(ProgramCourseSerializerTests, self).setUp()
......@@ -228,6 +229,38 @@ class ProgramCourseSerializerTests(TestCase):
context={'request': self.request}).data
self.assertDictEqual(serializer.data, expected)
@ddt.data(
[CourseRunStatus.Unpublished, 1],
[CourseRunStatus.Unpublished, 0],
[CourseRunStatus.Published, 1],
[CourseRunStatus.Published, 0]
)
@ddt.unpack
def test_with_published_only_querystring(self, course_run_status, published_course_runs_only):
"""
Test the serializer's ability to filter out course_runs based on
"published_course_runs_only" query string
"""
expected = CourseSerializer(self.course_list, many=True, context={'request': self.request}).data
for course in self.course_list:
CourseRunFactory.create_batch(2, status=course_run_status, course=course)
serializer = ProgramCourseSerializer(
self.course_list,
many=True,
context={
'request': self.request,
'program': self.program,
'published_course_runs_only': published_course_runs_only
}
)
validate_data = serializer.data
if not published_course_runs_only or course_run_status != CourseRunStatus.Unpublished:
expected = CourseSerializer(self.course_list, many=True, context={'request': self.request}).data
self.assertSequenceEqual(validate_data, expected)
class ProgramSerializerTests(TestCase):
def test_data(self):
......
......@@ -397,6 +397,11 @@ class ProgramViewSet(viewsets.ReadOnlyModelViewSet):
filter_backends = (DjangoFilterBackend,)
filter_class = filters.ProgramFilter
def get_serializer_context(self, *args, **kwargs):
context = super().get_serializer_context(*args, **kwargs)
context['published_course_runs_only'] = int(self.request.GET.get('published_course_runs_only', 0))
return context
def list(self, request, *args, **kwargs):
""" List all programs.
---
......@@ -414,6 +419,12 @@ class ProgramViewSet(viewsets.ReadOnlyModelViewSet):
type: integer
paramType: query
multiple: false
- name: published_course_runs_only
description: Filter course runs by published ones only
required: false
type: integer
paramType: query
mulitple: false
"""
return super(ProgramViewSet, self).list(request, *args, **kwargs)
......
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