You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.8 KiB
130 lines
4.8 KiB
from rest_framework import serializers
|
|
|
|
from .models import Podcast , PodcastCategory , PodcastCollection
|
|
|
|
|
|
class AbsoluteImageField(serializers.ImageField):
|
|
def to_representation(self, value):
|
|
if not value:
|
|
return None
|
|
request = self.context.get("request")
|
|
url = value.url if hasattr(value, "url") else str(value)
|
|
if request:
|
|
return request.build_absolute_uri(url)
|
|
return url
|
|
|
|
|
|
class AbsoluteFileField(serializers.FileField):
|
|
def to_representation(self, value):
|
|
if not value:
|
|
return None
|
|
request = self.context.get("request")
|
|
url = value.url if hasattr(value, "url") else str(value)
|
|
if request:
|
|
return request.build_absolute_uri(url)
|
|
return url
|
|
|
|
|
|
class AdminPodcastCategorySerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = PodcastCategory
|
|
fields = ["id", "title", "slug", "status", "created_at", "updated_at"]
|
|
|
|
|
|
class AdminPodcastCollectionSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = PodcastCollection
|
|
fields = ["id", "title", "slug", "summary", "display_position", "status", "order", "pin_top"]
|
|
|
|
|
|
class AdminPodcastListSerializer(serializers.ModelSerializer):
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True)
|
|
audio_file = AbsoluteFileField(required=False, allow_null=True)
|
|
categories_detail = AdminPodcastCategorySerializer(source="categories", many=True, read_only=True)
|
|
collections_detail = AdminPodcastCollectionSerializer(source="collections", many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = Podcast
|
|
fields = [
|
|
"id",
|
|
"title",
|
|
"slug",
|
|
"thumbnail",
|
|
"status",
|
|
"view_count",
|
|
"download_count",
|
|
"created_at",
|
|
"updated_at",
|
|
"categories_detail",
|
|
"collections_detail",
|
|
"audio_file"
|
|
]
|
|
read_only_fields = ["id", "view_count", "download_count", "created_at", "updated_at"]
|
|
|
|
class AdminPodcastDetailSerializer(serializers.ModelSerializer):
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True)
|
|
audio_file = AbsoluteFileField(required=False, allow_null=True)
|
|
audio_time = serializers.TimeField(required=False)
|
|
categories = serializers.PrimaryKeyRelatedField(queryset=PodcastCategory.objects.all(), many=True, required=False)
|
|
collections = serializers.PrimaryKeyRelatedField(queryset=PodcastCollection.objects.all(), many=True, required=False)
|
|
categories_detail = AdminPodcastCategorySerializer(source="categories", many=True, read_only=True)
|
|
collections_detail = AdminPodcastCollectionSerializer(source="collections", many=True, read_only=True)
|
|
remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False)
|
|
remove_audio_file = serializers.BooleanField(write_only=True, required=False, default=False)
|
|
|
|
class Meta:
|
|
model = Podcast
|
|
fields = [
|
|
"id",
|
|
"title",
|
|
"slug",
|
|
"thumbnail",
|
|
"description",
|
|
"audio_file",
|
|
"audio_time",
|
|
"status",
|
|
"view_count",
|
|
"download_count",
|
|
"created_at",
|
|
"updated_at",
|
|
"categories",
|
|
"collections",
|
|
"categories_detail",
|
|
"collections_detail",
|
|
"remove_thumbnail",
|
|
"remove_audio_file",
|
|
]
|
|
read_only_fields = ["id", "view_count", "download_count", "created_at", "updated_at"]
|
|
|
|
def create(self, validated_data):
|
|
validated_data.pop("remove_thumbnail", False)
|
|
validated_data.pop("remove_audio_file", False)
|
|
categories = validated_data.pop("categories", [])
|
|
collections = validated_data.pop("collections", [])
|
|
podcast = super().create(validated_data)
|
|
if categories:
|
|
podcast.categories.set(categories)
|
|
if collections:
|
|
podcast.collections.set(collections)
|
|
return podcast
|
|
|
|
def update(self, instance, validated_data):
|
|
remove_thumbnail = validated_data.pop("remove_thumbnail", False)
|
|
remove_audio_file = validated_data.pop("remove_audio_file", False)
|
|
categories = validated_data.pop("categories", None)
|
|
collections = validated_data.pop("collections", None)
|
|
|
|
if remove_thumbnail and instance.thumbnail:
|
|
instance.thumbnail.delete(save=False)
|
|
instance.thumbnail = None
|
|
|
|
if remove_audio_file and instance.audio_file:
|
|
instance.audio_file.delete(save=False)
|
|
instance.audio_file = None
|
|
|
|
podcast = super().update(instance, validated_data)
|
|
if categories is not None:
|
|
podcast.categories.set(categories)
|
|
if collections is not None:
|
|
podcast.collections.set(collections)
|
|
return podcast
|