You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

65 lines
2.7 KiB

from rest_framework.views import APIView
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
from apps.account.models import User
from apps.course.models import Course, Participant
from apps.blog.models import Blog
from apps.certificate.models import Certificate
# Import your Transaction model here
class AdminDashboardStatsView(APIView):
permission_classes = [IsAuthenticated, IsAdminUser]
def get(self, request):
now = timezone.now()
thirty_days_ago = now - timedelta(days=30)
# 1. Basic Counts
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_courses = Course.objects.filter(status=Course.StatusChoices.ONGOING).count()
total_blogs = Blog.objects.count()
pending_certificates = Certificate.objects.filter(status='pending').count()
# 2. Revenue (Mocked - replace with your actual Transaction logic)
# revenue_30d = Transaction.objects.filter(status='success', created_at__gte=thirty_days_ago).aggregate(Sum('amount'))['amount__sum'] or 0
revenue_30d = 12500.00 # Dummy data
# 3. Transaction Chart Data (Mocked - replace with actual grouped query)
transactions_data = [
{"name": "Success", "value": 450, "fill": "var(--color-success)"},
{"name": "Pending", "value": 85, "fill": "var(--color-pending)"},
{"name": "Waiting", "value": 40, "fill": "var(--color-waiting)"},
{"name": "Failed", "value": 25, "fill": "var(--color-failed)"},
]
# 4. Top 5 Popular Courses
top_courses = Course.objects.annotate(
participant_count=Count('participants')
).order_by('-participant_count')[:5]
top_courses_data = [
{
"id": c.id,
"title": c.title,
"professor": c.professor.fullname if c.professor else "Unknown",
"participants": c.participant_count
} for c in top_courses
]
return Response({
"cards": {
"active_students": active_students,
"professors": professors,
"active_courses": active_courses,
"total_blogs": total_blogs,
"revenue_30d": revenue_30d,
"pending_certificates": pending_certificates
},
"transactions_chart": transactions_data,
"top_courses": top_courses_data
})