[charts] Clean up some chart views
This commit is contained in:
@ -221,6 +221,7 @@ class ChartRecordView(TemplateView):
|
||||
context["period"] = "current"
|
||||
context["year"] = current_year
|
||||
context["month"] = current_month
|
||||
context["month_name"] = calendar.month_name[current_month]
|
||||
context["week"] = current_week
|
||||
context["day"] = current_day
|
||||
|
||||
@ -301,6 +302,7 @@ class ChartRecordView(TemplateView):
|
||||
context["period"] = "historical"
|
||||
context["year"] = year
|
||||
context["month"] = month
|
||||
context["month_name"] = calendar.month_name[month] if month else None
|
||||
context["week"] = week
|
||||
context["day"] = day
|
||||
|
||||
@ -604,9 +606,9 @@ class ChartRecordView(TemplateView):
|
||||
if bird_id:
|
||||
bird_counts[bird_id] = bird_counts.get(bird_id, 0) + quantity
|
||||
|
||||
sorted_birds = sorted(
|
||||
bird_counts.items(), key=lambda x: x[1], reverse=True
|
||||
)[:limit]
|
||||
sorted_birds = sorted(bird_counts.items(), key=lambda x: x[1], reverse=True)[
|
||||
:limit
|
||||
]
|
||||
|
||||
bird_ids = [bid for bid, _ in sorted_birds]
|
||||
birds = Bird.objects.filter(id__in=bird_ids)
|
||||
@ -727,12 +729,22 @@ class SpotifyTracksView(TemplateView):
|
||||
template_name = "charts/spotify_tracks.html"
|
||||
|
||||
def get_spotify_tracks(self, user, limit=50):
|
||||
non_spotify_mopidy_tracks = (
|
||||
Scrobble.objects.filter(
|
||||
user=user,
|
||||
source="Mopidy",
|
||||
track__isnull=False,
|
||||
)
|
||||
.exclude(log__mopidy_source="spotify")
|
||||
.values("track")
|
||||
)
|
||||
track_ids = (
|
||||
Scrobble.objects.filter(
|
||||
user=user,
|
||||
track__isnull=False,
|
||||
)
|
||||
.filter(Q(source="Last.fm") | Q(log__mopidy_source="spotify"))
|
||||
.exclude(track__in=non_spotify_mopidy_tracks)
|
||||
.values("track")
|
||||
.annotate(count=Count("id"))
|
||||
.order_by("-count")[:limit]
|
||||
@ -760,6 +772,53 @@ class SpotifyTracksView(TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class BandcampTracksView(TemplateView):
|
||||
template_name = "charts/bandcamp_tracks.html"
|
||||
|
||||
def get_bandcamp_tracks(self, user, limit=50):
|
||||
non_bandcamp_mopidy_tracks = (
|
||||
Scrobble.objects.filter(
|
||||
user=user,
|
||||
source="Mopidy",
|
||||
track__isnull=False,
|
||||
)
|
||||
.exclude(log__mopidy_source="bandcamp")
|
||||
.values("track")
|
||||
)
|
||||
track_ids = (
|
||||
Scrobble.objects.filter(
|
||||
user=user,
|
||||
track__isnull=False,
|
||||
log__mopidy_source="bandcamp",
|
||||
)
|
||||
.exclude(track__in=non_bandcamp_mopidy_tracks)
|
||||
.values("track")
|
||||
.annotate(count=Count("id"))
|
||||
.order_by("-count")[:limit]
|
||||
)
|
||||
from music.models import Track
|
||||
|
||||
track_id_list = [item["track"] for item in track_ids]
|
||||
tracks = Track.objects.filter(id__in=track_id_list)
|
||||
track_map = {t.id: t for t in tracks}
|
||||
return [
|
||||
{
|
||||
"track": track_map[tid],
|
||||
"count": next(
|
||||
(item["count"] for item in track_ids if item["track"] == tid), 0
|
||||
),
|
||||
}
|
||||
for tid in track_id_list
|
||||
if tid in track_map
|
||||
]
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
user = self.request.user
|
||||
context["bandcamp_tracks"] = self.get_bandcamp_tracks(user)
|
||||
return context
|
||||
|
||||
|
||||
class BirdsChartView(TemplateView):
|
||||
template_name = "charts/birds_chart.html"
|
||||
|
||||
@ -792,9 +851,9 @@ class BirdsChartView(TemplateView):
|
||||
if bird_id:
|
||||
bird_counts[bird_id] = bird_counts.get(bird_id, 0) + quantity
|
||||
|
||||
sorted_birds = sorted(
|
||||
bird_counts.items(), key=lambda x: x[1], reverse=True
|
||||
)[:limit]
|
||||
sorted_birds = sorted(bird_counts.items(), key=lambda x: x[1], reverse=True)[
|
||||
:limit
|
||||
]
|
||||
|
||||
bird_ids = [bid for bid, _ in sorted_birds]
|
||||
birds = Bird.objects.filter(id__in=bird_ids)
|
||||
|
||||
Reference in New Issue
Block a user