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.
 
 
 
 

120 lines
4.5 KiB

from rest_framework import serializers
from .models import Podcast, PodcastCategory, PodcastCollection, PodcastPlaylist, PlaylistItem
from .serializers_admin import AbsoluteFileField, AbsoluteImageField
class DovodiPodcastCategorySerializer(serializers.ModelSerializer):
slug = serializers.CharField(required=False, allow_blank=True)
class Meta:
model = PodcastCategory
fields = ["id", "title", "slug", "status", "order"]
class DovodiPodcastCollectionSerializer(serializers.ModelSerializer):
slug = serializers.CharField(required=False, allow_blank=True)
thumbnail = AbsoluteImageField(required=False, allow_null=True)
remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False)
class Meta:
model = PodcastCollection
fields = [
"id",
"title",
"slug",
"summary",
"display_position",
"status",
"order",
"thumbnail",
"remove_thumbnail",
]
def create(self, validated_data):
validated_data.pop("remove_thumbnail", False)
return super().create(validated_data)
def update(self, instance, validated_data):
remove_thumbnail = validated_data.pop("remove_thumbnail", False)
if remove_thumbnail and instance.thumbnail:
instance.thumbnail.delete(save=False)
instance.thumbnail = None
return super().update(instance, validated_data)
class DovodiPodcastItemSerializer(serializers.ModelSerializer):
slug = serializers.CharField(required=False, allow_blank=True)
thumbnail = AbsoluteImageField(required=False, allow_null=True)
audio_file = AbsoluteFileField(required=False, allow_null=True)
remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False)
remove_audio_file = serializers.BooleanField(write_only=True, required=False, default=False)
playlist = serializers.IntegerField(required=False, allow_null=True, write_only=True)
playlist_id = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Podcast
fields = [
"id",
"title",
"slug",
"thumbnail",
"description",
"audio_file",
"audio_time",
"status",
"view_count",
"download_count",
"playlist",
"playlist_id",
"created_at",
"updated_at",
"remove_thumbnail",
"remove_audio_file",
]
read_only_fields = ["id", "view_count", "download_count", "playlist_id", "created_at", "updated_at"]
def get_playlist_id(self, obj):
appearance = obj.playlist_appearances.first()
return appearance.playlist_id if appearance else None
def create(self, validated_data):
playlist_id = validated_data.pop("playlist", None)
validated_data.pop("remove_thumbnail", False)
validated_data.pop("remove_audio_file", False)
instance = super().create(validated_data)
if playlist_id:
try:
playlist = PodcastPlaylist.objects.get(id=playlist_id)
PlaylistItem.objects.create(playlist=playlist, podcast=instance, priority=playlist.playlist_items.count() + 1)
except PodcastPlaylist.DoesNotExist:
pass
return instance
def update(self, instance, validated_data):
remove_thumbnail = validated_data.pop("remove_thumbnail", False)
remove_audio_file = validated_data.pop("remove_audio_file", False)
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
playlist_in_payload = "playlist" in self.initial_data
playlist_id = validated_data.pop("playlist", None)
instance = super().update(instance, validated_data)
if playlist_in_payload:
instance.playlist_appearances.all().delete()
if playlist_id:
try:
playlist = PodcastPlaylist.objects.get(id=playlist_id)
PlaylistItem.objects.create(playlist=playlist, podcast=instance, priority=playlist.playlist_items.count() + 1)
except PodcastPlaylist.DoesNotExist:
pass
return instance