diff --git a/apps/article/serializers_admin.py b/apps/article/serializers_admin.py index 4ff4def..173cd5f 100644 --- a/apps/article/serializers_admin.py +++ b/apps/article/serializers_admin.py @@ -2,7 +2,7 @@ from rest_framework import serializers from django.core.files.uploadedfile import SimpleUploadedFile from utils.image_compression import maybe_compress_uploaded_file -from .models import Article, ArticleCategory, ArticleContent, ContentPart, TextSection +from .models import Article, ArticleCategory, ArticleCollection, ArticleContent, ContentPart, TextSection class AbsoluteImageField(serializers.ImageField): @@ -45,10 +45,17 @@ class AdminArticleCategorySerializer(serializers.ModelSerializer): fields = ["id", "title", "slug", "status", "order"] +class AdminArticleCollectionSerializer(serializers.ModelSerializer): + class Meta: + model = ArticleCollection + fields = ["id", "title", "slug", "summary", "display_position", "status", "order", "pin_top"] + + class AdminArticleListSerializer(serializers.ModelSerializer): thumbnail = AbsoluteImageField(required=False, allow_null=True) article_file = AbsoluteFileField(required=False, allow_null=True) categories = AdminArticleCategorySerializer(many=True, read_only=True) + collections_detail = AdminArticleCollectionSerializer(source="collections", many=True, read_only=True) class Meta: model = Article @@ -65,6 +72,7 @@ class AdminArticleListSerializer(serializers.ModelSerializer): "created_at", "updated_at", "categories", + "collections_detail", ] read_only_fields = ["id", "view_count", "download_count", "created_at", "updated_at"] @@ -78,9 +86,17 @@ class AdminArticleDetailSerializer(serializers.ModelSerializer): required=False, ) categories_detail = AdminArticleCategorySerializer(source="categories", many=True, read_only=True) + collections = serializers.PrimaryKeyRelatedField( + queryset=ArticleCollection.objects.all(), + many=True, + required=False, + ) + collections_detail = AdminArticleCollectionSerializer(source="collections", many=True, read_only=True) remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) remove_article_file = serializers.BooleanField(write_only=True, required=False, default=False) + bookmark_count = serializers.SerializerMethodField() + class Meta: model = Article fields = [ @@ -93,30 +109,41 @@ class AdminArticleDetailSerializer(serializers.ModelSerializer): "article_file", "view_count", "download_count", + "bookmark_count", "status", "created_at", "updated_at", "categories", "categories_detail", + "collections", + "collections_detail", "embedded_in", "remove_thumbnail", "remove_article_file", ] - read_only_fields = ["id", "view_count", "download_count", "created_at", "updated_at"] + read_only_fields = ["id", "view_count", "download_count", "bookmark_count", "created_at", "updated_at"] + + def get_bookmark_count(self, obj): + from apps.bookmark.models.bookmark import Bookmark + return Bookmark.objects.filter(service=Bookmark.ServiceChoices.ARTICLE, content_id=obj.id, status=True).count() def create(self, validated_data): validated_data.pop("remove_thumbnail", False) validated_data.pop("remove_article_file", False) categories = validated_data.pop("categories", []) + collections = validated_data.pop("collections", []) article = super().create(validated_data) if categories: article.categories.set(categories) + if collections: + article.collections.set(collections) return article def update(self, instance, validated_data): remove_thumbnail = validated_data.pop("remove_thumbnail", False) remove_article_file = validated_data.pop("remove_article_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) @@ -129,6 +156,8 @@ class AdminArticleDetailSerializer(serializers.ModelSerializer): article = super().update(instance, validated_data) if categories is not None: article.categories.set(categories) + if collections is not None: + article.collections.set(collections) return article diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 3645c6d..953195a 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -95,6 +95,8 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): required=False, ) + bookmark_count = serializers.SerializerMethodField() + class Meta: model = Hadis fields = [ @@ -118,11 +120,16 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): "tags_detail", "share_link", "explanation", + "bookmark_count", "created_at", "updated_at", "embedded_in", ] - read_only_fields = ["id", "slug", "share_link", "created_at", "updated_at"] + read_only_fields = ["id", "slug", "share_link", "bookmark_count", "created_at", "updated_at"] + + def get_bookmark_count(self, obj): + from apps.bookmark.models.bookmark import Bookmark + return Bookmark.objects.filter(service=Bookmark.ServiceChoices.HADITH, content_id=obj.id, status=True).count() def create(self, validated_data): tags = validated_data.pop("tags", []) @@ -142,6 +149,8 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): class AdminHadisCorrectionSerializer(serializers.ModelSerializer): hadis_detail = AdminHadisListSerializer(source="hadis", read_only=True) + bookmark_count = serializers.SerializerMethodField() + class Meta: model = HadisCorrection fields = [ @@ -153,10 +162,15 @@ class AdminHadisCorrectionSerializer(serializers.ModelSerializer): "text", "translation", "priority", + "bookmark_count", "created_at", "updated_at", ] - read_only_fields = ["id", "slug", "created_at", "updated_at"] + read_only_fields = ["id", "slug", "bookmark_count", "created_at", "updated_at"] + + def get_bookmark_count(self, obj): + from apps.bookmark.models.bookmark import Bookmark + return Bookmark.objects.filter(service=Bookmark.ServiceChoices.HADITH_CORRECTION, content_id=obj.id, status=True).count() class AdminHadisInterpretationSerializer(serializers.ModelSerializer): diff --git a/apps/podcast/serializers_admin.py b/apps/podcast/serializers_admin.py index 0643c54..801ed3f 100644 --- a/apps/podcast/serializers_admin.py +++ b/apps/podcast/serializers_admin.py @@ -86,6 +86,8 @@ class AdminPodcastDetailSerializer(serializers.ModelSerializer): remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) remove_audio_file = serializers.BooleanField(write_only=True, required=False, default=False) + bookmark_count = serializers.SerializerMethodField() + class Meta: model = Podcast fields = [ @@ -99,6 +101,7 @@ class AdminPodcastDetailSerializer(serializers.ModelSerializer): "status", "view_count", "download_count", + "bookmark_count", "created_at", "updated_at", "categories", @@ -108,7 +111,11 @@ class AdminPodcastDetailSerializer(serializers.ModelSerializer): "remove_thumbnail", "remove_audio_file", ] - read_only_fields = ["id", "view_count", "download_count", "created_at", "updated_at"] + read_only_fields = ["id", "view_count", "download_count", "bookmark_count", "created_at", "updated_at"] + + def get_bookmark_count(self, obj): + from apps.bookmark.models.bookmark import Bookmark + return Bookmark.objects.filter(service=Bookmark.ServiceChoices.PODCAST, content_id=obj.id, status=True).count() def create(self, validated_data): validated_data.pop("remove_thumbnail", False) @@ -214,6 +221,8 @@ class AdminPodcastPlaylistDetailSerializer(serializers.ModelSerializer): playlist_items_detail = AdminPodcastPlaylistItemSerializer(source="playlist_items", many=True, read_only=True) remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) + bookmark_count = serializers.SerializerMethodField() + class Meta: model = PodcastPlaylist fields = [ @@ -226,6 +235,7 @@ class AdminPodcastPlaylistDetailSerializer(serializers.ModelSerializer): "order", "status", "view_count", + "bookmark_count", "total_time", "created_at", "updated_at", @@ -236,7 +246,11 @@ class AdminPodcastPlaylistDetailSerializer(serializers.ModelSerializer): "playlist_items_detail", "remove_thumbnail", ] - read_only_fields = ["id", "view_count", "total_time", "created_at", "updated_at", "playlist_items_detail"] + read_only_fields = ["id", "view_count", "bookmark_count", "total_time", "created_at", "updated_at", "playlist_items_detail"] + + def get_bookmark_count(self, obj): + from apps.bookmark.models.bookmark import Bookmark + return Bookmark.objects.filter(service=Bookmark.ServiceChoices.PODCAST_PLAYLIST, content_id=obj.id, status=True).count() def create(self, validated_data): validated_data.pop("remove_thumbnail", False) diff --git a/apps/video/serializers_admin.py b/apps/video/serializers_admin.py index 0e37535..8bab2ea 100644 --- a/apps/video/serializers_admin.py +++ b/apps/video/serializers_admin.py @@ -81,6 +81,8 @@ class AdminVideoDetailSerializer(serializers.ModelSerializer): remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) remove_video_file = serializers.BooleanField(write_only=True, required=False, default=False) + bookmark_count = serializers.SerializerMethodField() + class Meta: model = Video fields = [ @@ -95,12 +97,17 @@ class AdminVideoDetailSerializer(serializers.ModelSerializer): "video_time", "status", "view_count", + "bookmark_count", "created_at", "updated_at", "remove_thumbnail", "remove_video_file", ] - read_only_fields = ["id", "view_count", "created_at", "updated_at"] + read_only_fields = ["id", "view_count", "bookmark_count", "created_at", "updated_at"] + + def get_bookmark_count(self, obj): + from apps.bookmark.models.bookmark import Bookmark + return Bookmark.objects.filter(service=Bookmark.ServiceChoices.VIDEO, content_id=obj.id, status=True).count() def validate(self, attrs): video_type = attrs.get("video_type", getattr(self.instance, "video_type", None)) @@ -215,6 +222,8 @@ class AdminVideoPlaylistDetailSerializer(serializers.ModelSerializer): playlist_items_detail = AdminVideoPlaylistItemSerializer(source="playlist_items", many=True, read_only=True) remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) + bookmark_count = serializers.SerializerMethodField() + class Meta: model = VideoPlaylist fields = [ @@ -227,6 +236,7 @@ class AdminVideoPlaylistDetailSerializer(serializers.ModelSerializer): "order", "status", "view_count", + "bookmark_count", "total_time", "created_at", "updated_at", @@ -237,7 +247,11 @@ class AdminVideoPlaylistDetailSerializer(serializers.ModelSerializer): "playlist_items_detail", "remove_thumbnail", ] - read_only_fields = ["id", "view_count", "total_time", "created_at", "updated_at", "playlist_items_detail"] + read_only_fields = ["id", "view_count", "bookmark_count", "total_time", "created_at", "updated_at", "playlist_items_detail"] + + def get_bookmark_count(self, obj): + from apps.bookmark.models.bookmark import Bookmark + return Bookmark.objects.filter(service=Bookmark.ServiceChoices.VIDEO_PLAYLIST, content_id=obj.id, status=True).count() def create(self, validated_data): validated_data.pop("remove_thumbnail", False)