From 9ef4a551271f1780e306371e62e6feb5ac5e06c4 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sat, 30 May 2026 10:19:37 +0330 Subject: [PATCH] serializers and views added for livesessions for dashboard --- apps/course/serializers/admin.py | 46 +++++++++++++++++++++++++++++++- apps/course/urls.py | 1 + apps/course/views/admin.py | 39 +++++++++++++++++++++++++-- 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/apps/course/serializers/admin.py b/apps/course/serializers/admin.py index 70e2acb..a7955e8 100644 --- a/apps/course/serializers/admin.py +++ b/apps/course/serializers/admin.py @@ -9,7 +9,10 @@ from apps.course.models import ( CourseAttachment, Attachment, CourseGlossary, - Glossary + Glossary, + CourseLiveSession, + LiveSessionUser, + LiveSessionRecording ) from apps.account.models import ProfessorUser @@ -376,3 +379,44 @@ class AdminCourseGlossarySerializer(serializers.Serializer): glossary.save() return instance + + +class AdminLiveSessionUserSerializer(serializers.ModelSerializer): + user_name = serializers.CharField(source='user.fullname', read_only=True) + user_email = serializers.CharField(source='user.email', read_only=True) + + class Meta: + model = LiveSessionUser + fields = ['id', 'session', 'user', 'user_name', 'user_email', 'role', 'entered_at', 'exited_at', 'is_online'] + + +class AdminLiveSessionRecordingSerializer(serializers.ModelSerializer): + file = FileFieldSerializer(required=False, allow_null=True) + thumbnail = FileFieldSerializer(required=False, allow_null=True) + + class Meta: + model = LiveSessionRecording + fields = ['id', 'session', 'title', 'file', 'file_time', 'recording_type', 'thumbnail', 'is_active', 'created_at'] + + +class AdminLiveSessionListSerializer(serializers.ModelSerializer): + course_title = serializers.CharField(source='course.title', read_only=True) + participant_count = serializers.SerializerMethodField() + + class Meta: + model = CourseLiveSession + fields = ['id', 'course', 'course_title', 'room_id', 'subject', 'started_at', 'ended_at', 'participant_count', 'created_at'] + + def get_participant_count(self, obj): + return obj.user_sessions.count() + + +class AdminLiveSessionDetailSerializer(serializers.ModelSerializer): + course_title = serializers.CharField(source='course.title', read_only=True) + user_sessions = AdminLiveSessionUserSerializer(many=True, read_only=True) + recordings = AdminLiveSessionRecordingSerializer(many=True, read_only=True) + recorded_file = FileFieldSerializer(required=False, allow_null=True) + + class Meta: + model = CourseLiveSession + fields = ['id', 'course', 'course_title', 'room_id', 'subject', 'started_at', 'ended_at', 'recorded_file', 'user_sessions', 'recordings', 'created_at', 'updated_at'] diff --git a/apps/course/urls.py b/apps/course/urls.py index 99c917f..436a74f 100644 --- a/apps/course/urls.py +++ b/apps/course/urls.py @@ -9,6 +9,7 @@ router.register(r'admin/chapters', views.AdminChapterViewSet, basename='admin-ch router.register(r'admin/course-lessons', views.AdminCourseLessonViewSet, basename='admin-course-lessons') router.register(r'admin/course-attachments', views.AdminCourseAttachmentViewSet, basename='admin-course-attachments') router.register(r'admin/course-glossaries', views.AdminCourseGlossaryViewSet, basename='admin-course-glossaries') +router.register(r'admin/live-sessions', views.AdminLiveSessionViewSet, basename='admin-live-sessions') # Base model admin routes for the Repository Page router.register(r'admin/categories', views.AdminCourseCategoryViewSet, basename='admin-categories') diff --git a/apps/course/views/admin.py b/apps/course/views/admin.py index a7cc49b..2669f16 100644 --- a/apps/course/views/admin.py +++ b/apps/course/views/admin.py @@ -13,7 +13,10 @@ from apps.course.models import ( CourseAttachment, Attachment, CourseGlossary, - Glossary + Glossary, + CourseLiveSession, + LiveSessionUser, + LiveSessionRecording ) from apps.course.serializers.admin import ( AdminCourseCategorySerializer, @@ -25,7 +28,9 @@ from apps.course.serializers.admin import ( AdminCourseGlossarySerializer, AdminLessonSerializer, AdminGlossarySerializer, - AdminAttachmentSerializer + AdminAttachmentSerializer, + AdminLiveSessionListSerializer, + AdminLiveSessionDetailSerializer ) class AdminCourseViewSet(viewsets.ModelViewSet): @@ -272,3 +277,33 @@ class AdminAttachmentViewSet(viewsets.ModelViewSet): queryset = queryset.filter(title__icontains=search) return queryset + +class AdminLiveSessionViewSet(viewsets.ModelViewSet): + """ + Admin CRUD ViewSet for Course Live Sessions. + """ + permission_classes = [IsAuthenticated, IsAdminUser] + authentication_classes = [TokenAuthentication] + + def get_serializer_class(self): + if self.action == 'list': + return AdminLiveSessionListSerializer + return AdminLiveSessionDetailSerializer + + def get_queryset(self): + queryset = CourseLiveSession.objects.all().select_related('course') + + search = self.request.query_params.get('search', None) + if search: + queryset = queryset.filter( + Q(subject__icontains=search) | + Q(room_id__icontains=search) | + Q(course__title__icontains=search) + ) + + course_id = self.request.query_params.get('course', None) + if course_id: + queryset = queryset.filter(course_id=course_id) + + return queryset.order_by('-started_at') +