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