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 django.db.models.functions import TruncDate from rest_framework.authentication import TokenAuthentication from apps.account.models import User, LoginHistory from apps.api.models import AppVersion, SupportMessage class AdminDashboardStatsView(APIView): authentication_classes = [TokenAuthentication] permission_classes = [IsAuthenticated, IsAdminUser] def get(self, request): now = timezone.now() thirty_days_ago = now - timedelta(days=30) seven_days_ago = now - timedelta(days=7) # 1. User metrics total_users = User.objects.count() active_users = User.objects.filter(is_active=True).count() new_users_30d = User.objects.filter(date_joined__gte=thirty_days_ago).count() staff_users = User.objects.filter(is_staff=True).count() # 2. Login activity logins_7d = LoginHistory.objects.filter(at_time__gte=seven_days_ago).count() login_chart_qs = ( LoginHistory.objects.filter(at_time__gte=seven_days_ago) .annotate(date=TruncDate('at_time')) .values('date') .annotate(count=Count('id')) .order_by('date') ) login_chart = [ {"date": entry['date'].strftime('%Y-%m-%d'), "count": entry['count']} for entry in login_chart_qs ] # 3. System info latest_version = AppVersion.get_latest_active() unresolved_support = SupportMessage.objects.filter(is_resolved=False).count() data = { "summary": { "total_users": total_users, "active_users": active_users, "new_users_30d": new_users_30d, "staff_users": staff_users, "logins_7d": logins_7d, "unresolved_support": unresolved_support, "latest_app_version": latest_version.version if latest_version else None, }, "charts": { "logins_by_day": login_chart, } } return Response(data)