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.
103 lines
4.0 KiB
103 lines
4.0 KiB
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
|
|
from progress.models import ProgressLesson
|
|
|
|
|
|
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):
|
|
# 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):
|
|
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 get(request, token):
|
|
|
|
try:
|
|
lesson = Lesson.objects.get(token=token)
|
|
except Lesson.DoesNotExist:
|
|
return Response("Lesson doesn't exist", status=404)
|
|
|
|
if not lesson.free and not ProgressLesson.objects.filter(lesson_token=lesson.token).exists():
|
|
previous_lesson = lesson.topic.course.get_previous(lesson)
|
|
|
|
if not previous_lesson is None or not ProgressLesson.objects.filter(
|
|
lesson_token=previous_lesson.token, status=ProgressLesson.STATUSES.done).exists():
|
|
return Response("Lesson doesn't access", status=403)
|
|
|
|
# TODO: Доделать систему прав на курс
|
|
|
|
res = LessonSerializer(lesson).data
|
|
# progress = vertex.course.progress_set.filter(user=request.user)
|
|
# try:
|
|
# if progress.exists():
|
|
# next_vertex = vertex.get_next(progress[0].get_template())
|
|
# if next_vertex:
|
|
# res['next'] = MiniVertexSerializer(next_vertex).data
|
|
# res['is_in_progress'] = vertex in progress[0].get_objects_in_progress()
|
|
# else:
|
|
# res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data
|
|
# except Thread.DoesNotExist or Vertex.DoesNotExist:
|
|
# res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data
|
|
|
|
return Response(res, status=200)
|
|
|