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.
 
 
 
 
 
 

192 lines
7.5 KiB

from apps.course.models import Category, Course, Material, Lesson, Like, Tag, CourseTags
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)
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)
else:
serializer = ImageCreateSerializer(data=cdata)
if serializer.is_valid():
image = serializer.save()
else:
continue
if 'img' in cdata:
try:
image_object = ImageObject.objects.get(id=cdata.get('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)
else:
serializer = ImageTextCreateSerializer(data=cdata)
if serializer.is_valid():
it = serializer.save()
else:
continue
if 'img' in cdata:
try:
image_object = ImageObject.objects.get(id=cdata.get('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)
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']
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, obj, 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 not image.get('img'):
continue
if isinstance(image['img'], ImageObject):
img = image['img']
else:
img = ImageObject.objects.get(id=image['img'])
if 'id' in image and image['id']:
gi = GalleryImage.objects.get(id=image['id'])
gi.gallery = g
gi.img = img
gi.save()
else:
gi = GalleryImage.objects.create(
gallery=g,
img=img,
)
obj.gallery = g
obj.save()
class DispatchTagsMixin(object):
def dispatch_tags(self, obj, tags):
current_tags = list(obj.tags.all())
new_tags = []
if tags:
for tag in tags:
id = tag.get('id')
tag_text = tag.get('tag')
if not id and tag_text:
t, created = Tag.objects.get_or_create(tag=tag_text)
id = t.id
new_tags.append(id)
if isinstance(obj, Course):
CourseTags.objects.filter(course=obj, tag__in=current_tags).delete()
for tag in Tag.objects.filter(id__in=new_tags):
CourseTags.objects.get_or_create(course=obj, tag=tag)
else:
obj.tags.clear(current_tags)
obj.tags.add(Tag.objects.filter(id__in=set(new_tags)))
for tag in current_tags:
if not tag.course_set.all().count():
tag.delete()