|
|
|
@ -15,23 +15,46 @@ from apps.course.models import ( |
|
|
|
LiveSessionRecording |
|
|
|
) |
|
|
|
from apps.account.models import ProfessorUser |
|
|
|
from apps.course.models.course import extract_text_from_json |
|
|
|
from apps.course.models.course import extract_text_from_json, get_localized_field |
|
|
|
|
|
|
|
def get_request_lang(serializer_instance): |
|
|
|
request = serializer_instance.context.get('request') |
|
|
|
return getattr(request, 'LANGUAGE_CODE', None) or 'en' |
|
|
|
|
|
|
|
class AdminLessonSerializer(serializers.ModelSerializer): |
|
|
|
class Meta: |
|
|
|
model = Lesson |
|
|
|
fields = '__all__' |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
lang = get_request_lang(self) |
|
|
|
ret['title'] = get_localized_field(lang, instance.title) |
|
|
|
ret['content_type'] = get_localized_field(lang, instance.content_type) |
|
|
|
return ret |
|
|
|
|
|
|
|
class AdminGlossarySerializer(serializers.ModelSerializer): |
|
|
|
class Meta: |
|
|
|
model = Glossary |
|
|
|
fields = '__all__' |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
lang = get_request_lang(self) |
|
|
|
ret['description'] = get_localized_field(lang, instance.description) |
|
|
|
return ret |
|
|
|
|
|
|
|
class AdminAttachmentSerializer(serializers.ModelSerializer): |
|
|
|
class Meta: |
|
|
|
model = Attachment |
|
|
|
fields = '__all__' |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
lang = get_request_lang(self) |
|
|
|
ret['title'] = get_localized_field(lang, instance.title) |
|
|
|
return ret |
|
|
|
|
|
|
|
|
|
|
|
def serialize_file(value, serializer): |
|
|
|
if not value: |
|
|
|
@ -47,6 +70,13 @@ class AdminCourseCategorySerializer(serializers.ModelSerializer): |
|
|
|
model = CourseCategory |
|
|
|
fields = ['id', 'name', 'slug'] |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
lang = get_request_lang(self) |
|
|
|
ret['name'] = get_localized_field(lang, instance.name) |
|
|
|
ret['slug'] = get_localized_field(lang, instance.slug) |
|
|
|
return ret |
|
|
|
|
|
|
|
class AdminCourseListSerializer(serializers.ModelSerializer): |
|
|
|
category_name = serializers.SerializerMethodField() |
|
|
|
professor_name = serializers.CharField(source='professor.fullname', read_only=True) |
|
|
|
@ -84,7 +114,19 @@ class AdminCourseListSerializer(serializers.ModelSerializer): |
|
|
|
return get_thumbs(obj.thumbnail, self.context.get('request')) |
|
|
|
|
|
|
|
def get_category_name(self, obj): |
|
|
|
return extract_text_from_json(obj.category.name) if obj.category else "" |
|
|
|
if not obj.category: |
|
|
|
return "" |
|
|
|
lang = get_request_lang(self) |
|
|
|
return get_localized_field(lang, obj.category.name) |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
lang = get_request_lang(self) |
|
|
|
ret['title'] = get_localized_field(lang, instance.title) |
|
|
|
ret['slug'] = get_localized_field(lang, instance.slug) |
|
|
|
ret['level'] = get_localized_field(lang, instance.level) |
|
|
|
ret['status'] = get_localized_field(lang, instance.status) |
|
|
|
return ret |
|
|
|
|
|
|
|
|
|
|
|
class AdminCourseDetailSerializer(serializers.ModelSerializer): |
|
|
|
@ -135,7 +177,21 @@ class AdminCourseDetailSerializer(serializers.ModelSerializer): |
|
|
|
return obj.participants.count() |
|
|
|
|
|
|
|
def get_category_name(self, obj): |
|
|
|
return extract_text_from_json(obj.category.name) if obj.category else "" |
|
|
|
if not obj.category: |
|
|
|
return "" |
|
|
|
lang = get_request_lang(self) |
|
|
|
return get_localized_field(lang, obj.category.name) |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
lang = get_request_lang(self) |
|
|
|
ret['title'] = get_localized_field(lang, instance.title) |
|
|
|
ret['slug'] = get_localized_field(lang, instance.slug) |
|
|
|
ret['level'] = get_localized_field(lang, instance.level) |
|
|
|
ret['status'] = get_localized_field(lang, instance.status) |
|
|
|
ret['timing'] = get_localized_field(lang, instance.timing) |
|
|
|
ret['features'] = get_localized_field(lang, instance.features) |
|
|
|
return ret |
|
|
|
|
|
|
|
|
|
|
|
class AdminCourseChapterSerializer(serializers.ModelSerializer): |
|
|
|
@ -144,6 +200,12 @@ class AdminCourseChapterSerializer(serializers.ModelSerializer): |
|
|
|
fields = ['id', 'course', 'title', 'priority', 'is_active', 'created_at'] |
|
|
|
read_only_fields = ['id', 'created_at'] |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
lang = get_request_lang(self) |
|
|
|
ret['title'] = get_localized_field(lang, instance.title) |
|
|
|
return ret |
|
|
|
|
|
|
|
|
|
|
|
class AdminCourseLessonSerializer(serializers.Serializer): |
|
|
|
id = serializers.IntegerField(read_only=True) |
|
|
|
@ -168,15 +230,23 @@ class AdminCourseLessonSerializer(serializers.Serializer): |
|
|
|
Map a CourseLesson instance to representation fields. |
|
|
|
""" |
|
|
|
lesson_obj = instance.lesson |
|
|
|
lang = get_request_lang(self) |
|
|
|
|
|
|
|
raw_title = instance.title or (lesson_obj.title if lesson_obj else []) |
|
|
|
localized_title = get_localized_field(lang, raw_title) |
|
|
|
|
|
|
|
raw_content_type = lesson_obj.content_type if lesson_obj else [] |
|
|
|
localized_content_type = get_localized_field(lang, raw_content_type) |
|
|
|
|
|
|
|
return { |
|
|
|
'id': instance.id, |
|
|
|
'course': instance.course_id, |
|
|
|
'chapter': instance.chapter_id, |
|
|
|
'lesson': instance.lesson_id, |
|
|
|
'title': instance.title or (lesson_obj.title if lesson_obj else []), |
|
|
|
'title': localized_title, |
|
|
|
'priority': instance.priority, |
|
|
|
'is_active': instance.is_active, |
|
|
|
'content_type': lesson_obj.content_type if lesson_obj else [], |
|
|
|
'content_type': localized_content_type, |
|
|
|
'content_file': serialize_file(lesson_obj.content_file, self) if lesson_obj and lesson_obj.content_file else None, |
|
|
|
'video_link': lesson_obj.video_link if lesson_obj else "", |
|
|
|
'duration': lesson_obj.duration if lesson_obj else 0, |
|
|
|
@ -273,11 +343,14 @@ class AdminCourseAttachmentSerializer(serializers.Serializer): |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
attachment_obj = instance.attachment |
|
|
|
lang = get_request_lang(self) |
|
|
|
raw_title = attachment_obj.title if attachment_obj else [] |
|
|
|
localized_title = get_localized_field(lang, raw_title) |
|
|
|
return { |
|
|
|
'id': instance.id, |
|
|
|
'course': instance.course_id, |
|
|
|
'attachment': instance.attachment_id, |
|
|
|
'title': attachment_obj.title if attachment_obj else [], |
|
|
|
'title': localized_title, |
|
|
|
'file': serialize_file(attachment_obj.file, self) if attachment_obj and attachment_obj.file else None, |
|
|
|
'file_size': attachment_obj.file_size if attachment_obj else 0 |
|
|
|
} |
|
|
|
@ -339,12 +412,15 @@ class AdminCourseGlossarySerializer(serializers.Serializer): |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
glossary_obj = instance.glossary |
|
|
|
lang = get_request_lang(self) |
|
|
|
raw_description = glossary_obj.description if glossary_obj else [] |
|
|
|
localized_description = get_localized_field(lang, raw_description) |
|
|
|
return { |
|
|
|
'id': instance.id, |
|
|
|
'course': instance.course_id, |
|
|
|
'glossary': instance.glossary_id, |
|
|
|
'title': glossary_obj.title if glossary_obj else "", |
|
|
|
'description': glossary_obj.description if glossary_obj else [] |
|
|
|
'description': localized_description |
|
|
|
} |
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
|
@ -411,19 +487,25 @@ class AdminLiveSessionRecordingSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
|
|
|
|
class AdminLiveSessionListSerializer(serializers.ModelSerializer): |
|
|
|
course_title = serializers.CharField(source='course.title', read_only=True) |
|
|
|
course_title = serializers.SerializerMethodField() |
|
|
|
participant_count = serializers.SerializerMethodField() |
|
|
|
|
|
|
|
class Meta: |
|
|
|
model = CourseLiveSession |
|
|
|
fields = ['id', 'course', 'course_title', 'room_id', 'subject', 'started_at', 'ended_at', 'participant_count', 'created_at'] |
|
|
|
|
|
|
|
def get_course_title(self, obj): |
|
|
|
if not obj.course: |
|
|
|
return "" |
|
|
|
lang = get_request_lang(self) |
|
|
|
return get_localized_field(lang, obj.course.title) |
|
|
|
|
|
|
|
def get_participant_count(self, obj): |
|
|
|
return obj.user_sessions.count() |
|
|
|
|
|
|
|
|
|
|
|
class AdminLiveSessionDetailSerializer(serializers.ModelSerializer): |
|
|
|
course_title = serializers.CharField(source='course.title', read_only=True) |
|
|
|
course_title = serializers.SerializerMethodField() |
|
|
|
user_sessions = AdminLiveSessionUserSerializer(many=True, read_only=True) |
|
|
|
recordings = AdminLiveSessionRecordingSerializer(many=True, read_only=True) |
|
|
|
recorded_file = FileFieldSerializer(required=False, allow_null=True) |
|
|
|
@ -431,3 +513,9 @@ class AdminLiveSessionDetailSerializer(serializers.ModelSerializer): |
|
|
|
class Meta: |
|
|
|
model = CourseLiveSession |
|
|
|
fields = ['id', 'course', 'course_title', 'room_id', 'subject', 'started_at', 'ended_at', 'recorded_file', 'user_sessions', 'recordings', 'created_at', 'updated_at'] |
|
|
|
|
|
|
|
def get_course_title(self, obj): |
|
|
|
if not obj.course: |
|
|
|
return "" |
|
|
|
lang = get_request_lang(self) |
|
|
|
return get_localized_field(lang, obj.course.title) |