def stats(request): form = PodcastsForm(request.GET) if not form.is_valid(): return http.HttpResponseBadRequest(form.errors) episodes = Episode.objects.filter( podcast_id__in=form.cleaned_data['ids'], ) episodes = episodes.values( 'podcast_id', ).annotate( duration=Sum('duration'), min=Min('published'), max=Max('published'), ) rates = [] for each in episodes: days = (each['max'] - each['min']).days if days: rates.append( # hours per day 1.0 * each['duration'] / days / 3600 ) if rates: average = sum(rates) / len(rates) else: average = 0.0 numbers = { 'per_day': average, 'per_week': average * 7, 'per_month': average * (365 / 12.0), } return http.JsonResponse(numbers)
def stats_episodes(request): form = PodcastsForm(request.GET) if not form.is_valid(): return http.HttpResponseBadRequest(form.errors) # episodes = Episode.objects.filter( # podcast_id__in=form.cleaned_data['ids'], # ) # # episodes = episodes.values( # 'podcast_id', # ).annotate( # duration=Sum('duration'), # min=Min('published'), # max=Max('published'), # ) # rates = [] # for each in episodes: # days = (each['max'] - each['min']).days # if days: # rates.append( # # hours per day # 1.0 * each['duration'] / days / 3600 # ) # # if rates: # average = sum(rates) / len(rates) # else: # average = 0.0 # numbers = { # 'per_day': average, # 'per_week': average * 7, # 'per_month': average * (365 / 12.0), # } episodes_ = [] past = timezone.now() - datetime.timedelta(days=200) for podcast in Podcast.objects.filter(id__in=form.cleaned_data['ids']): episodes_qs = Episode.objects.filter( podcast=podcast, published__gte=past, duration__gt=0, ).only('published', 'duration') items = [] for episode in episodes_qs.order_by('published'): items.append({ 'date': episode.published, 'duration': episode.duration, }) episodes_.append({ 'name': podcast.name, 'episodes': items, }) return http.JsonResponse({'episodes': episodes_})
def stats_episodes(request): form = PodcastsForm(request.GET) if not form.is_valid(): return http.HttpResponseBadRequest(form.errors) # episodes = Episode.objects.filter( # podcast_id__in=form.cleaned_data['ids'], # ) # # episodes = episodes.values( # 'podcast_id', # ).annotate( # duration=Sum('duration'), # min=Min('published'), # max=Max('published'), # ) # rates = [] # for each in episodes: # days = (each['max'] - each['min']).days # if days: # rates.append( # # hours per day # 1.0 * each['duration'] / days / 3600 # ) # # if rates: # average = sum(rates) / len(rates) # else: # average = 0.0 # numbers = { # 'per_day': average, # 'per_week': average * 7, # 'per_month': average * (365 / 12.0), # } cutoff = timezone.now() - datetime.timedelta( days=settings.LATEST_PODCAST_CUTOFF_DAYS ) episodes_ = [] for podcast in Podcast.objects.filter(id__in=form.cleaned_data["ids"]): episodes_qs = Episode.objects.filter( podcast=podcast, published__gte=cutoff, duration__gt=0 ).only("published", "duration") items = [] for episode in episodes_qs.order_by("published"): items.append({"date": episode.published, "duration": episode.duration}) episodes_.append({"name": podcast.name, "episodes": items}) return http.JsonResponse({"episodes": episodes_})
def stats(request): form = PodcastsForm(request.GET) if not form.is_valid(): return http.HttpResponseBadRequest(form.errors) cutoff = timezone.now() - datetime.timedelta( days=settings.LATEST_PODCAST_CUTOFF_DAYS ) for podcast in Podcast.objects.filter(id__in=form.cleaned_data["ids"]): first_published = Episode.objects.filter(podcast=podcast).aggregate( first=Min("published") )["first"] if first_published: cutoff = max(cutoff, first_published) episodes = Episode.objects.filter( podcast_id__in=form.cleaned_data["ids"], published__gte=cutoff ) episodes = episodes.values("podcast_id").annotate( duration=Sum("duration"), min=Min("published"), max=Max("published") ) total_duration_days = 0.0 min_dates = [] max_dates = [] for each in episodes: total_duration_days += each["duration"] min_dates.append(each["min"]) max_dates.append(each["max"]) if total_duration_days > 0 and min_dates != max_dates: max_date = max(max_dates) min_date = min(min_dates) days = (max_date - min_date).days # minutes per day per_day = total_duration_days / days / 3600 numbers = { "per_day": per_day, "per_week": per_day * 7, "per_month": per_day * (365 / 12.0), "max_date": max_date, "min_date": min_date, } else: numbers = {"per_day": 0, "per_week": 0, "per_month": 0} return http.JsonResponse(numbers)
def picked(request): form = PodcastsForm(request.POST) if not form.is_valid(): return http.HttpResponseBadRequest(form.errors) if request.POST.get("picks"): picked_obj = Picked.objects.get(session_key=request.POST["picks"]) else: picked_obj = None podcasts = Podcast.objects.filter(id__in=form.cleaned_data["ids"]) if picked_obj: # append picked_obj.podcasts.clear() else: # create with first pick session_key = random_string(32) picked_obj = Picked.objects.create(session_key=session_key) picked_obj.podcasts.add(*podcasts) return http.JsonResponse({"session_key": picked_obj.session_key})