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")