views.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import bleach
  2. from django.db.models import Count, Q
  3. from django.http import JsonResponse
  4. def channel_videos_distribution(request, playlist_id):
  5. labels = []
  6. data = []
  7. playlist_items = request.user.playlists.get(playlist_id=bleach.clean(playlist_id)).playlist_items.all()
  8. queryset = playlist_items.filter(Q(video__is_unavailable_on_yt=False) &
  9. Q(video__was_deleted_on_yt=False))\
  10. .values('video__channel_name').annotate(channel_videos_count=Count('video_position'))
  11. for entry in queryset:
  12. labels.append(entry['video__channel_name'])
  13. data.append(entry['channel_videos_count'])
  14. return JsonResponse(data={
  15. 'labels': labels,
  16. 'data': data,
  17. })
  18. def overall_channels_distribution(request):
  19. labels = []
  20. data = []
  21. videos = request.user.videos.filter(Q(is_unavailable_on_yt=False) & Q(was_deleted_on_yt=False))
  22. queryset = videos.values('channel_name').annotate(channel_videos_count=Count('video_id')
  23. ).order_by('-channel_videos_count')[:100]
  24. for entry in queryset:
  25. labels.append(entry['channel_name'])
  26. data.append(entry['channel_videos_count'])
  27. return JsonResponse(data={
  28. 'labels': labels,
  29. 'data': data,
  30. })
  31. def overall_playlists_distribution(request):
  32. labels = []
  33. data = []
  34. user_playlists = request.user.playlists.filter(is_in_db=True).exclude(playlist_id='LL')
  35. total_num_playlists = user_playlists.count()
  36. statistics = {'public': 0, 'private': 0, 'favorites': 0, 'watching': 0, 'imported': 0, 'youtube mixes': 0}
  37. if total_num_playlists != 0:
  38. statistics['public'] = user_playlists.filter(is_private_on_yt=False).count()
  39. statistics['private'] = user_playlists.filter(is_private_on_yt=True).count()
  40. statistics['favorites'] = user_playlists.filter(is_favorite=True).count()
  41. statistics['watching'] = user_playlists.filter(marked_as='watching').count()
  42. statistics['imported'] = user_playlists.filter(is_user_owned=False).count()
  43. statistics['youtube mixes'] = user_playlists.filter(is_yt_mix=True).count()
  44. for key, value in statistics.items():
  45. labels.append(key)
  46. data.append(value)
  47. return JsonResponse(data={
  48. 'labels': labels,
  49. 'data': data,
  50. })
  51. def watching_playlists_percent_distribution(request):
  52. labels = []
  53. data = []
  54. watching_playlists = request.user.playlists.filter(Q(is_in_db=True) & Q(marked_as='watching'))
  55. if watching_playlists.exists():
  56. for playlist in watching_playlists:
  57. labels.append(playlist.name)
  58. data.append(playlist.get_percent_complete())
  59. return JsonResponse(data={
  60. 'labels': labels,
  61. 'data': data,
  62. })