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)