diff --git a/apps/account/views/user.py b/apps/account/views/user.py index 8970415..8e53acd 100644 --- a/apps/account/views/user.py +++ b/apps/account/views/user.py @@ -660,7 +660,7 @@ class AdminUserViewSet(ModelViewSet): # Restrict queryset for professors to only students of their courses if self.request.user.user_type == 'professor': queryset = queryset.filter( - user_type='student', + Q(user_type='student') | Q(user_type='client'), participated_courses__course__professor_id=self.request.user.id ) @@ -689,7 +689,10 @@ class AdminUserViewSet(ModelViewSet): # Handle user type filter user_type_param = self.request.query_params.get('user_type', None) if user_type_param: - queryset = queryset.filter(user_type=user_type_param) + if user_type_param == 'student': + queryset = queryset.filter(Q(user_type='student') | Q(user_type='client')) + else: + queryset = queryset.filter(user_type=user_type_param) # Handle course filter for selecting students enrolled in a specific course course_param = self.request.query_params.get('course', None) diff --git a/apps/api/views/admin_dashboard.py b/apps/api/views/admin_dashboard.py index 9c83305..3a6f70d 100644 --- a/apps/api/views/admin_dashboard.py +++ b/apps/api/views/admin_dashboard.py @@ -3,7 +3,7 @@ from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated, IsAdminUser from django.utils import timezone from datetime import timedelta -from django.db.models import Count, Sum +from django.db.models import Count, Sum, Q from django.db.models.functions import TruncDate from apps.account.models import User, LoginHistory @@ -26,15 +26,22 @@ class AdminDashboardStatsView(APIView): # --------------------------------------------------------- # 1. CARDS & BASIC STATS # --------------------------------------------------------- - active_students = User.objects.filter(groups__name="Student Group", is_active=True).count() - professors = User.objects.filter(groups__name="Professor Group", is_active=True).count() + active_students = User.objects.filter( + Q(user_type=User.UserType.STUDENT) | Q(user_type=User.UserType.CLIENT), + is_active=True + ).count() + professors = User.objects.filter(user_type=User.UserType.PROFESSOR, is_active=True).count() active_courses = Course.objects.filter(status=Course.StatusChoices.ONGOING).count() total_blogs = Blog.objects.count() pending_certificates = Certificate.objects.filter(status='pending').count() active_live_sessions = CourseLiveSession.objects.filter(ended_at__isnull=True).count() - # Revenue (Mocked for 30d sum) - revenue_30d = 12500.00 # Dummy data + # Revenue (30d sum of successful transactions) + revenue_result = TransactionParticipant.objects.filter( + status=TransactionParticipant.TransactionStatus.SUCCESS, + created_at__gte=thirty_days_ago + ).aggregate(total=Sum('price')) + revenue_30d = float(revenue_result['total'] or 0.0) # Private vs Group Chat Usage chat_types = RoomMessage.objects.values('room_type').annotate(count=Count('id'))