3 changed files with 69 additions and 2 deletions
@ -0,0 +1,65 @@ |
|||||
|
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 |
||||
|
}) |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue