You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

537 lines
15 KiB

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
)