Commit ea37c12d by Uman Shahzad

Add new serializers and use them in viewsets.

These are the serializers for all 4 new endpoints,
for courses, course runs, programs, and their aggregation.

We add the actual endpoint in the next commit.
parent eb060d31
......@@ -10,7 +10,7 @@ from django.contrib.auth import get_user_model
from django.db.models.query import Prefetch
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from drf_haystack.serializers import HaystackFacetSerializer, HaystackSerializer
from drf_haystack.serializers import HaystackFacetSerializer, HaystackSerializer, HaystackSerializerMixin
from rest_framework import serializers
from rest_framework.fields import DictField
from taggit_serializer.serializers import TaggitSerializer, TagListSerializerField
......@@ -128,6 +128,17 @@ class TimestampModelSerializer(serializers.ModelSerializer):
modified = serializers.DateTimeField()
class ContentTypeSerializer(serializers.Serializer):
"""Serializer for retrieving the type of content. Useful in views returning multiple serialized models."""
content_type = serializers.SerializerMethodField()
def get_content_type(self, obj):
return obj._meta.model_name
class Meta(object):
fields = ('content_type',)
class NamedModelSerializer(serializers.ModelSerializer):
"""Serializer for models inheriting from ``AbstractNamedModel``."""
name = serializers.CharField()
......@@ -1300,6 +1311,28 @@ class AggregateFacetSearchSerializer(BaseHaystackFacetSerializer):
search_indexes.ProgramIndex: ProgramFacetSerializer,
}
class CourseSearchModelSerializer(HaystackSerializerMixin, ContentTypeSerializer, CourseWithProgramsSerializer):
class Meta(CourseWithProgramsSerializer.Meta):
fields = ContentTypeSerializer.Meta.fields + CourseWithProgramsSerializer.Meta.fields
class CourseRunSearchModelSerializer(HaystackSerializerMixin, ContentTypeSerializer, CourseRunWithProgramsSerializer):
class Meta(CourseRunWithProgramsSerializer.Meta):
fields = ContentTypeSerializer.Meta.fields + CourseRunWithProgramsSerializer.Meta.fields
class ProgramSearchModelSerializer(HaystackSerializerMixin, ContentTypeSerializer, ProgramSerializer):
class Meta(ProgramSerializer.Meta):
fields = ContentTypeSerializer.Meta.fields + ProgramSerializer.Meta.fields
class AggregateSearchModelSerializer(HaystackSerializer):
class Meta:
serializers = {
search_indexes.CourseRunIndex: CourseRunSearchModelSerializer,
search_indexes.CourseIndex: CourseSearchModelSerializer,
search_indexes.ProgramIndex: ProgramSearchModelSerializer,
}
......
......@@ -93,27 +93,31 @@ class BaseHaystackViewSet(FacetMixin, HaystackViewSet):
class CourseSearchViewSet(BaseHaystackViewSet):
facet_serializer_class = serializers.CourseFacetSerializer
index_models = (Course,)
detail_serializer_class = serializers.CourseSearchModelSerializer
facet_serializer_class = serializers.CourseFacetSerializer
serializer_class = serializers.CourseSearchSerializer
class CourseRunSearchViewSet(BaseHaystackViewSet):
facet_serializer_class = serializers.CourseRunFacetSerializer
index_models = (CourseRun,)
detail_serializer_class = serializers.CourseRunSearchModelSerializer
facet_serializer_class = serializers.CourseRunFacetSerializer
serializer_class = serializers.CourseRunSearchSerializer
class ProgramSearchViewSet(BaseHaystackViewSet):
document_uid_field = 'uuid'
lookup_field = 'uuid'
facet_serializer_class = serializers.ProgramFacetSerializer
index_models = (Program,)
detail_serializer_class = serializers.ProgramSearchModelSerializer
facet_serializer_class = serializers.ProgramFacetSerializer
serializer_class = serializers.ProgramSearchSerializer
class AggregateSearchViewSet(BaseHaystackViewSet):
""" Search all content types. """
detail_serializer_class = serializers.AggregateSearchModelSerializer
facet_serializer_class = serializers.AggregateFacetSearchSerializer
serializer_class = serializers.AggregateSearchSerializer
......
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