|
|
|
@ -1,3 +1,5 @@ |
|
|
|
|
|
|
|
from jwt import DecodeError |
|
|
|
|
|
|
|
|
|
|
|
from courses.models import Course, Lesson |
|
|
|
from courses.models import Course, Lesson |
|
|
|
from rest_framework.renderers import JSONRenderer |
|
|
|
from rest_framework.renderers import JSONRenderer |
|
|
|
from rest_framework.response import Response |
|
|
|
from rest_framework.response import Response |
|
|
|
@ -5,7 +7,10 @@ from rest_framework.views import APIView |
|
|
|
from django.contrib.auth import get_user_model |
|
|
|
from django.contrib.auth import get_user_model |
|
|
|
|
|
|
|
|
|
|
|
from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer |
|
|
|
from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer |
|
|
|
from progress.models import ProgressLesson |
|
|
|
import jwt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from courses.tasks import add_lesson |
|
|
|
|
|
|
|
from lms import settings |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TreeView(APIView): |
|
|
|
class TreeView(APIView): |
|
|
|
@ -93,33 +98,53 @@ class LessonDetail(APIView): |
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
@staticmethod |
|
|
|
def get(request, token): |
|
|
|
def post(request, token): |
|
|
|
|
|
|
|
jwt_token = request.JSON.get('jwt_token', None) |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
try: |
|
|
|
lesson = Lesson.objects.get(token=token) |
|
|
|
lesson = Lesson.objects.get(token=token) |
|
|
|
except Lesson.DoesNotExist: |
|
|
|
except Lesson.DoesNotExist: |
|
|
|
return Response("Lesson doesn't exist", status=404) |
|
|
|
return Response("Урока не существует", status=404) |
|
|
|
|
|
|
|
|
|
|
|
if not lesson.free and not ProgressLesson.objects.filter(lesson_token=lesson.token).exists(): |
|
|
|
l = LessonSerializer(lesson).data |
|
|
|
previous_lesson = lesson.topic.course.get_previous(lesson) |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
if not previous_lesson is None or not ProgressLesson.objects.filter( |
|
|
|
payload = None if jwt_token is None\ |
|
|
|
lesson_token=previous_lesson.token, status=ProgressLesson.STATUSES.done).exists(): |
|
|
|
else jwt.decode(jwt_token, settings.COURSE_PROGRESS_SECRET_KEY, algorithms=['HS256']) |
|
|
|
return Response("Lesson doesn't access", status=403) |
|
|
|
except DecodeError: |
|
|
|
|
|
|
|
payload = None |
|
|
|
# TODO: Доделать систему прав на курс |
|
|
|
|
|
|
|
|
|
|
|
course = lesson.topic.course |
|
|
|
res = LessonSerializer(lesson).data |
|
|
|
|
|
|
|
# progress = vertex.course.progress_set.filter(user=request.user) |
|
|
|
if payload is None: |
|
|
|
# try: |
|
|
|
if not lesson.free: |
|
|
|
# if progress.exists(): |
|
|
|
return Response("Bad token", status=400) |
|
|
|
# next_vertex = vertex.get_next(progress[0].get_template()) |
|
|
|
|
|
|
|
# if next_vertex: |
|
|
|
else: |
|
|
|
# res['next'] = MiniVertexSerializer(next_vertex).data |
|
|
|
return Response(l, status=200) |
|
|
|
# res['is_in_progress'] = vertex in progress[0].get_objects_in_progress() |
|
|
|
|
|
|
|
# else: |
|
|
|
prev_lesson = course.get_previous(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None) |
|
|
|
# res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data |
|
|
|
next_lesson = course.get_next(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None) |
|
|
|
# except Thread.DoesNotExist or Vertex.DoesNotExist: |
|
|
|
|
|
|
|
# res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data |
|
|
|
if not prev_lesson is None: |
|
|
|
|
|
|
|
l['prev_token'] = prev_lesson.token |
|
|
|
return Response(res, status=200) |
|
|
|
|
|
|
|
|
|
|
|
if not next_lesson is None: |
|
|
|
|
|
|
|
l['next_token'] = next_lesson.token |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
new_lesson = False |
|
|
|
|
|
|
|
for payload_lesson in payload['lessons']: |
|
|
|
|
|
|
|
if payload_lesson['lesson_token'] == str(lesson.token): |
|
|
|
|
|
|
|
return Response(l, status=200) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not prev_lesson is None and str(prev_lesson.token) == payload_lesson['lesson_token']: |
|
|
|
|
|
|
|
new_lesson = True if prev_lesson is None else \ |
|
|
|
|
|
|
|
(payload_lesson['status'] == "done" or payload_lesson['status'] == "wait") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not new_lesson: |
|
|
|
|
|
|
|
return Response("Permission denied", status=403) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#TODO Задача для селери |
|
|
|
|
|
|
|
add_lesson(request.user.out_key, course.token, lesson.token, course.get_teacher(), lesson.is_hm) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Response(l, status=200) |
|
|
|
|