from rest_framework import serializers from utils import FileFieldSerializer from .models import Blog, BlogContent class BlogContentSerializer(serializers.ModelSerializer): """ Serializer for BlogContent model with all details """ image = FileFieldSerializer(required=False, allow_null=True) title = serializers.SerializerMethodField() content = serializers.SerializerMethodField() slug = serializers.SerializerMethodField() class Meta: model = BlogContent fields = [ 'id', 'title', 'content', 'slug', 'image', 'order', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at'] def _lang(self): request = self.context.get('request') return getattr(request, 'LANGUAGE_CODE', None) or 'en' def get_title(self, obj: BlogContent): return obj.blog.get_blog_filed(self._lang(), obj.title) def get_content(self, obj: BlogContent): return obj.blog.get_blog_filed(self._lang(), obj.content) def get_slug(self, obj: BlogContent): return obj.blog.get_blog_filed(self._lang(), obj.slug) class BlogListSerializer(serializers.ModelSerializer): """ Serializer for Blog list view with file field for thumbnail """ thumbnail = FileFieldSerializer(required=False) title = serializers.SerializerMethodField() slogan = serializers.SerializerMethodField() summary = serializers.SerializerMethodField() slug = serializers.SerializerMethodField() seo = serializers.SerializerMethodField() class Meta: model = Blog fields = [ 'id', 'title', 'thumbnail', 'slogan', 'summary', 'views_count', 'slug', 'seo', 'created_at', 'updated_at' ] read_only_fields = ['id', 'views_count', 'created_at', 'updated_at'] def _lang(self): request = self.context.get('request') return getattr(request, 'LANGUAGE_CODE', None) or 'en' def get_title(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.title) def get_slogan(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.slogan) def get_summary(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.summary) def get_slug(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.slug) def get_seo(self, obj: Blog): return obj.get_seo_for_language(self._lang()) class BlogDetailSerializer(serializers.ModelSerializer): """ Serializer for Blog detail view with related BlogContent """ thumbnail = FileFieldSerializer(required=False) contents = serializers.SerializerMethodField() title = serializers.SerializerMethodField() slogan = serializers.SerializerMethodField() summary = serializers.SerializerMethodField() slug = serializers.SerializerMethodField() seo = serializers.SerializerMethodField() class Meta: model = Blog fields = [ 'id', 'title', 'thumbnail', 'slogan', 'summary', 'views_count', 'slug', 'seo', 'created_at', 'updated_at', 'contents' ] def get_contents(self, obj: Blog): # Pass down context (request) to nested serializer ser = BlogContentSerializer(obj.contents.all().order_by('order'), many=True, context=self.context) return ser.data read_only_fields = ['id', 'views_count', 'created_at', 'updated_at'] def _lang(self): request = self.context.get('request') return getattr(request, 'LANGUAGE_CODE', None) or 'en' def get_title(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.title) def get_slogan(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.slogan) def get_summary(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.summary) def get_slug(self, obj: Blog): return obj.get_blog_filed(self._lang(), obj.slug) def get_seo(self, obj: Blog): return obj.get_seo_for_language(self._lang())