Files
vrobbler/vrobbler/apps/podcasts/views.py
Colin Powell 8e8d25aa1d
All checks were successful
build & deploy / test (push) Successful in 1m40s
build & deploy / deploy (push) Successful in 20s
[podcasts] Add aggregation to templates
2026-03-18 11:07:45 -04:00

73 lines
2.5 KiB
Python

import datetime
from django.utils import timezone
from django.views import generic
from podcasts.models import Podcast, PodcastEpisode
from scrobbles.models import Scrobble
from scrobbles.views import ScrobbleableListView, ScrobbleableDetailView
class PodcastListView(ScrobbleableListView):
model = PodcastEpisode
template_name = "podcasts/podcast_list.html"
def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)
user = self.request.user
now = timezone.now()
start_day_of_week = now - datetime.timedelta(days=now.weekday())
start_day_of_month = now.replace(day=1)
scrobbles_this_week = Scrobble.objects.filter(
user=user,
podcast_episode__isnull=False,
timestamp__gte=start_day_of_week,
).select_related("podcast_episode", "podcast_episode__podcast")
scrobbles_this_month = Scrobble.objects.filter(
user=user,
podcast_episode__isnull=False,
timestamp__gte=start_day_of_month,
).select_related("podcast_episode", "podcast_episode__podcast")
podcasts_this_week = {}
for scrobble in scrobbles_this_week:
podcast = scrobble.podcast_episode.podcast
if podcast:
podcasts_this_week[podcast.id] = {
"podcast": podcast,
"count": podcasts_this_week.get(podcast.id, {}).get("count", 0) + 1,
}
podcasts_this_month = {}
for scrobble in scrobbles_this_month:
podcast = scrobble.podcast_episode.podcast
if podcast:
podcasts_this_month[podcast.id] = {
"podcast": podcast,
"count": podcasts_this_month.get(podcast.id, {}).get("count", 0)
+ 1,
}
context_data["podcasts_this_week"] = sorted(
podcasts_this_week.values(), key=lambda x: x["count"], reverse=True
)
context_data["podcasts_this_month"] = sorted(
podcasts_this_month.values(),
key=lambda x: x["count"],
reverse=True,
)
return context_data
class PodcastDetailView(generic.DetailView):
model = Podcast
slug_field = "uuid"
def get_context_data(self, **kwargs):
user = self.request.user
context_data = super().get_context_data(**kwargs)
context_data["scrobbles"] = self.object.scrobbles(user)
return context_data