import bleach from django.db.models import Count, Q from django.http import JsonResponse def channel_videos_distribution(request, playlist_id): labels = [] data = [] playlist_items = request.user.playlists.get(playlist_id=bleach.clean(playlist_id)).playlist_items.all() queryset = playlist_items.filter(Q(video__is_unavailable_on_yt=False) & Q(video__was_deleted_on_yt=False)).values( 'video__channel_name').annotate(channel_videos_count=Count('video_position')) for entry in queryset: labels.append(entry['video__channel_name']) data.append(entry['channel_videos_count']) return JsonResponse(data={ 'labels': labels, 'data': data, }) def overall_channels_distribution(request): labels = [] data = [] videos = request.user.videos.filter(Q(is_unavailable_on_yt=False) & Q(was_deleted_on_yt=False)) queryset = videos.values( 'channel_name').annotate(channel_videos_count=Count('video_id')).order_by('-channel_videos_count')[:100] for entry in queryset: labels.append(entry['channel_name']) data.append(entry['channel_videos_count']) return JsonResponse(data={ 'labels': labels, 'data': data, }) def overall_playlists_distribution(request): labels = [] data = [] user_playlists = request.user.playlists.filter(is_in_db=True).exclude(playlist_id="LL") total_num_playlists = user_playlists.count() statistics = { "public": 0, "private": 0, "favorites": 0, "watching": 0, "imported": 0, "youtube mixes": 0 } if total_num_playlists != 0: statistics["public"] = user_playlists.filter(is_private_on_yt=False).count() statistics["private"] = user_playlists.filter(is_private_on_yt=True).count() statistics["favorites"] = user_playlists.filter(is_favorite=True).count() statistics["watching"] = user_playlists.filter(marked_as="watching").count() statistics["imported"] = user_playlists.filter(is_user_owned=False).count() statistics["youtube mixes"] = user_playlists.filter(is_yt_mix=True).count() for key, value in statistics.items(): labels.append(key) data.append(value) return JsonResponse(data={ 'labels': labels, 'data': data, }) def watching_playlists_percent_distribution(request): labels = [] data = [] watching_playlists = request.user.playlists.filter(Q(is_in_db=True) & Q(marked_as="watching")) if watching_playlists.exists(): for playlist in watching_playlists: labels.append(playlist.name) data.append(playlist.get_percent_complete()) return JsonResponse(data={ 'labels': labels, 'data': data, })