serializers.py 3.42 KB
Newer Older
1 2 3
"""
Serializers for all Course Enrollment related return objects.
"""
4 5
import logging

6
from rest_framework import serializers
7

8
from course_modes.models import CourseMode
9
from student.models import CourseEnrollment
10

11 12 13
log = logging.getLogger(__name__)


14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
class StringListField(serializers.CharField):
    """Custom Serializer for turning a comma delimited string into a list.

    This field is designed to take a string such as "1,2,3" and turn it into an actual list
    [1,2,3]

    """
    def field_to_native(self, obj, field_name):
        """
        Serialize the object's class name.
        """
        if not obj.suggested_prices:
            return []

        items = obj.suggested_prices.split(',')
        return [int(item) for item in items]


32 33 34 35
class CourseSerializer(serializers.Serializer):  # pylint: disable=abstract-method
    """
    Serialize a course descriptor and related information.
    """
36

37
    course_id = serializers.CharField(source="id")
38
    course_name = serializers.CharField(source="display_name_with_default")
39 40 41 42 43 44
    enrollment_start = serializers.DateTimeField(format=None)
    enrollment_end = serializers.DateTimeField(format=None)
    course_start = serializers.DateTimeField(source="start", format=None)
    course_end = serializers.DateTimeField(source="end", format=None)
    invite_only = serializers.BooleanField(source="invitation_only")
    course_modes = serializers.SerializerMethodField()
45

46 47 48
    def __init__(self, *args, **kwargs):
        self.include_expired = kwargs.pop("include_expired", False)
        super(CourseSerializer, self).__init__(*args, **kwargs)
49

50 51 52 53 54 55 56 57 58 59 60 61 62
    def get_course_modes(self, obj):
        """
        Retrieve course modes associated with the course.
        """
        course_modes = CourseMode.modes_for_course(
            obj.id,
            include_expired=self.include_expired,
            only_selectable=False
        )
        return [
            ModeSerializer(mode).data
            for mode in course_modes
        ]
63 64 65


class CourseEnrollmentSerializer(serializers.ModelSerializer):
66 67 68 69
    """Serializes CourseEnrollment models

    Aggregates all data from the Course Enrollment table, and pulls in the serialization for
    the Course Descriptor and course modes, to give a complete representation of course enrollment.
70 71

    """
72
    course_details = CourseSerializer(source="course_overview")
73 74
    user = serializers.SerializerMethodField('get_username')

75 76 77
    def get_username(self, model):
        """Retrieves the username from the associated model."""
        return model.username
78

79
    class Meta(object):
80
        model = CourseEnrollment
81
        fields = ('created', 'mode', 'is_active', 'course_details', 'user')
82 83 84 85
        lookup_field = 'username'


class ModeSerializer(serializers.Serializer):
86 87 88 89 90 91 92
    """Serializes a course's 'Mode' tuples

    Returns a serialized representation of the modes available for course enrollment. The course
    modes models are designed to return a tuple instead of the model object itself. This serializer
    does not handle the model object itself, but the tuple.

    """
93 94 95
    slug = serializers.CharField(max_length=100)
    name = serializers.CharField(max_length=255)
    min_price = serializers.IntegerField()
96
    suggested_prices = StringListField(max_length=255)
97 98 99
    currency = serializers.CharField(max_length=8)
    expiration_datetime = serializers.DateTimeField()
    description = serializers.CharField()
Diana Huang committed
100
    sku = serializers.CharField()
101
    bulk_sku = serializers.CharField()