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
class CatalogSerializer(serializers.ModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='api:v1:catalog-detail', lookup_field='id')
class Meta(object):
model = Catalog
fields = ('id', 'name', 'query', 'url',)
fields = ('id', 'name', 'query', 'courses_count',)
class CourseSerializer(serializers.ModelSerializer):
......
from django.core.urlresolvers import reverse
from django.test import TestCase, RequestFactory
from django.test import TestCase
from course_discovery.apps.api.serializers import CatalogSerializer, CourseSerializer, ContainedCoursesSerializer
from course_discovery.apps.catalogs.tests.factories import CatalogFactory
......@@ -8,16 +7,15 @@ from course_discovery.apps.course_metadata.tests.factories import CourseFactory
class CatalogSerializerTests(TestCase):
def test_data(self):
catalog = CatalogFactory()
path = reverse('api:v1:catalog-detail', kwargs={'id': catalog.id})
request = RequestFactory().get(path)
serializer = CatalogSerializer(catalog, context={'request': request})
catalog = CatalogFactory(query='*:*') # We intentionally use a query for all Courses.
courses = CourseFactory.create_batch(10)
serializer = CatalogSerializer(catalog)
expected = {
'id': catalog.id,
'name': catalog.name,
'query': catalog.query,
'url': request.build_absolute_uri(),
'courses_count': len(courses)
}
self.assertDictEqual(serializer.data, expected)
......@@ -25,9 +23,7 @@ class CatalogSerializerTests(TestCase):
class CourseSerializerTests(TestCase):
def test_data(self):
course = CourseFactory()
path = reverse('api:v1:course-detail', kwargs={'key': course.key})
request = RequestFactory().get(path)
serializer = CourseSerializer(course, context={'request': request})
serializer = CourseSerializer(course)
expected = {
'key': course.key,
......
......@@ -32,6 +32,10 @@ class Catalog(ModelPermissionsMixin, TimeStampedModel):
results = self._get_query_results().load_all()
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
""" Determines if the given courses are contained in this catalog.
......
......@@ -9,4 +9,4 @@ class CatalogFactory(factory.DjangoModelFactory):
model = Catalog
name = FuzzyText(prefix='catalog-name-')
query = '{"query": {"match_all": {}}}'
query = '*:*'
......@@ -34,3 +34,12 @@ class CatalogTests(ElasticsearchTestMixin, TestCase):
self.catalog.contains([self.course.key, uncontained_course.key]),
{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