from django.contrib.auth import get_user_model from rest_framework import serializers from . import Base64ImageField from apps.course.models import Category, Course, Material, Lesson, Like from apps.content.models import ( Image, Text, ImageText, Video, Gallery, GalleryImage, ImageObject, ) User = get_user_model() class ImageObjectSerializer(serializers.ModelSerializer): image = Base64ImageField( required=True, allow_empty_file=False, allow_null=False, read_only=False, ) class Meta: model = ImageObject fields = ( 'id', 'image', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', ) class GallerySerializer(serializers.ModelSerializer): class Meta: model = Gallery fields = ( 'id', 'title', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', ) class GalleryImageCreateSerializer(serializers.ModelSerializer): class Meta: model = GalleryImage fields = ( 'id', 'gallery', 'img', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', ) class GalleryImageSerializer(GalleryImageCreateSerializer): img = ImageObjectSerializer() class MaterialCreateSerializer(serializers.ModelSerializer): class Meta: model = Material fields = ( 'id', 'title', 'cover', 'short_description', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', ) class MaterialSerializer(MaterialCreateSerializer): cover = ImageObjectSerializer() class LikeSerializer(serializers.ModelSerializer): class Meta: model = Like fields = ( 'id', 'user', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', ) class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = ( 'id', 'title', ) read_only_fields = ( 'id', ) class ContentSerializer(serializers.Serializer): TYPE_CHOICES = ( 'text', 'image', 'imagetext', 'video', ) type = serializers.ChoiceField(choices=TYPE_CHOICES) data = serializers.JSONField() class CourseCreateSerializer(serializers.ModelSerializer): content = serializers.ListSerializer(child=ContentSerializer()) materials = MaterialSerializer(many=True) class Meta: model = Course fields = ( 'id', 'author', 'title', 'short_description', 'from_author', 'cover', 'price', 'is_infinite', 'deferred_start_at', 'category', 'duration', 'is_featured', 'url', 'status', 'likes', 'materials', 'created_at', 'update_at', 'content', 'gallery', ) read_only_fields = ( 'id', # 'content', 'created_at', 'update_at', ) def create(self, validated_data): materials = validated_data.pop('materials') content = validated_data.pop('content') course = super().create(validated_data) for c in content: if c['type'] == 'text': if 'id' in c['data']: t = Text.objects.get(id=c['data']['id']) t.position = c['data']['position'] t.title = c['data']['title'] t.course = course t.txt = c['data']['txt'] i.save() else: t = Text.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, txt=c['data']['txt'], ) elif c['type'] == 'image': if 'id' in c['data']: i = Image.objects.get(id=c['data']['id']) i.position = c['data']['position'] i.title = c['data']['title'] i.course = course i.img = Image.objects.get(c['data']['img']) i.save() else: i = Image.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, img=Image.objects.get(c['data']['img']), ) elif c['type'] == 'imagetext': if 'id' in c['data']: it = ImageText.objects.get(id=c['data']['id']) it.position = c['data']['position'] it.title = c['data']['title'] it.course = course it.img = Image.objects.get(c['data']['img']) it.txt = c['data']['txt'] it.save() else: i = ImageText.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, img=Image.objects.get(c['data']['img']), txt=c['data']['txt'], ) elif c['type'] == 'video': if 'id' in c['data']: v = Video.objects.get(id=c['data']['id']) v.position = c['data']['position'] v.title = c['data']['title'] v.course = course v.url = c['data']['url'] v.save() else: v = Video.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, url=c['data']['url'], ) for material in materials: if 'id' in material: m = Material.objects.get(id=material['id']) m.title = material['title'] m.cover = ImageObject.objects.get(material['cover']) m.short_description = material['short_description'] m.save() else: m = Material.objects.create( title=material['title'], cover=ImageObject.objects.get(material['cover']), short_description=material['short_description'], ) return course def update(self, instance, validated_data): materials = validated_data.pop('materials') content = validated_data.pop('content') course = super().update(instance, validated_data) for c in content: if c['type'] == 'text': if 'id' in c['data']: t = Text.objects.get(id=c['data']['id']) t.position = c['data']['position'] t.title = c['data']['title'] t.course = course t.txt = c['data']['txt'] i.save() else: t = Text.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, txt=c['data']['txt'], ) elif c['type'] == 'image': if 'id' in c['data']: i = Image.objects.get(id=c['data']['id']) i.position = c['data']['position'] i.title = c['data']['title'] i.course = course i.img = Image.objects.get(c['data']['img']) i.save() else: i = Image.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, img=Image.objects.get(c['data']['img']), ) elif c['type'] == 'imagetext': if 'id' in c['data']: it = ImageText.objects.get(id=c['data']['id']) it.position = c['data']['position'] it.title = c['data']['title'] it.course = course it.img = Image.objects.get(c['data']['img']) it.txt = c['data']['txt'] it.save() else: i = ImageText.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, img=Image.objects.get(c['data']['img']), txt=c['data']['txt'], ) elif c['type'] == 'video': if 'id' in c['data']: v = Video.objects.get(id=c['data']['id']) v.position = c['data']['position'] v.title = c['data']['title'] v.course = course v.url = c['data']['url'] v.save() else: v = Video.objects.create( position=c['data']['position'], title=c['data']['title'], course=course, url=c['data']['url'], ) for material in materials: if 'id' in material: m = Material.objects.get(id=material['id']) m.title = material['title'] m.cover = ImageObject.objects.get(material['cover']) m.short_description = material['short_description'] m.save() else: m = Material.objects.create( title=material['title'], cover=ImageObject.objects.get(material['cover']), short_description=material['short_description'], ) course.materials.add(m) return course class CourseSerializer(CourseCreateSerializer): category = CategorySerializer() materials = MaterialSerializer(many=True) cover = ImageObjectSerializer() gallery = GallerySerializer() class LessonCreateSerializer(serializers.ModelSerializer): class Meta: model = Lesson fields = ( 'id', 'title', 'short_description', 'course', 'cover', 'content', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'content', 'created_at', 'update_at', ) class LessonSerializer(LessonCreateSerializer): course = CourseSerializer() cover = ImageObjectSerializer() class ImageCreateSerializer(serializers.ModelSerializer): class Meta: model = Image fields = ( 'id', 'course', 'lesson', 'title', 'position', 'img', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', ) class ImageSerializer(ImageCreateSerializer): course = CourseSerializer() lesson = LessonSerializer() img = ImageObjectSerializer() class TextCreateSerializer(serializers.ModelSerializer): class Meta: model = Text fields = ( 'id', 'course', 'lesson', 'title', 'position', 'created_at', 'update_at', ) + ('txt',) read_only_fields = ( 'id', 'created_at', 'update_at', ) class TextSerializer(TextCreateSerializer): course = CourseSerializer() lesson = LessonSerializer() class ImageTextCreateSerializer(serializers.ModelSerializer): class Meta: model = ImageText fields = ( 'id', 'course', 'lesson', 'title', 'position', 'img', 'txt', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', ) class ImageTextSerializer(ImageTextCreateSerializer): course = CourseSerializer() lesson = LessonSerializer() img = ImageObjectSerializer() class VideoCreateSerializer(serializers.ModelSerializer): class Meta: model = Video fields = ( 'id', 'course', 'lesson', 'title', 'position', 'created_at', 'update_at', ) + ('url',) read_only_fields = ( 'id', 'created_at', 'update_at', ) class VideoSerializer(VideoCreateSerializer): course = CourseSerializer() lesson = LessonSerializer() class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ( 'id', 'username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active', 'date_joined', 'role', 'gender', 'country', 'city', 'about', 'instagram', 'facebook', 'twitter', 'pinterest', 'youtube', 'vkontakte', 'fb_id', 'fb_data', 'is_email_proved', 'photo', ) read_only_fields = ( 'id', 'photo', 'date_joined', 'is_staff', 'fb_id', 'fb_data', ) class UserPhotoSerializer(serializers.Serializer): photo = Base64ImageField( required=False, allow_empty_file=True, allow_null=True )