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.
147 lines
4.9 KiB
147 lines
4.9 KiB
from rest_framework import serializers
|
|
from utils import get_thumbs
|
|
from apps.article.models import *
|
|
from apps.bookmark.serializers import *
|
|
|
|
|
|
class ArticleCategoryListSerializer(serializers.ModelSerializer):
|
|
acticle_count = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ArticleCategory
|
|
fields = ['id', 'title', 'slug', 'acticle_count']
|
|
|
|
def get_acticle_count(self, obj):
|
|
return obj.articles.filter(status=True).count()
|
|
|
|
class PinnedArticleCollectionSerializer(serializers.ModelSerializer):
|
|
thumbnail = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ArticleCollection
|
|
fields = ['id', 'title', 'slug', 'summary', 'thumbnail', 'order', 'created_at']
|
|
|
|
def get_thumbnail(self, obj):
|
|
return get_thumbs(obj.thumbnail, self.context.get('request'))
|
|
|
|
|
|
|
|
|
|
class MiddleArticleCollectionSerializer(serializers.ModelSerializer):
|
|
articles = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ArticleCollection
|
|
fields = ('id', 'title', 'slug', 'summary', 'status', 'order', 'pin_top', 'articles')
|
|
|
|
def get_articles(self, obj):
|
|
articles = obj.articles.filter(status=True).order_by('-created_at')
|
|
return ArticleListSerializer(articles, many=True, context=self.context).data
|
|
|
|
|
|
|
|
|
|
class ArticleListSerializer(serializers.ModelSerializer):
|
|
thumbnail = serializers.SerializerMethodField()
|
|
categories = ArticleCategoryListSerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = Article
|
|
fields = ['id', 'title', 'slug', 'thumbnail', 'description', 'view_count', 'created_at', 'categories']
|
|
|
|
def get_thumbnail(self, obj):
|
|
return get_thumbs(obj.thumbnail, self.context.get('request'))
|
|
|
|
|
|
class TextSectionSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = TextSection
|
|
fields = ['id', 'arabic_text', 'translation', 'order']
|
|
|
|
class ContentPartSerializer(serializers.ModelSerializer):
|
|
text_sections = TextSectionSerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = ContentPart
|
|
fields = ['id', 'order', 'text_sections']
|
|
|
|
class ArticleContentSerializer(serializers.ModelSerializer):
|
|
parts = ContentPartSerializer(many=True, read_only=True)
|
|
class Meta:
|
|
model = ArticleContent
|
|
fields = ['id', 'title', 'content', 'priority', 'status', 'created_at', 'updated_at', 'parts']
|
|
|
|
class ArticleDetailSerializer(serializers.ModelSerializer):
|
|
categories = ArticleCategoryListSerializer(many=True, read_only=True)
|
|
thumbnail = serializers.SerializerMethodField()
|
|
bookmark = serializers.SerializerMethodField()
|
|
user_rate = serializers.SerializerMethodField()
|
|
average_rate = serializers.SerializerMethodField()
|
|
article_content = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Article
|
|
fields = ['id', 'title', 'slug', 'thumbnail', 'description',
|
|
'article_file', 'view_count', 'download_count',
|
|
'categories', 'created_at', 'user_rate', 'average_rate', 'bookmark', 'article_content']
|
|
|
|
def get_thumbnail(self, obj):
|
|
return get_thumbs(obj.thumbnail, self.context.get('request'))
|
|
|
|
def get_bookmark(self, obj):
|
|
"""
|
|
Get bookmark information for this article.
|
|
"""
|
|
# Get the current user from the request context
|
|
request = self.context.get('request')
|
|
user = request.user if request else None
|
|
book_mark = BookmarkStatusSerializer.get_bookmark_info(
|
|
obj=obj,
|
|
user=user,
|
|
service='article',
|
|
)
|
|
return book_mark.get('is_bookmarked', False)
|
|
|
|
def get_user_rate(self, obj):
|
|
"""
|
|
Get rate information for this article from the current user.
|
|
"""
|
|
from apps.bookmark.models.rate import Rate
|
|
|
|
# Get the current user from the request context
|
|
request = self.context.get('request')
|
|
user = request.user if request and request.user.is_authenticated else None
|
|
|
|
if not user:
|
|
return {
|
|
'is_rated': False,
|
|
'rate': None
|
|
}
|
|
|
|
# Get rate information using the Rate model's method
|
|
rate_info = Rate.get_user_rate(
|
|
user=user,
|
|
service='article',
|
|
content_id=obj.id
|
|
)
|
|
|
|
return rate_info
|
|
|
|
def get_average_rate(self, obj):
|
|
"""
|
|
Get the average rate for this article.
|
|
"""
|
|
from apps.bookmark.models.rate import Rate
|
|
|
|
# Get average rate information using the Rate model
|
|
return Rate.get_average_rate(
|
|
service='article',
|
|
content_id=obj.id
|
|
)
|
|
|
|
def get_article_content(self, obj):
|
|
"""
|
|
Get the content of the article.
|
|
"""
|
|
content = obj.contents.all()
|
|
return ArticleContentSerializer(content, many=True, context=self.context).data
|