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