113 lines
3.7 KiB
Python
113 lines
3.7 KiB
Python
"""
|
|
Course API Serializers. Representing course catalog data
|
|
"""
|
|
|
|
import urllib
|
|
|
|
from django.core.urlresolvers import reverse
|
|
from django.template import defaultfilters
|
|
|
|
from rest_framework import serializers
|
|
|
|
from lms.djangoapps.courseware.courses import get_course_about_section
|
|
from openedx.core.lib.courses import course_image_url
|
|
from openedx.core.djangoapps.models.course_details import CourseDetails
|
|
from xmodule.course_module import DEFAULT_START_DATE
|
|
|
|
|
|
class _MediaSerializer(serializers.Serializer): # pylint: disable=abstract-method
|
|
"""
|
|
Nested serializer to represent a media object.
|
|
"""
|
|
def __init__(self, uri_parser, *args, **kwargs):
|
|
super(_MediaSerializer, self).__init__(*args, **kwargs)
|
|
self.uri_parser = uri_parser
|
|
|
|
uri = serializers.SerializerMethodField(source='*')
|
|
|
|
def get_uri(self, course):
|
|
"""
|
|
Get the representation for the media resource's URI
|
|
"""
|
|
return self.uri_parser(course)
|
|
|
|
|
|
class _CourseApiMediaCollectionSerializer(serializers.Serializer): # pylint: disable=abstract-method
|
|
"""
|
|
Nested serializer to represent a collection of media objects
|
|
"""
|
|
course_image = _MediaSerializer(source='*', uri_parser=course_image_url)
|
|
course_video = _MediaSerializer(
|
|
source='*',
|
|
uri_parser=lambda course: CourseDetails.fetch_video_url(course.id),
|
|
)
|
|
|
|
|
|
class CourseSerializer(serializers.Serializer): # pylint: disable=abstract-method
|
|
"""
|
|
Serializer for Course objects
|
|
"""
|
|
|
|
course_id = serializers.CharField(source='id', read_only=True)
|
|
name = serializers.CharField(source='display_name_with_default')
|
|
number = serializers.CharField(source='display_number_with_default')
|
|
org = serializers.CharField(source='display_org_with_default')
|
|
short_description = serializers.SerializerMethodField()
|
|
effort = serializers.SerializerMethodField()
|
|
|
|
media = _CourseApiMediaCollectionSerializer(source='*')
|
|
|
|
start = serializers.DateTimeField()
|
|
start_type = serializers.SerializerMethodField()
|
|
start_display = serializers.SerializerMethodField()
|
|
end = serializers.DateTimeField()
|
|
|
|
enrollment_start = serializers.DateTimeField()
|
|
enrollment_end = serializers.DateTimeField()
|
|
|
|
blocks_url = serializers.SerializerMethodField()
|
|
|
|
def get_start_type(self, course):
|
|
"""
|
|
Get the representation for SerializerMethodField `start_type`
|
|
"""
|
|
if course.advertised_start is not None:
|
|
return u'string'
|
|
elif course.start != DEFAULT_START_DATE:
|
|
return u'timestamp'
|
|
else:
|
|
return u'empty'
|
|
|
|
def get_start_display(self, course):
|
|
"""
|
|
Get the representation for SerializerMethodField `start_display`
|
|
"""
|
|
if course.advertised_start is not None:
|
|
return course.advertised_start
|
|
elif course.start != DEFAULT_START_DATE:
|
|
return defaultfilters.date(course.start, "DATE_FORMAT")
|
|
else:
|
|
return None
|
|
|
|
def get_short_description(self, course):
|
|
"""
|
|
Get the representation for SerializerMethodField `short_description`
|
|
"""
|
|
return get_course_about_section(self.context['request'], course, 'short_description').strip()
|
|
|
|
def get_blocks_url(self, course):
|
|
"""
|
|
Get the representation for SerializerMethodField `blocks_url`
|
|
"""
|
|
base_url = '?'.join([
|
|
reverse('blocks_in_course'),
|
|
urllib.urlencode({'course_id': course.id}),
|
|
])
|
|
return self.context['request'].build_absolute_uri(base_url)
|
|
|
|
def get_effort(self, course):
|
|
"""
|
|
Get the representation for SerializerMethodField `effort`
|
|
"""
|
|
return CourseDetails.fetch_effort(course.id)
|