serializers.py 3.31 KB
Newer Older
1 2 3
"""
Serializer for user API
"""
4 5 6 7 8
from rest_framework import serializers
from rest_framework.reverse import reverse

from courseware.courses import course_image_url
from student.models import CourseEnrollment, User
9
from certificates.models import certificate_status_for_student, CertificateStatuses
10 11


12
class CourseOverviewField(serializers.RelatedField):
13 14
    """Custom field to wrap a CourseDescriptor object. Read-only."""

15 16
    def to_native(self, course_overview):
        course_id = unicode(course_overview.id)
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
        request = self.context.get('request', None)
        if request:
            video_outline_url = reverse(
                'video-summary-list',
                kwargs={'course_id': course_id},
                request=request
            )
            course_updates_url = reverse(
                'course-updates-list',
                kwargs={'course_id': course_id},
                request=request
            )
            course_handouts_url = reverse(
                'course-handouts-list',
                kwargs={'course_id': course_id},
                request=request
            )
        else:
            video_outline_url = None
            course_updates_url = None
            course_handouts_url = None

        return {
            "id": course_id,
41 42 43 44 45 46
            "name": course_overview.display_name,
            "number": course_overview.display_number_with_default,
            "org": course_overview.display_org_with_default,
            "start": course_overview.start,
            "end": course_overview.end,
            "course_image": course_overview.course_image_url,
47
            "social_urls": {
48
                "facebook": course_overview.facebook_url,
49
            },
50 51 52 53 54 55
            "latest_updates": {
                "video": None
            },
            "video_outline": video_outline_url,
            "course_updates": course_updates_url,
            "course_handouts": course_handouts_url,
56
            "subscription_id": course_overview.clean_id(padding_char='_'),
57 58 59 60
        }


class CourseEnrollmentSerializer(serializers.ModelSerializer):
61 62 63
    """
    Serializes CourseEnrollment models
    """
64
    course = CourseOverviewField(source="course_overview")
65 66 67 68 69 70 71 72 73 74 75
    certificate = serializers.SerializerMethodField('get_certificate')

    def get_certificate(self, model):
        """Returns the information about the user's certificate in the course."""
        certificate_info = certificate_status_for_student(model.user, model.course_id)
        if certificate_info['status'] == CertificateStatuses.downloadable:
            return {
                "url": certificate_info['download_url'],
            }
        else:
            return {}
76

stv committed
77
    class Meta(object):  # pylint: disable=missing-docstring
78
        model = CourseEnrollment
79
        fields = ('created', 'mode', 'is_active', 'course', 'certificate')
80 81 82 83
        lookup_field = 'username'


class UserSerializer(serializers.HyperlinkedModelSerializer):
84 85 86
    """
    Serializes User models
    """
87 88 89 90 91 92
    name = serializers.Field(source='profile.name')
    course_enrollments = serializers.HyperlinkedIdentityField(
        view_name='courseenrollment-detail',
        lookup_field='username'
    )

stv committed
93
    class Meta(object):  # pylint: disable=missing-docstring
94 95 96
        model = User
        fields = ('id', 'username', 'email', 'name', 'course_enrollments')
        lookup_field = 'username'