Files
Flook fe67d491e2
Build & Push Docker Image (Backend) / build (push) Successful in 54s
feat: implement LMS core (CMS, Courses, Enrollment, Progress, Auth) (Admin + API)
2026-05-03 09:36:47 +07:00

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)