|
|
@ -2,6 +2,7 @@ from rest_framework import serializers |
|
|
from django.core.files.uploadedfile import SimpleUploadedFile |
|
|
from django.core.files.uploadedfile import SimpleUploadedFile |
|
|
from utils.image_compression import maybe_compress_uploaded_file |
|
|
from utils.image_compression import maybe_compress_uploaded_file |
|
|
from utils import absolute_https_url |
|
|
from utils import absolute_https_url |
|
|
|
|
|
from utils.slug import generate_smart_slug |
|
|
|
|
|
|
|
|
from .models import PlaylistItem, Podcast, PodcastCategory, PodcastCollection, PodcastPlaylist |
|
|
from .models import PlaylistItem, Podcast, PodcastCategory, PodcastCollection, PodcastPlaylist |
|
|
|
|
|
|
|
|
@ -39,20 +40,43 @@ class AbsoluteFileField(serializers.FileField): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdminPodcastCategorySerializer(serializers.ModelSerializer): |
|
|
class AdminPodcastCategorySerializer(serializers.ModelSerializer): |
|
|
|
|
|
slug = serializers.SlugField(required=False, allow_blank=True, validators=[]) |
|
|
|
|
|
|
|
|
class Meta: |
|
|
class Meta: |
|
|
model = PodcastCategory |
|
|
model = PodcastCategory |
|
|
fields = ["id", "title", "slug", "status", "created_at", "updated_at"] |
|
|
fields = ["id", "title", "slug", "status", "created_at", "updated_at"] |
|
|
|
|
|
|
|
|
|
|
|
def validate(self, attrs): |
|
|
|
|
|
title = attrs.get("title") or getattr(self.instance, "title", "") |
|
|
|
|
|
slug = attrs.get("slug") |
|
|
|
|
|
if not slug and title: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(title, PodcastCategory, instance=self.instance) |
|
|
|
|
|
elif slug: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(slug, PodcastCategory, instance=self.instance) |
|
|
|
|
|
return attrs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdminPodcastCollectionSerializer(serializers.ModelSerializer): |
|
|
class AdminPodcastCollectionSerializer(serializers.ModelSerializer): |
|
|
|
|
|
slug = serializers.SlugField(required=False, allow_blank=True, validators=[]) |
|
|
|
|
|
|
|
|
class Meta: |
|
|
class Meta: |
|
|
model = PodcastCollection |
|
|
model = PodcastCollection |
|
|
fields = ["id", "title", "slug", "summary", "display_position", "status", "order"] |
|
|
fields = ["id", "title", "slug", "summary", "display_position", "status", "order"] |
|
|
|
|
|
|
|
|
|
|
|
def validate(self, attrs): |
|
|
|
|
|
title = attrs.get("title") or getattr(self.instance, "title", "") |
|
|
|
|
|
slug = attrs.get("slug") |
|
|
|
|
|
if not slug and title: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(title, PodcastCollection, instance=self.instance) |
|
|
|
|
|
elif slug: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(slug, PodcastCollection, instance=self.instance) |
|
|
|
|
|
return attrs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdminPodcastListSerializer(serializers.ModelSerializer): |
|
|
class AdminPodcastListSerializer(serializers.ModelSerializer): |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
audio_file = AbsoluteFileField(required=False, allow_null=True) |
|
|
audio_file = AbsoluteFileField(required=False, allow_null=True) |
|
|
|
|
|
slug = serializers.SlugField(required=False, allow_blank=True, validators=[]) |
|
|
categories_detail = AdminPodcastCategorySerializer(source="categories", many=True, read_only=True) |
|
|
categories_detail = AdminPodcastCategorySerializer(source="categories", many=True, read_only=True) |
|
|
collections_detail = AdminPodcastCollectionSerializer(source="collections", many=True, read_only=True) |
|
|
collections_detail = AdminPodcastCollectionSerializer(source="collections", many=True, read_only=True) |
|
|
|
|
|
|
|
|
@ -77,6 +101,7 @@ class AdminPodcastListSerializer(serializers.ModelSerializer): |
|
|
class AdminPodcastDetailSerializer(serializers.ModelSerializer): |
|
|
class AdminPodcastDetailSerializer(serializers.ModelSerializer): |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
audio_file = AbsoluteFileField(required=False, allow_null=True) |
|
|
audio_file = AbsoluteFileField(required=False, allow_null=True) |
|
|
|
|
|
slug = serializers.SlugField(required=False, allow_blank=True, validators=[]) |
|
|
audio_time = serializers.TimeField(required=False) |
|
|
audio_time = serializers.TimeField(required=False) |
|
|
categories = serializers.PrimaryKeyRelatedField(queryset=PodcastCategory.objects.all(), many=True, required=False) |
|
|
categories = serializers.PrimaryKeyRelatedField(queryset=PodcastCategory.objects.all(), many=True, required=False) |
|
|
collections = serializers.PrimaryKeyRelatedField(queryset=PodcastCollection.objects.all(), many=True, required=False) |
|
|
collections = serializers.PrimaryKeyRelatedField(queryset=PodcastCollection.objects.all(), many=True, required=False) |
|
|
@ -116,6 +141,15 @@ class AdminPodcastDetailSerializer(serializers.ModelSerializer): |
|
|
from apps.bookmark.models.bookmark import Bookmark |
|
|
from apps.bookmark.models.bookmark import Bookmark |
|
|
return Bookmark.objects.filter(service=Bookmark.ServiceChoices.PODCAST, content_id=obj.id, status=True).count() |
|
|
return Bookmark.objects.filter(service=Bookmark.ServiceChoices.PODCAST, content_id=obj.id, status=True).count() |
|
|
|
|
|
|
|
|
|
|
|
def validate(self, attrs): |
|
|
|
|
|
title = attrs.get("title") or getattr(self.instance, "title", "") |
|
|
|
|
|
slug = attrs.get("slug") |
|
|
|
|
|
if not slug and title: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(title, Podcast, instance=self.instance) |
|
|
|
|
|
elif slug: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(slug, Podcast, instance=self.instance) |
|
|
|
|
|
return attrs |
|
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
def create(self, validated_data): |
|
|
validated_data.pop("remove_thumbnail", False) |
|
|
validated_data.pop("remove_thumbnail", False) |
|
|
validated_data.pop("remove_audio_file", False) |
|
|
validated_data.pop("remove_audio_file", False) |
|
|
@ -183,6 +217,7 @@ class AdminPodcastPlaylistItemSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
|
class AdminPodcastPlaylistListSerializer(serializers.ModelSerializer): |
|
|
class AdminPodcastPlaylistListSerializer(serializers.ModelSerializer): |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
|
|
|
slug = serializers.SlugField(required=False, allow_blank=True, validators=[]) |
|
|
categories_detail = AdminPodcastCategorySerializer(source="categories", many=True, read_only=True) |
|
|
categories_detail = AdminPodcastCategorySerializer(source="categories", many=True, read_only=True) |
|
|
collections_detail = AdminPodcastCollectionSerializer(source="collections", many=True, read_only=True) |
|
|
collections_detail = AdminPodcastCollectionSerializer(source="collections", many=True, read_only=True) |
|
|
items_count = serializers.SerializerMethodField() |
|
|
items_count = serializers.SerializerMethodField() |
|
|
@ -215,6 +250,7 @@ class AdminPodcastPlaylistListSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
|
class AdminPodcastPlaylistDetailSerializer(serializers.ModelSerializer): |
|
|
class AdminPodcastPlaylistDetailSerializer(serializers.ModelSerializer): |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
thumbnail = AbsoluteImageField(required=False, allow_null=True) |
|
|
|
|
|
slug = serializers.SlugField(required=False, allow_blank=True, validators=[]) |
|
|
categories = serializers.PrimaryKeyRelatedField(queryset=PodcastCategory.objects.all(), many=True, required=False) |
|
|
categories = serializers.PrimaryKeyRelatedField(queryset=PodcastCategory.objects.all(), many=True, required=False) |
|
|
collections = serializers.PrimaryKeyRelatedField(queryset=PodcastCollection.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) |
|
|
categories_detail = AdminPodcastCategorySerializer(source="categories", many=True, read_only=True) |
|
|
@ -253,6 +289,15 @@ class AdminPodcastPlaylistDetailSerializer(serializers.ModelSerializer): |
|
|
from apps.bookmark.models.bookmark import Bookmark |
|
|
from apps.bookmark.models.bookmark import Bookmark |
|
|
return Bookmark.objects.filter(service=Bookmark.ServiceChoices.PODCAST_PLAYLIST, content_id=obj.id, status=True).count() |
|
|
return Bookmark.objects.filter(service=Bookmark.ServiceChoices.PODCAST_PLAYLIST, content_id=obj.id, status=True).count() |
|
|
|
|
|
|
|
|
|
|
|
def validate(self, attrs): |
|
|
|
|
|
title = attrs.get("title") or getattr(self.instance, "title", "") |
|
|
|
|
|
slug = attrs.get("slug") |
|
|
|
|
|
if not slug and title: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(title, PodcastPlaylist, instance=self.instance) |
|
|
|
|
|
elif slug: |
|
|
|
|
|
attrs["slug"] = generate_smart_slug(slug, PodcastPlaylist, instance=self.instance) |
|
|
|
|
|
return attrs |
|
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
def create(self, validated_data): |
|
|
validated_data.pop("remove_thumbnail", False) |
|
|
validated_data.pop("remove_thumbnail", False) |
|
|
categories = validated_data.pop("categories", []) |
|
|
categories = validated_data.pop("categories", []) |
|
|
|