from rest_framework import serializers from apps.school.models import ( SchoolSchedule, SchoolScheduleImage, ImageObject, LiveLesson, ) from .content import ( ContentSerializer, ContentCreateSerializer, ImageObjectSerializer ) from .mixins import DispatchContentMixin 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', 'short_description', 'description', 'materials', 'age', 'month_price', 'day_discount', 'start_at', 'schoolschedule_images', 'cover', 'trial_lesson', 'is_camp', ) 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): images = list(SchoolScheduleImage.objects.filter(schoolschedule=schoolschedule).values_list('img', flat=True)) new_images = [] for image in gallery: if image.get('img'): if image['img'].id not in images: SchoolScheduleImage.objects.create( schoolschedule=schoolschedule, img=image['img'], ) new_images.append(image['img'].id) SchoolScheduleImage.objects.filter(schoolschedule=schoolschedule, img__isnull=True).delete() SchoolScheduleImage.objects.filter(schoolschedule=schoolschedule, img__in=set(images) - set(new_images)).delete() 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, ) cover = ImageObjectSerializer() class Meta: model = SchoolSchedule fields = ( 'id', 'weekday', 'title', 'short_description', 'description', 'materials', 'age', 'month_price', 'day_discount', 'start_at', 'schoolschedule_images', 'cover', 'trial_lesson', 'is_camp', ) read_only_fields = ( 'id', ) class LiveLessonCreateSerializer(DispatchContentMixin, serializers.ModelSerializer): content = serializers.ListSerializer( child=ContentCreateSerializer(), required=False, ) live = serializers.SerializerMethodField() class Meta: model = LiveLesson fields = ( 'id', 'title', 'short_description', 'stream', 'date', 'cover', 'content', 'live', 'materials', 'created_at', 'update_at', 'deactivated_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', 'deactivated_at', ) def get_live(self, object): return True 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 LiveLessonSerializer(instance, context=self.context).to_representation(instance) class LiveLessonSerializer(serializers.ModelSerializer): content = ContentSerializer(many=True) live = serializers.SerializerMethodField() cover = ImageObjectSerializer() class Meta: model = LiveLesson fields = ( 'id', 'title', 'short_description', 'stream', 'date', 'cover', 'content', 'live', 'materials', 'created_at', 'update_at', 'deactivated_at', ) read_only_fields = ( 'id', 'created_at', 'update_at', 'deactivated_at', ) def get_live(self, object): return True