add computation of HistoricEpisodeData
[mygpo.git] / mygpo / data / historic.py
blob9e10f6fe0ff8a25087675db5e57331f1dc6acf56
1 from mygpo.api.models import Podcast, Episode, SubscriptionAction, EpisodeAction
2 from mygpo.data.models import HistoricPodcastData, HistoricEpisodeData
3 from mygpo.utils import daterange
4 from datetime import date, timedelta
7 def all_podcasts():
8 for p in Podcast.objects.all():
9 calc_podcast(p)
12 def calc_podcast(podcast):
14 latest_historic = HistoricPodcastData.objects.filter(podcast=podcast).order_by('-date')
15 if latest_historic.count() > 0:
16 start = latest_historic[0].date + timedelta(days=1)
17 prev = latest_historic[0].subscriber_count
19 else:
20 first = SubscriptionAction.objects.filter(podcast=podcast).order_by('timestamp')[0]
21 start = first.timestamp.date()
22 prev = 0
24 for day in daterange(start, date.today() - timedelta(days=1)):
25 nextday = day + timedelta(days=1)
26 act = [x['action'] for x in SubscriptionAction.objects.filter(podcast=podcast, timestamp__range=(day, nextday)).values('action')]
27 prev += sum(act)
29 rec = HistoricPodcastData.objects.get_or_create(podcast=podcast, date=day, defaults={'subscriber_count': prev})
32 def calc_episode(episode):
33 latest_historic = HistoricEpisodeData.objects.filter(episode=episode).order_by('-date')
34 if latest_historic.count() > 0:
35 start = latest_historic[0].date + timedelta(days=1)
36 else:
37 first = EpisodeAction.objects.filter(episode=episode).order_by('timestamp')[0]
38 start = first.timestamp.date()
40 for day in daterange(start, date.today() - timedelta(days=1)):
41 nextday = day + timedelta(days=1)
43 listeners = EpisodeAction.objects.filter(episode=episode, action='play').values('user').distinct().count()
45 HistoricEpisodeData.objects.get_or_create(episode=episode, date=day, defaults={'listener_count': listeners})