soundwave/backend/stats/views.py

62 lines
1.8 KiB
Python
Raw Normal View History

"""Stats API views"""
from django.db.models import Sum, Count
from rest_framework.response import Response
from audio.models import Audio
from channel.models import Channel
from download.models import DownloadQueue
from stats.serializers import (
AudioStatsSerializer,
ChannelStatsSerializer,
DownloadStatsSerializer,
)
from common.views import ApiBaseView
class AudioStatsView(ApiBaseView):
"""Audio statistics endpoint"""
def get(self, request):
"""Get audio statistics"""
stats = Audio.objects.aggregate(
total_count=Count('id'),
total_duration=Sum('duration'),
total_size=Sum('file_size'),
total_plays=Sum('play_count'),
)
# Handle None values
stats = {k: v or 0 for k, v in stats.items()}
serializer = AudioStatsSerializer(stats)
return Response(serializer.data)
class ChannelStatsView(ApiBaseView):
"""Channel statistics endpoint"""
def get(self, request):
"""Get channel statistics"""
stats = {
'total_channels': Channel.objects.count(),
'subscribed_channels': Channel.objects.filter(subscribed=True).count(),
}
serializer = ChannelStatsSerializer(stats)
return Response(serializer.data)
class DownloadStatsView(ApiBaseView):
"""Download statistics endpoint"""
def get(self, request):
"""Get download statistics"""
stats = {
'pending': DownloadQueue.objects.filter(status='pending').count(),
'completed': DownloadQueue.objects.filter(status='completed').count(),
'failed': DownloadQueue.objects.filter(status='failed').count(),
}
serializer = DownloadStatsSerializer(stats)
return Response(serializer.data)