Commit 8044dda2 by Uman Shahzad

Add new mixin for detail endpoint.

The mixin will add `/detail` to the end of whatever viewset
that uses it.
parent ea37c12d
"""
Mixins for the API application.
"""
# pylint: disable=not-callable
from rest_framework.decorators import list_route
from rest_framework.response import Response
class DetailMixin(object):
"""Mixin for adding in a detail endpoint using a special detail serializer."""
detail_serializer_class = None
@list_route(methods=['get'])
def details(self, request): # pylint: disable=unused-argument
"""
Returns fully detailed aggregated search results.
---
parameters:
- name: q
description: Search text
paramType: query
type: string
required: false
"""
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_detail_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_detail_serializer(queryset, many=True)
return Response(serializer.data)
def get_detail_serializer(self, *args, **kwargs):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
serializer_class = self.get_detail_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
def get_detail_serializer_class(self):
"""
Return the class to use for the serializer.
Defaults to using `self.detail_serializer_class`.
"""
assert self.detail_serializer_class is not None, (
"'%s' should either include a `detail_serializer_class` attribute, "
"or override the `get_detail_serializer_class()` method."
% self.__class__.__name__
)
return self.detail_serializer_class
......@@ -11,12 +11,12 @@ from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from course_discovery.apps.api import filters, serializers
from course_discovery.apps.api import filters, mixins, serializers
from course_discovery.apps.course_metadata.choices import ProgramStatus
from course_discovery.apps.course_metadata.models import Course, CourseRun, Program
class BaseHaystackViewSet(FacetMixin, HaystackViewSet):
class BaseHaystackViewSet(mixins.DetailMixin, FacetMixin, HaystackViewSet):
document_uid_field = 'key'
facet_filter_backends = [filters.HaystackFacetFilterWithQueries, filters.HaystackFilter, OrderingFilter]
ordering_fields = ('start',)
......
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