73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
from django.utils import timezone
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from apps.common.api.base_viewset import BaseModelViewSet
|
|
from apps.common.api.permissions import IsStaffOrReadOnly
|
|
from apps.courses.models import Course, Enrollment, Lesson, LessonProgress
|
|
from apps.courses.serializers import CourseSerializer, EnrollCourseResponseSerializer, MyCourseSerializer, \
|
|
CompleteLessonResponseSerializer
|
|
|
|
|
|
class CourseViewSet(BaseModelViewSet):
|
|
queryset = Course.objects.all()
|
|
serializer_class = CourseSerializer
|
|
permission_classes = [IsStaffOrReadOnly]
|
|
|
|
search_fields = ('title', 'description')
|
|
filterset_fields = ['published']
|
|
ordering = ['-created_at']
|
|
|
|
class EnrollCourseView(APIView):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def post(self, request, course_id):
|
|
course = Course.objects.get(id=course_id)
|
|
enrollment, created = Enrollment.objects.get_or_create(user=request.user, course=course)
|
|
serializer = EnrollCourseResponseSerializer({
|
|
'course_id' : course.id,
|
|
'enrolled_at' : enrollment.enrolled_at,
|
|
})
|
|
|
|
return Response(serializer.data)
|
|
|
|
class MyCoursesView(APIView):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get(self, request):
|
|
enrollments = Enrollment.objects.filter(user=request.user)
|
|
|
|
data = [
|
|
{
|
|
'course_id': e.course.id,
|
|
'title': e.course.title,
|
|
'enrolled_at': e.enrolled_at,
|
|
} for e in enrollments
|
|
]
|
|
|
|
serializer = MyCourseSerializer(data, many=True)
|
|
return Response(serializer.data)
|
|
|
|
class CompleteLessonView(APIView):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def post(self, request, lesson_id):
|
|
lesson = Lesson.objects.get(id=lesson_id)
|
|
|
|
progress, _ = LessonProgress.objects.get_or_create(
|
|
user=request.user,
|
|
lesson=lesson
|
|
)
|
|
|
|
progress.completed = True
|
|
progress.complete_at = timezone.now()
|
|
progress.save()
|
|
|
|
serializer = CompleteLessonResponseSerializer({
|
|
'lesson_id' : lesson.id,
|
|
'completed' : progress.completed,
|
|
'completed_at' : progress.complete_at,
|
|
})
|
|
|
|
return Response(serializer.data) |