freekake_api/freekake_api/content/views.py
2025-07-09 05:26:59 +07:00

98 lines
3.3 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__'