from django.contrib.auth import get_user_model from rest_framework import serializers from courses.models import Course, Lesson, Topic class TopicSerializer(serializers.ModelSerializer): children = serializers.SerializerMethodField() class Meta: model = Topic fields = '__all__' @staticmethod def get_children(self): return [MiniLessonSerializer(i).data for i in self.lesson_set.all()] class MiniLessonSerializer(serializers.ModelSerializer): class Meta: model = Lesson fields = ('title', 'free', 'token', 'is_hm') class LessonSerializer(MiniLessonSerializer): course_slug = serializers.SerializerMethodField() class Meta: model = Lesson exclude = ('id', 'topic', 'key') @staticmethod def get_course_slug(self): return self.topic.course.slug class TeacherLessonSerializer(MiniLessonSerializer): topic_sort = serializers.SerializerMethodField() topic_title = serializers.SerializerMethodField() course_title = serializers.SerializerMethodField() class Meta: model = Lesson fields = ('topic_sort', 'description', 'title', 'course_title', 'token', 'topic_title') @staticmethod def get_topic_sort(self): for topic_idx, topic in enumerate(self.topic.course.topic_set.all()): if topic == self.topic: return topic_idx + 1 return None @staticmethod def get_topic_title(self): return self.topic.title @staticmethod def get_course_title(self): return self.topic.course.title class CourseInitSerializer(serializers.ModelSerializer): class Meta: model = Course fields = ['title', 'slug'] class CourseTreeSerializer(serializers.ModelSerializer): tree = serializers.SerializerMethodField() class Meta: model = Course fields = ('tree', 'slug') @staticmethod def get_tree(self): return [TopicSerializer(i).data for i in self.topic_set.all()] class CourseDetailSerializer(serializers.ModelSerializer): level = serializers.SerializerMethodField() direction = serializers.SerializerMethodField() statistic = serializers.SerializerMethodField() teacher_emails = serializers.SerializerMethodField() class Meta: model = Course exclude = ('id', ) @staticmethod def get_teacher_emails(self): return [i.email for i in get_user_model().objects.filter(out_key__in=self.teacher_tokens)] @staticmethod def get_level(self): return self.get_level_display() @staticmethod def get_direction(self): return self.get_direction_display() @staticmethod def get_statistic(self): return self.get_statistic()