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.
 
 
 
 
 
 

289 lines
9.1 KiB

from rest_framework import serializers
from apps.school.models import (
SchoolSchedule, SchoolScheduleImage,
ImageObject, LiveLesson,
)
from .content import (
ContentSerializer, ContentCreateSerializer, ImageObjectSerializer
)
from pprint import pprint
class GalleryImageCreateSerializer(serializers.ModelSerializer):
class Meta:
model = SchoolScheduleImage
fields = (
'id',
'img',
'created_at',
'update_at',
)
read_only_fields = (
'id',
'created_at',
'update_at',
)
class GalleryImageSerializer(GalleryImageCreateSerializer):
img = ImageObjectSerializer()
class SchoolScheduleSerializer(serializers.ModelSerializer):
start_at = serializers.TimeField(format='%H:%M')
schoolschedule_images = serializers.ListSerializer(
child=GalleryImageCreateSerializer(),
required=False,
)
class Meta:
model = SchoolSchedule
fields = (
'id',
'weekday',
'title',
'description',
'materials',
'age',
'month_price',
'day_discount',
'start_at',
'schoolschedule_images',
)
read_only_fields = (
'id',
)
def create(self, validated_data):
gallery = validated_data.pop('schoolschedule_images', [])
schoolschedule = super().create(validated_data)
self.dispatch_gallery(schoolschedule, gallery)
return schoolschedule
def update(self, instance, validated_data):
gallery = validated_data.pop('schoolschedule_images', [])
schoolschedule = super().update(instance, validated_data)
self.dispatch_gallery(schoolschedule, gallery)
return schoolschedule
def dispatch_gallery(self, schoolschedule, gallery):
for image in gallery:
imgs = SchoolScheduleImage.objects.filter(
schoolschedule=schoolschedule,
img=image['img']
)
if not imgs.exists():
si = SchoolScheduleImage.objects.create(
schoolschedule=schoolschedule,
img=image['img'],
)
def to_representation(self, instance):
return SchoolScheduleSerializerImg(instance, context=self.context).to_representation(instance)
class SchoolScheduleSerializerImg(serializers.ModelSerializer):
start_at = serializers.TimeField(format='%H:%M')
schoolschedule_images = serializers.ListSerializer(
child=GalleryImageSerializer(),
required=False,
)
class Meta:
model = SchoolSchedule
fields = (
'id',
'weekday',
'title',
'description',
'materials',
'age',
'month_price',
'day_discount',
'start_at',
'schoolschedule_images',
)
read_only_fields = (
'id',
)
class LiveLessonCreateSerializer(serializers.ModelSerializer):
content = serializers.ListSerializer(
child=ContentCreateSerializer(),
required=False,
)
class Meta:
model = LiveLesson
fields = (
'id',
'title',
'short_description',
'stream',
'date',
'content',
'created_at',
'update_at',
'deactivated_at',
)
read_only_fields = (
'id',
'created_at',
'update_at',
'deactivated_at',
)
def dispatch_content(self, lesson, content):
for c in content:
if 'type' not in c or not c['type'] or 'data' not in c or not c['data']:
continue
ctype = c['type']
cdata = c['data']
if ctype == 'text':
if 'id' in cdata and cdata['id']:
t = Text.objects.get(id=cdata['id'])
t.position = cdata['position']
t.title = cdata['title']
t.lesson = lesson
t.txt = cdata['txt']
t.uuid = cdata['uuid']
t.save()
else:
t = Text.objects.create(
position=cdata['position'],
title=cdata['title'],
lesson=lesson,
txt=cdata['txt'],
uuid=cdata['uuid'],
)
elif ctype == 'image':
if 'id' in cdata and cdata['id']:
image = Image.objects.get(id=cdata['id'])
image.position = cdata['position']
image.title = cdata['title']
image.lesson = lesson
image.img = ImageObject.objects.get(id=cdata['img'])
image.uuid = cdata['uuid']
image.save()
else:
image = Image.objects.create(
position=cdata['position'],
title=cdata['title'],
lesson=lesson,
img=ImageObject.objects.get(id=cdata['img']),
uuid=cdata['uuid'],
)
elif ctype == 'image-text':
if 'id' in cdata and cdata['id']:
it = ImageText.objects.get(id=cdata['id'])
it.position = cdata['position']
it.title = cdata['title']
it.lesson = lesson
it.img = ImageObject.objects.get(id=cdata['img'])
it.txt = cdata['txt']
it.uuid = cdata['uuid']
it.save()
else:
it = ImageText.objects.create(
position=cdata['position'],
title=cdata['title'],
lesson=lesson,
img=ImageObject.objects.get(id=cdata['img']),
txt=cdata['txt'],
uuid=cdata['uuid'],
)
elif ctype == 'video':
if 'id' in cdata and cdata['id']:
v = Video.objects.get(id=cdata['id'])
v.position = cdata['position']
v.title = cdata['title']
v.lesson = lesson
v.url = cdata['url']
v.uuid = cdata['uuid']
v.save()
else:
v = Video.objects.create(
position=cdata['position'],
title=cdata['title'],
lesson=lesson,
url=cdata['url'],
uuid=cdata['uuid'],
)
elif ctype == 'images':
if 'id' in cdata and cdata['id']:
g = Gallery.objects.get(id=cdata['id'])
g.position = cdata['position']
g.title = cdata['title']
g.lesson = lesson
g.uuid = cdata['uuid']
g.save()
if 'images' in cdata:
for image in cdata['images']:
gi = GalleryImage.objects.create(
gallery=g,
img=ImageObject.objects.get(id=image['img']),
)
else:
g = Gallery.objects.create(
lesson=lesson,
position=cdata['position'],
title=cdata['title'],
uuid=cdata['uuid'],
)
if 'images' in cdata:
for image in cdata['images']:
gi = GalleryImage.objects.create(
gallery=g,
img=ImageObject.objects.get(id=image['img']),
)
def create(self, validated_data):
content = validated_data.pop('content', [])
lesson = super().create(validated_data)
self.dispatch_content(lesson, content)
return lesson
def update(self, instance, validated_data):
content = validated_data.pop('content', [])
lesson = super().update(instance, validated_data)
self.dispatch_content(lesson, content)
return lesson
def to_representation(self, instance):
return LessonSerializer(instance, context=self.context).to_representation(instance)
class LiveLessonSerializer(serializers.ModelSerializer):
content = ContentSerializer(many=True)
class Meta:
model = LiveLesson
fields = (
'id',
'title',
'short_description',
'stream',
'date',
'content',
'created_at',
'update_at',
'deactivated_at',
)
read_only_fields = (
'id',
'created_at',
'update_at',
'deactivated_at',
)