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.
150 lines
5.0 KiB
150 lines
5.0 KiB
from jwt import DecodeError
|
|
|
|
from courses.models import Course, Lesson
|
|
from rest_framework.renderers import JSONRenderer
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer
|
|
import jwt
|
|
|
|
from courses.tasks import add_lesson
|
|
from lms import settings
|
|
|
|
|
|
class TreeView(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
status_code = 200
|
|
|
|
def get(self, request, slug):
|
|
|
|
try:
|
|
course = Course.objects.get(slug=slug)
|
|
return Response(CourseTreeSerializer(course).data, self.status_code)
|
|
except Course.DoesNotExist:
|
|
return Response("Course doesn't exist", status=404)
|
|
|
|
|
|
class CourseListView(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
status_code = 200
|
|
|
|
def post(self, request):
|
|
"""
|
|
This API endpoint create/update course.
|
|
---
|
|
parameters:
|
|
- name: level
|
|
type: string
|
|
required: true
|
|
location: form
|
|
- name: direction
|
|
type: string
|
|
required: true
|
|
location: form
|
|
- name: statistic
|
|
type: string
|
|
required: true
|
|
location: form
|
|
...
|
|
"""
|
|
# TODO: Костыль
|
|
teachers_emails = request.JSON.get('teachers', [])
|
|
request.JSON['teachers'] = [get_user_model().objects.get(email=i).out_key for i in teachers_emails]
|
|
course = Course.objects.update_or_create_course(**request.JSON.dict())
|
|
return Response(CourseDetailSerializer(course).data, status=self.status_code)
|
|
|
|
def get(self, request):
|
|
"""
|
|
This API endpoint return list of courses.
|
|
---
|
|
"""
|
|
res = [CourseDetailSerializer(course).data for course in Course.objects.all()]
|
|
return Response(res, self.status_code)
|
|
|
|
|
|
class CourseDetailView(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
status_code = 200
|
|
|
|
@staticmethod
|
|
def delete(request, slug):
|
|
try:
|
|
Course.objects.get(slug=slug).delete()
|
|
except Course.DoesNotExist:
|
|
return Response("Курса не существует", status=404)
|
|
return Response(status=204)
|
|
|
|
def get(self, request, slug):
|
|
return Response(CourseDetailSerializer(Course.objects.get(slug=slug)).data, self.status_code)
|
|
|
|
|
|
class LessonInfoView(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
status_code = 200
|
|
|
|
def get(self, request, token):
|
|
try:
|
|
lesson = Lesson.objects.get(token=token)
|
|
except Lesson.DoesNotExist:
|
|
return Response('Урок не найден', status=404)
|
|
if request.user.is_authenticated and request.user.out_key in lesson.topic.course.teacher_tokens:
|
|
return Response(TeacherLessonSerializer(lesson).data, self.status_code)
|
|
return Response("Пользователь не является преподователем по курсу", status=403)
|
|
|
|
|
|
class LessonDetail(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
|
|
@staticmethod
|
|
def post(request, token):
|
|
jwt_token = request.JSON.get('jwt_token', None)
|
|
|
|
try:
|
|
lesson = Lesson.objects.get(token=token)
|
|
except Lesson.DoesNotExist:
|
|
return Response("Урока не существует", status=404)
|
|
|
|
l = LessonSerializer(lesson).data
|
|
|
|
try:
|
|
payload = None if jwt_token is None\
|
|
else jwt.decode(jwt_token, settings.COURSE_PROGRESS_SECRET_KEY, algorithms=['HS256'])
|
|
except DecodeError:
|
|
payload = None
|
|
|
|
course = lesson.topic.course
|
|
|
|
if payload is None:
|
|
if not lesson.free:
|
|
return Response("Bad token", status=400)
|
|
|
|
else:
|
|
return Response(l, status=200)
|
|
|
|
prev_lesson = course.get_previous(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None)
|
|
next_lesson = course.get_next(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None)
|
|
|
|
if not prev_lesson is None:
|
|
l['prev_token'] = prev_lesson.token
|
|
|
|
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)
|
|
|