diff --git a/apps/course/admin/course.py b/apps/course/admin/course.py index 03b0ac5..73a94fe 100644 --- a/apps/course/admin/course.py +++ b/apps/course/admin/course.py @@ -55,12 +55,12 @@ class CourseTableSection(TableSection): class CourseCategoryAdmin(ModelAdmin): - list_display = ('name', 'slug', 'course_count') + list_display = ('name', 'slug', 'icon', 'course_count') search_fields = ('name',) list_sections = [CourseTableSection] fieldsets = ( (None, { - 'fields': ('name', 'slug') + 'fields': ('name', 'slug', 'icon') }), ) diff --git a/apps/course/migrations/0011_coursecategory_icon.py b/apps/course/migrations/0011_coursecategory_icon.py new file mode 100644 index 0000000..2cf0a6b --- /dev/null +++ b/apps/course/migrations/0011_coursecategory_icon.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("course", "0010_course_rub_prices"), + ] + + operations = [ + migrations.AddField( + model_name="coursecategory", + name="icon", + field=models.URLField(blank=True, null=True, verbose_name="Icon URL"), + ), + ] diff --git a/apps/course/models/course.py b/apps/course/models/course.py index 9976dc9..3c51f06 100644 --- a/apps/course/models/course.py +++ b/apps/course/models/course.py @@ -94,6 +94,7 @@ class CourseCategory(models.Model): name = models.JSONField(default=list, null=False, blank=False, verbose_name=_('Category Name')) slug = models.JSONField(default=list, null=True, blank=True, verbose_name=_('Slug')) + icon = models.URLField(null=True, blank=True, verbose_name=_('Icon URL')) def __str__(self): return extract_text_from_json(self.name) diff --git a/apps/course/serializers/admin.py b/apps/course/serializers/admin.py index 8597a92..27b545f 100644 --- a/apps/course/serializers/admin.py +++ b/apps/course/serializers/admin.py @@ -37,9 +37,23 @@ def get_request_lang(serializer_instance): return 'en' class AdminLessonSerializer(serializers.ModelSerializer): + title_i18n = serializers.JSONField(source='title', read_only=True) + content_type_i18n = serializers.JSONField(source='content_type', read_only=True) + class Meta: model = Lesson - fields = '__all__' + fields = [ + 'id', + 'title', + 'title_i18n', + 'content_type', + 'content_type_i18n', + 'content_file', + 'video_link', + 'duration', + 'created_at', + 'updated_at', + ] def to_representation(self, instance): ret = super().to_representation(instance) @@ -80,10 +94,12 @@ def serialize_file(value, serializer): class AdminCourseCategorySerializer(serializers.ModelSerializer): slug = serializers.JSONField(required=False, allow_null=True) + name_i18n = serializers.JSONField(source='name', read_only=True) + slug_i18n = serializers.JSONField(source='slug', read_only=True) class Meta: model = CourseCategory - fields = ['id', 'name', 'slug'] + fields = ['id', 'name', 'name_i18n', 'slug', 'slug_i18n', 'icon'] def to_representation(self, instance): ret = super().to_representation(instance) @@ -210,9 +226,11 @@ class AdminCourseDetailSerializer(serializers.ModelSerializer): class AdminCourseChapterSerializer(serializers.ModelSerializer): + title_i18n = serializers.JSONField(source='title', read_only=True) + class Meta: model = CourseChapter - fields = ['id', 'course', 'title', 'priority', 'is_active', 'created_at'] + fields = ['id', 'course', 'title', 'title_i18n', 'priority', 'is_active', 'created_at'] read_only_fields = ['id', 'created_at'] def to_representation(self, instance): @@ -259,9 +277,11 @@ class AdminCourseLessonSerializer(serializers.Serializer): 'chapter': instance.chapter_id, 'lesson': instance.lesson_id, 'title': localized_title, + 'title_i18n': raw_title, 'priority': instance.priority, 'is_active': instance.is_active, 'content_type': localized_content_type, + 'content_type_i18n': raw_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, diff --git a/apps/course/serializers/course.py b/apps/course/serializers/course.py index 954279a..ae89f82 100644 --- a/apps/course/serializers/course.py +++ b/apps/course/serializers/course.py @@ -2,7 +2,7 @@ from rest_framework import serializers # from dj_filer.admin import get_thumbs from utils import get_thumbs from apps.course.models import Course, CourseCategory, Attachment, Glossary, LessonCompletion, Participant, Lesson, CourseAttachment, CourseGlossary, CourseLesson -from apps.course.models.course import get_localized_field +from apps.course.models.course import get_localized_field, normalize_level, normalize_status from apps.chat.models import RoomMessage from apps.account.serializers import UserProfileSerializer from decimal import Decimal @@ -38,7 +38,7 @@ class CourseCategorySerializer(serializers.ModelSerializer): class Meta: model = CourseCategory - fields = ['id', 'name', 'slug', 'course_count'] + fields = ['id', 'name', 'slug', 'icon', 'course_count'] def _lang(self): request = self.context.get('request') @@ -104,10 +104,10 @@ class CourseListSerializer(serializers.ModelSerializer): return get_localized_field(self._lang(), obj.slug) def get_level(self, obj): - return get_localized_field(self._lang(), obj.level) + return normalize_level(obj.level) def get_status(self, obj): - return get_localized_field(self._lang(), obj.status) + return normalize_status(obj.status) def get_short_description(self, obj): return get_localized_field(self._lang(), obj.short_description) @@ -450,10 +450,10 @@ class CourseDetailSerializer(serializers.ModelSerializer): return get_localized_field(self._lang(), obj.slug) def get_level(self, obj): - return get_localized_field(self._lang(), obj.level) + return normalize_level(obj.level) def get_status(self, obj): - return get_localized_field(self._lang(), obj.status) + return normalize_status(obj.status) def get_description(self, obj): return get_localized_field(self._lang(), obj.description) @@ -617,7 +617,7 @@ class MyCourseListSerializer(serializers.ModelSerializer): return get_localized_field(self._lang(), obj.slug) def get_status(self, obj): - return get_localized_field(self._lang(), obj.status) + return normalize_status(obj.status) def get_short_description(self, obj): return get_localized_field(self._lang(), obj.short_description)