|
|
|
@ -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 |
|
|
|
|
|
|
|
|
|
|
|
|