118 lines
4.0 KiB
Python
118 lines
4.0 KiB
Python
from rest_framework.response import Response
|
|
from rest_framework import generics, filters, views
|
|
from django_filters.rest_framework import DjangoFilterBackend, FilterSet, CharFilter, ChoiceFilter
|
|
|
|
from content import models, serializers
|
|
|
|
class ContentFilter(FilterSet):
|
|
grade = CharFilter(
|
|
method='filter_grades_contains', label="Grade/Class"
|
|
)
|
|
format_type = ChoiceFilter(choices=models.Content.CONTENT_FORMAT_CHOICES, label="Format", field_name="format")
|
|
|
|
def filter_grades_contains(self, queryset, name, value):
|
|
try:
|
|
value_int = int(value)
|
|
except ValueError:
|
|
return queryset.none()
|
|
return queryset.filter(grades__contains=[value_int])
|
|
|
|
class Meta:
|
|
model = models.Content
|
|
fields = ['format_type', 'theme', 'topic', 'grade']
|
|
|
|
class ContentList(generics.ListCreateAPIView):
|
|
queryset = models.Content.objects.all()
|
|
serializer_class = serializers.ContentSerializer
|
|
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
|
|
search_fields = ['title']
|
|
filterset_class = ContentFilter
|
|
ordering_fields = '__all__'
|
|
|
|
def get_serializer_class(self):
|
|
serializer_class = self.serializer_class
|
|
|
|
if self.request.method == 'GET':
|
|
serializer_class = serializers.ContentDetailSerializer
|
|
|
|
return serializer_class
|
|
|
|
class ContentDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
queryset = models.Content.objects.all()
|
|
serializer_class = serializers.ContentSerializer
|
|
|
|
def get_serializer_class(self):
|
|
serializer_class = self.serializer_class
|
|
|
|
if self.request.method == 'GET':
|
|
serializer_class = serializers.ContentDetailSerializer
|
|
|
|
return serializer_class
|
|
|
|
class ContentThemeChoices(views.APIView):
|
|
def get(self, request, *args, **kwargs):
|
|
return Response({
|
|
"count": len(models.Content.CONTENT_THEME_CHOICES),
|
|
"results": [
|
|
{"value": choice[0], "label": choice[1]}
|
|
for choice in models.Content.CONTENT_THEME_CHOICES
|
|
]
|
|
})
|
|
|
|
class ContentTopicChoices(views.APIView):
|
|
def get(self, request, theme_key):
|
|
topics = models.Content.CONTENT_TOPIC_CHOICES.get(theme_key)
|
|
if not topics:
|
|
return Response({
|
|
"count": 0,
|
|
"results": []
|
|
})
|
|
|
|
return Response({
|
|
"count": len(topics),
|
|
"results": [
|
|
{"value": choice[0], "label": choice[1]}
|
|
for choice in topics
|
|
]
|
|
})
|
|
|
|
class ContentFormatChoices(views.APIView):
|
|
def get(self, request, *args, **kwargs):
|
|
return Response({
|
|
"count": len(models.Content.CONTENT_FORMAT_CHOICES),
|
|
"results": [
|
|
{"value": choice[0], "label": choice[1]}
|
|
for choice in models.Content.CONTENT_FORMAT_CHOICES
|
|
]
|
|
})
|
|
|
|
class ContentMediaList(generics.ListCreateAPIView):
|
|
queryset = models.Media.objects.all()
|
|
serializer_class = serializers.ContentMediaSerializer
|
|
|
|
class ContentMediaDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
queryset = models.Media.objects.all()
|
|
serializer_class = serializers.ContentMediaSerializer
|
|
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
|
|
search_fields = ['name']
|
|
ordering_fields = '__all__'
|
|
|
|
class ContentTypeChoices(views.APIView):
|
|
def get(self, request, *args, **kwargs):
|
|
return Response({
|
|
"count": len(models.Content.CONTENT_TYPE_CHOICES),
|
|
"results": [
|
|
{"value": choice[0], "label": choice[1]}
|
|
for choice in models.Content.CONTENT_TYPE_CHOICES
|
|
]
|
|
})
|
|
|
|
class ContentStatusChoices(views.APIView):
|
|
def get(self, request, *args, **kwargs):
|
|
return Response({
|
|
"count": len(models.Content.CONTENT_STATUS_CHOICES),
|
|
"results": [
|
|
{"value": choice[0], "label": choice[1]}
|
|
for choice in models.Content.CONTENT_STATUS_CHOICES
|
|
]
|
|
}) |