views.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from django.db.models import Count
  2. from django.views import generic
  3. from music.models import Album, Artist, Track
  4. from scrobbles.models import ChartRecord
  5. from scrobbles.stats import get_scrobble_count_qs
  6. class TrackListView(generic.ListView):
  7. model = Track
  8. paginate_by = 200
  9. def get_queryset(self):
  10. return get_scrobble_count_qs(user=self.request.user).order_by(
  11. "-scrobble_count"
  12. )
  13. class TrackDetailView(generic.DetailView):
  14. model = Track
  15. slug_field = "uuid"
  16. def get_context_data(self, **kwargs):
  17. context_data = super().get_context_data(**kwargs)
  18. context_data["charts"] = ChartRecord.objects.filter(
  19. track=self.object, rank__in=[1, 2, 3]
  20. )
  21. return context_data
  22. class ArtistListView(generic.ListView):
  23. model = Artist
  24. paginate_by = 100
  25. def get_queryset(self):
  26. return (
  27. super()
  28. .get_queryset()
  29. .annotate(scrobble_count=Count("track__scrobble"))
  30. .order_by("-scrobble_count")
  31. )
  32. def get_context_data(self, *, object_list=None, **kwargs):
  33. context_data = super().get_context_data(
  34. object_list=object_list, **kwargs
  35. )
  36. context_data["view"] = self.request.GET.get("view")
  37. return context_data
  38. class ArtistDetailView(generic.DetailView):
  39. model = Artist
  40. slug_field = "uuid"
  41. def get_context_data(self, **kwargs):
  42. context_data = super().get_context_data(**kwargs)
  43. artist = context_data["object"]
  44. rank = 1
  45. tracks_ranked = []
  46. scrobbles = artist.tracks.first().scrobble_count
  47. for track in artist.tracks:
  48. if scrobbles > track.scrobble_count:
  49. rank += 1
  50. tracks_ranked.append((rank, track))
  51. scrobbles = track.scrobble_count
  52. context_data["tracks_ranked"] = tracks_ranked
  53. context_data["charts"] = ChartRecord.objects.filter(
  54. artist=self.object, rank__in=[1, 2, 3]
  55. )
  56. return context_data
  57. class AlbumListView(generic.ListView):
  58. model = Album
  59. def get_queryset(self):
  60. return (
  61. super()
  62. .get_queryset()
  63. .annotate(scrobble_count=Count("track__scrobble"))
  64. .order_by("-scrobble_count")
  65. )
  66. class AlbumDetailView(generic.DetailView):
  67. model = Album
  68. slug_field = "uuid"
  69. def get_context_data(self, **kwargs):
  70. context_data = super().get_context_data(**kwargs)
  71. # context_data['charts'] = ChartRecord.objects.filter(
  72. # track__album=self.object, rank__in=[1, 2, 3]
  73. # )
  74. return context_data