from rest_framework import serializers import json # from django.contrib.auth import get_user_model # from django.core.exceptions import ObjectDoesNotExist from courses.models import Course, Vertex, Tutorial, Topic, Task class TutorialSerializer(serializers.ModelSerializer): class Meta: model = Tutorial exclude = ['id'] 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() children = serializers.SerializerMethodField() class Meta: model = Vertex fields = ('id', 'title', 'type', 'object', 'children') @staticmethod def get_object(self): if self.content_type.model == 'tutorial': return TutorialSerializer(self.content_object).data elif self.content_type.model == 'topic': return TopicSerializer(self.content_object).data elif self.content_type.model == 'task': return TaskSerializer(self.content_object).data @staticmethod def get_type(self): return self.content_type.model @staticmethod def get_children(self): return json.loads(self.sort_map.dependent_elements) class VertexSerializer(MiniVertexSerializer): class Meta: model = Vertex fields = ('id', 'title', 'type', 'object', 'children', 'description') @staticmethod def get_children(self): return [VertexSerializer(Vertex.manager.get(id=i)).data for i in json.loads(self.sort_map.dependent_elements)] class CourseListSerializer(serializers.ModelSerializer): length = serializers.SerializerMethodField() level = serializers.SerializerMethodField() direction = serializers.SerializerMethodField() class Meta: model = Course fields = ['id', 'title', 'length', 'level', 'direction', 'image', ] @staticmethod def get_length(self): return 15 @staticmethod def get_level(self): return self.get_level_display() @staticmethod def get_direction(self): return self.direction.title class CourseTreeSerializer(serializers.ModelSerializer): children = serializers.SerializerMethodField() class Meta: model = Course fields = ['id', 'children'] @staticmethod def get_children(self): return [MiniVertexSerializer(Vertex.manager.get(id=i)).data for i in json.loads(self.sort_map.dependent_elements)] class CourseDetailSerializer(serializers.ModelSerializer): level = serializers.SerializerMethodField() direction = serializers.SerializerMethodField() teachers = serializers.SerializerMethodField() class Meta: model = Course exclude = ( 'slug', 'mentors', 'page', 'sort', 'preview', 'use_fail', 'basic_len', 'addition_len', 'min_price', 'buy_icon', 'must_build', 'keywords', 'recommend', ) @staticmethod def get_level(self): return self.get_level_display() @staticmethod def get_direction(self): return self.direction.title @staticmethod def get_teachers(self): return [teacher.full_name() for teacher in self.teachers.all()]