Example #1
0
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)
Example #2
0
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_})
Example #3
0
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_})
Example #4
0
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_})
Example #5
0
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)
Example #6
0
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)
Example #7
0
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})
Example #8
0
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})