from apps.course.models import Category, Course, Material, Lesson, Like from apps.school.models import LiveLesson from apps.content.models import ( Content, Image, Text, ImageText, Video, Gallery, GalleryImage, ImageObject, Contest) from .content import ( TextCreateSerializer, ImageCreateSerializer, ImageTextCreateSerializer, VideoCreateSerializer, ) class DispatchContentMixin(object): def dispatch_content(self, obj, 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 isinstance(obj, Course): obj_type = 'course' elif isinstance(obj, Lesson): obj_type = 'lesson' elif isinstance(obj, LiveLesson): obj_type = 'live_lesson' elif isinstance(obj, Contest): obj_type = 'contest' cdata[obj_type] = obj.id if ctype == 'text': if 'id' in cdata and cdata['id']: t = Text.objects.get(id=cdata.pop('id')) serializer = TextCreateSerializer(t, data=cdata) if serializer.is_valid(): serializer.save() else: serializer = TextCreateSerializer(data=cdata) if serializer.is_valid(): serializer.save() elif ctype == 'image': if 'id' in cdata and cdata['id']: image = Image.objects.get(id=cdata.pop('id')) serializer = ImageCreateSerializer(image, data=cdata) if serializer.is_valid(): image = serializer.save() else: continue try: image_object = ImageObject.objects.get(id=cdata['img']) except ImageObject.DoesNotExist: pass else: image.img = image_object image.save() else: serializer = ImageCreateSerializer(data=cdata) if serializer.is_valid(): image = serializer.save() else: continue try: image_object = ImageObject.objects.get(id=cdata['img']) except ImageObject.DoesNotExist: pass else: image.img = image_object image.save() elif ctype == 'image-text': if 'id' in cdata and cdata['id']: it = ImageText.objects.get(id=cdata.pop('id')) serializer = ImageTextCreateSerializer(it, data=cdata) if serializer.is_valid(): it = serializer.save() else: continue try: image_object = ImageObject.objects.get(id=cdata['img']) except ImageObject.DoesNotExist: pass else: it.img = image_object it.save() else: serializer = ImageTextCreateSerializer(data=cdata) if serializer.is_valid(): it = serializer.save() else: continue try: image_object = ImageObject.objects.get(id=cdata['img']) except ImageObject.DoesNotExist: pass else: it.img = image_object it.save() elif ctype == 'video': if 'id' in cdata and cdata['id']: v = Video.objects.get(id=cdata.pop('id')) serializer = VideoCreateSerializer(v, data=cdata) if serializer.is_valid(): serializer.save() else: serializer = VideoCreateSerializer(data=cdata) if serializer.is_valid(): serializer.save() 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.uuid = cdata['uuid'] setattr(g, obj_type, obj) g.save() if 'images' in cdata: for image in cdata['images']: if 'img' in image and image['img']: if 'id' in image and image['id']: gi = GalleryImage.objects.get(id=image['id']) gi.img = ImageObject.objects.get(id=image['img']) gi.save() else: gi = GalleryImage.objects.create( gallery=g, img=ImageObject.objects.get(id=image['img']) ) else: g = Gallery( position=cdata['position'], title=cdata['title'], uuid=cdata['uuid'], ) setattr(g, obj_type, obj) g.save() if 'images' in cdata: for image in cdata['images']: if 'img' in image and image['img']: if 'id' in image and image['id']: gi = GalleryImage.objects.get(id=image['id']) gi.img = ImageObject.objects.get(id=image['img']) gi.save() else: gi = GalleryImage.objects.create( gallery=g, img=ImageObject.objects.get(id=image['img']) ) class DispatchMaterialMixin(object): def dispatch_materials(self, course, materials): for material in materials: if 'id' in material and material['id']: m = Material.objects.get(id=material['id']) m.title = material['title'] m.cover = ImageObject.objects.get(id=material['cover']) m.short_description = material['short_description'] m.save() else: m = Material.objects.create( title=material['title'], cover=ImageObject.objects.get(id=material['cover']), short_description=material['short_description'], ) course.materials.add(m) class DispatchGalleryMixin(object): def dispatch_gallery(self, course, gallery): if gallery: if 'id' in gallery and gallery['id']: g = Gallery.objects.get(id=gallery['id']) g.title = gallery.get('title', g.title) g.position = 0 g.save() else: g = Gallery.objects.create( title=gallery.get('title', ''), position=0, ) if 'images' in gallery: for image in gallery['images']: if 'id' in image and image['id']: gi = GalleryImage.objects.get(id=image['id']) gi.gallery = g gi.img = image['img'] gi.save() else: gi = GalleryImage.objects.create( gallery=g, img=image['img'], ) course.gallery = g course.save()