def get_helpful_votes_async()

in kitsune/wiki/views.py [0:0]


def get_helpful_votes_async(request, document_slug):
    document = get_visible_document_or_404(
        request.user, locale=request.LANGUAGE_CODE, slug=document_slug
    )

    datums = []
    flag_data = []
    rev_data = []
    revisions = set()
    created_list = []
    timestamps_with_data = set()

    results = (
        HelpfulVote.objects.filter(revision__document=document)
        .values(date_created=TruncDate("created"))
        .annotate(
            revisions=ArrayAgg("revision_id"),
            count_helpful=Count("helpful", filter=Q(helpful=True)),
            count_unhelpful=Count("helpful", filter=Q(helpful=False)),
        )
        .order_by("date_created")
    )

    for res in results:
        revisions.update(res["revisions"])
        created_list.append(res["date_created"])
        timestamp = (time.mktime(res["date_created"].timetuple()) // 86400) * 86400

        datums.append(
            {
                "yes": res["count_helpful"],
                "no": res["count_unhelpful"],
                "date": timestamp,
            }
        )
        timestamps_with_data.add(timestamp)

    if not created_list:
        send = {"datums": [], "annotations": []}
        return HttpResponse(json.dumps(send), content_type="application/json")

    # The "created_list" is a list of date objects, while "min_created" and
    # "max_created" are datetime objects that span the period from the beginning
    # of the first day to the end of the last day that the document was voted on.
    min_created = datetime.combine(min(created_list), datetime_time.min)
    max_created = datetime.combine(max(created_list), datetime_time.max)

    # Zero fill the data.
    end = time.mktime(datetime.now().timetuple())
    while timestamp <= end:
        if timestamp not in timestamps_with_data:
            datums.append(
                {
                    "yes": 0,
                    "no": 0,
                    "date": timestamp,
                }
            )
            timestamps_with_data.add(timestamp)
        timestamp += 24 * 60 * 60

    for flag in ImportantDate.objects.filter(date__gte=min_created, date__lte=max_created):
        flag_data.append({"x": int(time.mktime(flag.date.timetuple())), "text": _(flag.text)})

    for rev in Revision.objects.filter(
        pk__in=revisions, created__range=(min_created, max_created)
    ):
        rdate = rev.reviewed or rev.created
        rev_data.append(
            {"x": int(time.mktime(rdate.timetuple())), "text": str(_("Revision %s")) % rev.created}
        )

    # Rickshaw wants data like
    # [{'name': 'series1', 'data': [{'x': 1362774285, 'y': 100}, ...]},]
    send = {"datums": datums, "annotations": []}

    if flag_data:
        send["annotations"].append(
            {
                "name": _("Firefox Releases"),
                "slug": "releases",
                "data": flag_data,
            }
        )
    if rev_data:
        send["annotations"].append(
            {
                "name": _("Article Revisions"),
                "slug": "revisions",
                "data": rev_data,
            }
        )

    return HttpResponse(json.dumps(send), content_type="application/json")