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.
 
 

142 lines
4.3 KiB

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())