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', )