from rest_framework import serializers from courses.models import Course, Vertex, Tutorial, Topic, Task from maps.serializers import CourseRouteSerializer class TutorialSerializer(serializers.ModelSerializer): materials = serializers.SerializerMethodField() class Meta: model = Tutorial exclude = ['id'] @staticmethod def get_materials(self): return [i.original.url for i in self.materials.all()] class TaskSerializer(serializers.ModelSerializer): class Meta: model = Task exclude = ['id'] class TopicSerializer(serializers.ModelSerializer): class Meta: model = Topic exclude = ['id'] class MiniVertexSerializer(serializers.ModelSerializer): object = serializers.SerializerMethodField() type = serializers.SerializerMethodField() class Meta: model = Vertex fields = ('id', 'title', 'type', 'object', 'free') @staticmethod def get_object(self): if self.content_type.model == 'topic': return TopicSerializer(self.content_object).data return False @staticmethod def get_type(self): return self.content_type.model class VertexSerializer(MiniVertexSerializer): class Meta: model = Vertex fields = ('id', 'title', 'type', 'object', "description") @staticmethod def get_object(self): if self.content_type.model == 'tutorial': return TutorialSerializer(self.content_object).data if self.content_type.model == 'task': return TaskSerializer(self.content_object).data return False class CourseInitSerializer(serializers.ModelSerializer): class Meta: model = Course fields = ['title', 'slug'] class CourseListSerializer(serializers.ModelSerializer): statistic = serializers.SerializerMethodField() level = serializers.SerializerMethodField() direction = serializers.SerializerMethodField() class Meta: model = Course fields = ['id', 'title', 'statistic', 'public', 'level', 'direction', 'image', 'slug'] @staticmethod def get_statistic(self): return self.get_statistic() @staticmethod def get_level(self): return self.get_level_display() @staticmethod def get_direction(self): return self.get_direction_display() class CourseDetailSerializer(serializers.ModelSerializer): level = serializers.SerializerMethodField() direction = serializers.SerializerMethodField() teachers = serializers.SerializerMethodField() class Meta: model = Course fields = '__all__' @staticmethod def get_level(self): return self.get_level_display() @staticmethod def get_direction(self): return self.get_direction_display() @staticmethod def get_teachers(self): return [teacher.email for teacher in self.teachers.all()]