|
|
|
@ -1,19 +1,16 @@ |
|
|
|
from django.db.models import F |
|
|
|
|
|
|
|
from jwt import DecodeError |
|
|
|
from jwt import DecodeError |
|
|
|
|
|
|
|
|
|
|
|
from courses.models import Course, Lesson, Topic |
|
|
|
from courses.models import Course, Lesson, Topic |
|
|
|
from rest_framework.renderers import JSONRenderer |
|
|
|
from rest_framework.renderers import JSONRenderer |
|
|
|
from rest_framework.response import Response |
|
|
|
from rest_framework.response import Response |
|
|
|
from rest_framework.views import APIView |
|
|
|
from rest_framework.views import APIView |
|
|
|
from django.contrib.auth import get_user_model |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer, \ |
|
|
|
from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer |
|
|
|
TopicSerializer |
|
|
|
|
|
|
|
import jwt |
|
|
|
import jwt |
|
|
|
|
|
|
|
|
|
|
|
from courses.tasks import add_lesson |
|
|
|
from courses.tasks import add_lesson |
|
|
|
from lms import settings |
|
|
|
from lms import settings |
|
|
|
import json |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TreeView(APIView): |
|
|
|
class TreeView(APIView): |
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
@ -66,6 +63,7 @@ class DeleteTopicView(APIView): |
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
@staticmethod |
|
|
|
def delete(request, topic_id): |
|
|
|
def delete(request, topic_id): |
|
|
|
|
|
|
|
if request.user and request.user.is_staff: |
|
|
|
try: |
|
|
|
try: |
|
|
|
t = Topic.objects.get(id=topic_id) |
|
|
|
t = Topic.objects.get(id=topic_id) |
|
|
|
except Topic.DoesNotExist: |
|
|
|
except Topic.DoesNotExist: |
|
|
|
@ -74,6 +72,77 @@ class DeleteTopicView(APIView): |
|
|
|
return Response(CourseTreeSerializer(t.course).data, status=200) |
|
|
|
return Response(CourseTreeSerializer(t.course).data, status=200) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DeleteLessonView(APIView): |
|
|
|
|
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
|
|
def delete(request, lesson_token): |
|
|
|
|
|
|
|
if request.user and request.user.is_staff: |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
l = Lesson.objects.get(token=lesson_token) |
|
|
|
|
|
|
|
except Lesson.DoesNotExist: |
|
|
|
|
|
|
|
return Response("Темы не существует", status=404) |
|
|
|
|
|
|
|
l.delete() |
|
|
|
|
|
|
|
return Response(CourseTreeSerializer(l.topic.course).data, status=200) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UpdateLessonView(APIView): |
|
|
|
|
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
|
|
def post(request): |
|
|
|
|
|
|
|
lesson_token = request.JSON.get('token', None) |
|
|
|
|
|
|
|
sort = request.JSON.get('sort', None) |
|
|
|
|
|
|
|
topic_id = request.JSON.get('topic', None) |
|
|
|
|
|
|
|
title = request.JSON.get('title', None) |
|
|
|
|
|
|
|
description = request.JSON.get('description', None) |
|
|
|
|
|
|
|
video = request.JSON.get('video', None) |
|
|
|
|
|
|
|
free = request.JSON.get('free', None) |
|
|
|
|
|
|
|
is_hm = request.JSON.get('is_hm', None) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if topic_id is None: |
|
|
|
|
|
|
|
return Response("topic не передан", status=400) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if sort is None: |
|
|
|
|
|
|
|
return Response("sort не передан", status=400) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
topic = Topic.objects.get(id=topic_id) |
|
|
|
|
|
|
|
except Topic.DoesNotExist: |
|
|
|
|
|
|
|
return Response("Тема не найдена", status=404) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if lesson_token is None: |
|
|
|
|
|
|
|
if title is None: |
|
|
|
|
|
|
|
return Response("Название урока не переданно", status=400) |
|
|
|
|
|
|
|
for lesson in reversed(topic.lesson_set.filter(sort__gte=sort)): |
|
|
|
|
|
|
|
lesson.sort = lesson.sort + 1 |
|
|
|
|
|
|
|
lesson.save() |
|
|
|
|
|
|
|
l = Lesson.objects.create( |
|
|
|
|
|
|
|
title=title, |
|
|
|
|
|
|
|
topic=topic, |
|
|
|
|
|
|
|
sort=sort, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
l = Lesson.objects.get(token=lesson_token) |
|
|
|
|
|
|
|
except Lesson.DoesNotExist: |
|
|
|
|
|
|
|
return Response("Урок не найден", status=404) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
l.title = l.title if title is None else title |
|
|
|
|
|
|
|
l.video = l.video if video is None else video |
|
|
|
|
|
|
|
l.free = l.free if free is None else free |
|
|
|
|
|
|
|
l.is_hm = l.is_hm if is_hm is None else is_hm |
|
|
|
|
|
|
|
l.description = l.description if description is None else description |
|
|
|
|
|
|
|
if not l.sort == sort: |
|
|
|
|
|
|
|
for lesson in reversed(topic.lesson_set.filter(sort__gte=sort)): |
|
|
|
|
|
|
|
lesson.sort = lesson.sort + 1 |
|
|
|
|
|
|
|
lesson.save() |
|
|
|
|
|
|
|
l.sort = sort |
|
|
|
|
|
|
|
l.save() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Response(CourseTreeSerializer(topic.course).data, status=200) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UpdateTopicView(APIView): |
|
|
|
class UpdateTopicView(APIView): |
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
|
|
|
|
|
|
|
|
@ -99,7 +168,7 @@ class UpdateTopicView(APIView): |
|
|
|
if topic_id: |
|
|
|
if topic_id: |
|
|
|
t = Topic.objects.get(id=topic_id) |
|
|
|
t = Topic.objects.get(id=topic_id) |
|
|
|
if not t.sort == sort: |
|
|
|
if not t.sort == sort: |
|
|
|
for topic in reversed(): |
|
|
|
for topic in reversed(course.topic_set.filter(sort__gte=sort)): |
|
|
|
topic.sort = topic.sort + 1 |
|
|
|
topic.sort = topic.sort + 1 |
|
|
|
topic.save() |
|
|
|
topic.save() |
|
|
|
t.sort = sort |
|
|
|
t.sort = sort |
|
|
|
@ -161,7 +230,8 @@ class LessonDetail(APIView): |
|
|
|
course = lesson.topic.course |
|
|
|
course = lesson.topic.course |
|
|
|
|
|
|
|
|
|
|
|
if payload is None: |
|
|
|
if payload is None: |
|
|
|
if not lesson.free: |
|
|
|
if not (lesson.free or request.user.is_authenticated and |
|
|
|
|
|
|
|
(request.user.groups.filter(name__in=['supports']).exists() or request.user.is_superuser)): |
|
|
|
return Response("Bad token", status=400) |
|
|
|
return Response("Bad token", status=400) |
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
else: |
|
|
|
|