Files
chunyu_project/learn/serializers.py
T

199 lines
6.5 KiB
Python

from adrf.serializers import (
ModelSerializer, SerializerMethodField,
)
from .models import Course, Chapter, ChapterContent, CourseMaterial
class ChapterSerializer(ModelSerializer):
video_poster_url = SerializerMethodField()
video_local_url = SerializerMethodField()
class Meta:
model = Chapter
fields = ['id', 'title', 'sort_order', 'duration', 'is_free', 'video_url', 'video_source', 'video_local_url', 'video_poster_url', 'created_at', 'updated_at']
async def get_video_poster_url(self, obj):
if obj.video_poster:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.video_poster.url)
return obj.video_poster.url
return ''
async def get_video_local_url(self, obj):
if obj.video_local:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.video_local.url)
return obj.video_local.url
return ''
class ChapterContentSerializer(ModelSerializer):
class Meta:
model = ChapterContent
fields = ['id', 'chapter', 'content_md', 'content_html', 'md_file_path', 'updated_at']
class MaterialSerializer(ModelSerializer):
file_url = SerializerMethodField()
file_size_display = SerializerMethodField()
file_type_display = SerializerMethodField()
class Meta:
model = CourseMaterial
fields = ['id', 'title', 'file_url', 'file_type', 'file_type_display', 'file_size', 'file_size_display', 'download_count', 'sort_order', 'created_at']
async def get_file_url(self, obj):
if obj.file:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.file.url)
return obj.file.url
return ''
async def get_file_size_display(self, obj):
size = obj.file_size
if size < 1024:
return f'{size} B'
elif size < 1024 * 1024:
return f'{size / 1024:.1f} KB'
else:
return f'{size / (1024 * 1024):.1f} MB'
async def get_file_type_display(self, obj):
type_map = {
'pdf': 'PDF',
'code': '代码',
'doc': '文档',
'video': '视频',
'dataset': '数据集',
'zip': '压缩包',
'other': '其他',
}
return type_map.get(obj.file_type, '其他')
class ChapterSerializer(ModelSerializer):
video_poster_url = SerializerMethodField()
class Meta:
model = Chapter
fields = ['id', 'title', 'sort_order', 'duration', 'is_free', 'video_url', 'video_poster_url', 'created_at', 'updated_at']
async def get_video_poster_url(self, obj):
if obj.video_poster:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.video_poster.url)
return obj.video_poster.url
return ''
class ChapterContentSerializer(ModelSerializer):
class Meta:
model = ChapterContent
fields = ['id', 'chapter', 'content_md', 'content_html', 'md_file_path', 'updated_at']
class CourseListSerializer(ModelSerializer):
author_name = SerializerMethodField()
chapters_count = SerializerMethodField()
students_count = SerializerMethodField()
cover_image_url = SerializerMethodField()
class Meta:
model = Course
fields = [
'id', 'title', 'description', 'category', 'level',
'cover_image_url', 'color', 'icon_name', 'author_name',
'chapters_count', 'students_count', 'status',
'sort_order', 'is_hot', 'is_new', 'created_at', 'updated_at',
]
async def get_chapters_count(self, obj):
return await obj.chapters.acount()
async def get_students_count(self, obj):
return 0
async def get_cover_image_url(self, obj):
if obj.cover_image:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.cover_image.url)
return obj.cover_image.url
return ''
async def get_author_name(self, obj):
if obj.author:
return obj.author.get_full_name() or obj.author.username
return ''
class CourseDetailSerializer(ModelSerializer):
author_name = SerializerMethodField()
chapters = ChapterSerializer(many=True, read_only=True)
chapters_count = SerializerMethodField()
students_count = SerializerMethodField()
cover_image_url = SerializerMethodField()
class Meta:
model = Course
fields = [
'id', 'title', 'description', 'category', 'level',
'cover_image_url', 'color', 'icon_name', 'author_name',
'chapters', 'chapters_count', 'students_count', 'status',
'sort_order', 'is_hot', 'is_new', 'created_at', 'updated_at',
]
async def get_chapters_count(self, obj):
return await obj.chapters.acount()
async def get_students_count(self, obj):
return 0
async def get_cover_image_url(self, obj):
if obj.cover_image:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.cover_image.url)
return obj.cover_image.url
return ''
async def get_author_name(self, obj):
if obj.author:
return obj.author.get_full_name() or obj.author.username
return ''
class CourseCreateUpdateSerializer(ModelSerializer):
class Meta:
model = Course
fields = ['title', 'description', 'category', 'level', 'cover_image', 'color', 'icon_name', 'status', 'sort_order', 'is_hot', 'is_new']
async def acreate(self, validated_data):
validated_data['author'] = self.context['request'].user
return await super().acreate(validated_data)
class CourseManageSerializer(ModelSerializer):
author_name = SerializerMethodField()
chapters_count = SerializerMethodField()
class Meta:
model = Course
fields = [
'id', 'title', 'category', 'level', 'status',
'sort_order', 'is_hot', 'is_new', 'chapters_count',
'author_name', 'created_at', 'updated_at',
]
async def get_chapters_count(self, obj):
return await obj.chapters.acount()
async def get_author_name(self, obj):
if obj.author:
return obj.author.get_full_name() or obj.author.username
return ''