Commit 1185fff1 by Clinton Blackburn

Added pacing field Course API

ECOM-3994
parent 84e88eba
...@@ -55,6 +55,7 @@ class CourseSerializer(serializers.Serializer): # pylint: disable=abstract-meth ...@@ -55,6 +55,7 @@ class CourseSerializer(serializers.Serializer): # pylint: disable=abstract-meth
start = serializers.DateTimeField() start = serializers.DateTimeField()
start_display = serializers.CharField() start_display = serializers.CharField()
start_type = serializers.CharField() start_type = serializers.CharField()
pacing = serializers.CharField()
# 'course_id' is a deprecated field, please use 'id' instead. # 'course_id' is a deprecated field, please use 'id' instead.
course_id = serializers.CharField(source='id', read_only=True) course_id = serializers.CharField(source='id', read_only=True)
......
...@@ -2,8 +2,10 @@ ...@@ -2,8 +2,10 @@
Test data created by CourseSerializer and CourseDetailSerializer Test data created by CourseSerializer and CourseDetailSerializer
""" """
from __future__ import unicode_literals
from datetime import datetime from datetime import datetime
import ddt
from openedx.core.djangoapps.models.course_details import CourseDetails from openedx.core.djangoapps.models.course_details import CourseDetails
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory
...@@ -18,6 +20,7 @@ from ..serializers import CourseSerializer, CourseDetailSerializer ...@@ -18,6 +20,7 @@ from ..serializers import CourseSerializer, CourseDetailSerializer
from .mixins import CourseApiFactoryMixin from .mixins import CourseApiFactoryMixin
@ddt.ddt
class TestCourseSerializer(CourseApiFactoryMixin, ModuleStoreTestCase): class TestCourseSerializer(CourseApiFactoryMixin, ModuleStoreTestCase):
""" """
Test CourseSerializer Test CourseSerializer
...@@ -54,6 +57,7 @@ class TestCourseSerializer(CourseApiFactoryMixin, ModuleStoreTestCase): ...@@ -54,6 +57,7 @@ class TestCourseSerializer(CourseApiFactoryMixin, ModuleStoreTestCase):
'enrollment_end': u'2015-07-15T00:00:00Z', 'enrollment_end': u'2015-07-15T00:00:00Z',
'blocks_url': u'http://testserver/api/courses/v1/blocks/?course_id=edX%2Ftoy%2F2012_Fall', 'blocks_url': u'http://testserver/api/courses/v1/blocks/?course_id=edX%2Ftoy%2F2012_Fall',
'effort': u'6 hours', 'effort': u'6 hours',
'pacing': 'instructor',
# 'course_id' is a deprecated field, please use 'id' instead. # 'course_id' is a deprecated field, please use 'id' instead.
'course_id': u'edX/toy/2012_Fall', 'course_id': u'edX/toy/2012_Fall',
...@@ -101,6 +105,16 @@ class TestCourseSerializer(CourseApiFactoryMixin, ModuleStoreTestCase): ...@@ -101,6 +105,16 @@ class TestCourseSerializer(CourseApiFactoryMixin, ModuleStoreTestCase):
self.assertEqual(result['start_type'], u'empty') self.assertEqual(result['start_type'], u'empty')
self.assertIsNone(result['start_display']) self.assertIsNone(result['start_display'])
@ddt.unpack
@ddt.data(
(True, 'self'),
(False, 'instructor'),
)
def test_pacing(self, self_paced, expected_pacing):
course = self.create_course(self_paced=self_paced)
result = self._get_result(course)
self.assertEqual(result['pacing'], expected_pacing)
class TestCourseDetailSerializer(TestCourseSerializer): # pylint: disable=test-inherits-tests class TestCourseDetailSerializer(TestCourseSerializer): # pylint: disable=test-inherits-tests
""" """
......
...@@ -52,6 +52,7 @@ class CourseDetailView(DeveloperErrorViewMixin, RetrieveAPIView): ...@@ -52,6 +52,7 @@ class CourseDetailView(DeveloperErrorViewMixin, RetrieveAPIView):
* `"string"`: manually set * `"string"`: manually set
* `"timestamp"`: generated form `start` timestamp * `"timestamp"`: generated form `start` timestamp
* `"empty"`: the start date should not be shown * `"empty"`: the start date should not be shown
* pacing: Course pacing. Possible values: instructor, self
Deprecated fields: Deprecated fields:
...@@ -94,7 +95,8 @@ class CourseDetailView(DeveloperErrorViewMixin, RetrieveAPIView): ...@@ -94,7 +95,8 @@ class CourseDetailView(DeveloperErrorViewMixin, RetrieveAPIView):
"overview: "<p>A verbose description of the course.</p>" "overview: "<p>A verbose description of the course.</p>"
"start": "2015-07-17T12:00:00Z", "start": "2015-07-17T12:00:00Z",
"start_display": "July 17, 2015", "start_display": "July 17, 2015",
"start_type": "timestamp" "start_type": "timestamp",
"pacing": "instructor"
} }
""" """
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course_overviews', '0009_readd_facebook_url'),
]
operations = [
migrations.RemoveField(
model_name='courseoverview',
name='facebook_url',
),
migrations.AddField(
model_name='courseoverview',
name='self_paced',
field=models.BooleanField(default=False),
),
]
...@@ -45,7 +45,7 @@ class CourseOverview(TimeStampedModel): ...@@ -45,7 +45,7 @@ class CourseOverview(TimeStampedModel):
app_label = 'course_overviews' app_label = 'course_overviews'
# IMPORTANT: Bump this whenever you modify this model and/or add a migration. # IMPORTANT: Bump this whenever you modify this model and/or add a migration.
VERSION = 3 VERSION = 4
# Cache entry versioning. # Cache entry versioning.
version = IntegerField() version = IntegerField()
...@@ -98,6 +98,7 @@ class CourseOverview(TimeStampedModel): ...@@ -98,6 +98,7 @@ class CourseOverview(TimeStampedModel):
short_description = TextField(null=True) short_description = TextField(null=True)
course_video_url = TextField(null=True) course_video_url = TextField(null=True)
effort = TextField(null=True) effort = TextField(null=True)
self_paced = BooleanField(default=False)
@classmethod @classmethod
def _create_from_course(cls, course): def _create_from_course(cls, course):
...@@ -181,6 +182,7 @@ class CourseOverview(TimeStampedModel): ...@@ -181,6 +182,7 @@ class CourseOverview(TimeStampedModel):
short_description=CourseDetails.fetch_about_attribute(course.id, 'short_description'), short_description=CourseDetails.fetch_about_attribute(course.id, 'short_description'),
effort=CourseDetails.fetch_about_attribute(course.id, 'effort'), effort=CourseDetails.fetch_about_attribute(course.id, 'effort'),
course_video_url=CourseDetails.fetch_video_url(course.id), course_video_url=CourseDetails.fetch_video_url(course.id),
self_paced=course.self_paced,
) )
@classmethod @classmethod
...@@ -551,6 +553,16 @@ class CourseOverview(TimeStampedModel): ...@@ -551,6 +553,16 @@ class CourseOverview(TimeStampedModel):
return self.apply_cdn_to_urls(urls) return self.apply_cdn_to_urls(urls)
@property
def pacing(self):
""" Returns the pacing for the course.
Potential values:
self: Self-paced courses
instructor: Instructor-led courses
"""
return 'self' if self.self_paced else 'instructor'
def apply_cdn_to_urls(self, image_urls): def apply_cdn_to_urls(self, image_urls):
""" """
Given a dict of resolutions -> urls, return a copy with CDN applied. Given a dict of resolutions -> urls, return a copy with CDN applied.
......
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