Commit b3b374db by Clinton Blackburn

Added courses_count field to Catalog model and API endpoint

ECOM-3973
parent 1f765698
...@@ -6,11 +6,9 @@ from course_discovery.apps.course_metadata.models import Course ...@@ -6,11 +6,9 @@ from course_discovery.apps.course_metadata.models import Course
class CatalogSerializer(serializers.ModelSerializer): class CatalogSerializer(serializers.ModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='api:v1:catalog-detail', lookup_field='id')
class Meta(object): class Meta(object):
model = Catalog model = Catalog
fields = ('id', 'name', 'query', 'url',) fields = ('id', 'name', 'query', 'courses_count',)
class CourseSerializer(serializers.ModelSerializer): class CourseSerializer(serializers.ModelSerializer):
......
from django.core.urlresolvers import reverse from django.test import TestCase
from django.test import TestCase, RequestFactory
from course_discovery.apps.api.serializers import CatalogSerializer, CourseSerializer, ContainedCoursesSerializer from course_discovery.apps.api.serializers import CatalogSerializer, CourseSerializer, ContainedCoursesSerializer
from course_discovery.apps.catalogs.tests.factories import CatalogFactory from course_discovery.apps.catalogs.tests.factories import CatalogFactory
...@@ -8,16 +7,15 @@ from course_discovery.apps.course_metadata.tests.factories import CourseFactory ...@@ -8,16 +7,15 @@ from course_discovery.apps.course_metadata.tests.factories import CourseFactory
class CatalogSerializerTests(TestCase): class CatalogSerializerTests(TestCase):
def test_data(self): def test_data(self):
catalog = CatalogFactory() catalog = CatalogFactory(query='*:*') # We intentionally use a query for all Courses.
path = reverse('api:v1:catalog-detail', kwargs={'id': catalog.id}) courses = CourseFactory.create_batch(10)
request = RequestFactory().get(path) serializer = CatalogSerializer(catalog)
serializer = CatalogSerializer(catalog, context={'request': request})
expected = { expected = {
'id': catalog.id, 'id': catalog.id,
'name': catalog.name, 'name': catalog.name,
'query': catalog.query, 'query': catalog.query,
'url': request.build_absolute_uri(), 'courses_count': len(courses)
} }
self.assertDictEqual(serializer.data, expected) self.assertDictEqual(serializer.data, expected)
...@@ -25,9 +23,7 @@ class CatalogSerializerTests(TestCase): ...@@ -25,9 +23,7 @@ class CatalogSerializerTests(TestCase):
class CourseSerializerTests(TestCase): class CourseSerializerTests(TestCase):
def test_data(self): def test_data(self):
course = CourseFactory() course = CourseFactory()
path = reverse('api:v1:course-detail', kwargs={'key': course.key}) serializer = CourseSerializer(course)
request = RequestFactory().get(path)
serializer = CourseSerializer(course, context={'request': request})
expected = { expected = {
'key': course.key, 'key': course.key,
......
...@@ -32,6 +32,10 @@ class Catalog(ModelPermissionsMixin, TimeStampedModel): ...@@ -32,6 +32,10 @@ class Catalog(ModelPermissionsMixin, TimeStampedModel):
results = self._get_query_results().load_all() results = self._get_query_results().load_all()
return [result.object for result in results] return [result.object for result in results]
@property
def courses_count(self):
return self._get_query_results().count()
def contains(self, course_ids): # pylint: disable=unused-argument def contains(self, course_ids): # pylint: disable=unused-argument
""" Determines if the given courses are contained in this catalog. """ Determines if the given courses are contained in this catalog.
......
...@@ -9,4 +9,4 @@ class CatalogFactory(factory.DjangoModelFactory): ...@@ -9,4 +9,4 @@ class CatalogFactory(factory.DjangoModelFactory):
model = Catalog model = Catalog
name = FuzzyText(prefix='catalog-name-') name = FuzzyText(prefix='catalog-name-')
query = '{"query": {"match_all": {}}}' query = '*:*'
...@@ -34,3 +34,12 @@ class CatalogTests(ElasticsearchTestMixin, TestCase): ...@@ -34,3 +34,12 @@ class CatalogTests(ElasticsearchTestMixin, TestCase):
self.catalog.contains([self.course.key, uncontained_course.key]), self.catalog.contains([self.course.key, uncontained_course.key]),
{self.course.key: True, uncontained_course.key: False} {self.course.key: True, uncontained_course.key: False}
) )
def test_courses_count(self):
""" Verify the method returns the number of courses contained in the Catalog. """
self.assertEqual(self.catalog.courses_count, 1)
# Create a new course that should NOT be contained in the catalog, and one that should
CourseFactory()
CourseFactory(title='ABCDEF')
self.assertEqual(self.catalog.courses_count, 2)
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