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) share_link = serializers.CharField(read_only=True) class Meta: model = Article fields = ['id', 'title', 'slug', 'thumbnail', 'description', 'view_count', 'created_at', 'categories', 'share_link'] 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 SimilarArticleSerializer(serializers.ModelSerializer): categories = ArticleCategoryListSerializer(many=True, read_only=True) thumbnail = serializers.SerializerMethodField() share_link = serializers.CharField(read_only=True) class Meta: model = Article fields = ['title', 'slug', 'thumbnail', 'categories', 'share_link', 'created_at'] def get_thumbnail(self, obj): return get_thumbs(obj.thumbnail, self.context.get('request')) 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() share_link = serializers.CharField(read_only=True) similar_articles = 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', 'share_link', 'similar_articles'] 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_similar_articles(self, obj): category_ids = obj.categories.values_list('id', flat=True) similar = ( Article.objects .filter(categories__id__in=category_ids, status=True) .exclude(id=obj.id) .distinct() .order_by('-created_at')[:3] ) return SimilarArticleSerializer(similar, many=True, context=self.context).data 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