Source code for tahrir.views.report
from datetime import date, datetime, timedelta, timezone
from flask import g, jsonify, redirect, request, url_for
from tahrir.utils.avatar import hash_email
from tahrir.utils.date_time import get_start_week
from . import blueprint as bp
[docs]
@bp.route("/report/this/month")
def report_this_month():
now = datetime.now(timezone.utc)
year, month = now.year, now.month
location = url_for("tahrir.report_year_month", year=year, month=month)
return redirect(location)
[docs]
@bp.route("/json/report")
@bp.route("/json/report/y/<int:year>")
@bp.route("/json/report/y/<int:year>/m/<int:month>")
@bp.route("/json/report/y/<int:year>/m/<int:month>/d/<int:day>")
@bp.route("/json/report/y/<int:year>/m/<int:month>/d/<int:day>/week")
def json_report_year(year=None, week=None, month=None, day=None):
"""The leaderboard."""
begin = int(request.args.get("begin", 0))
limit = int(request.args.get("limit", 200))
if request.path.endswith("/week"):
# Weekly report
start = get_start_week(year, month, day)
stop = start + timedelta(days=6)
elif day is not None:
# Daily report
start = date(year, month, day)
stop = start + timedelta(days=1)
elif week is not None:
# Weekly report
max_week = date(year, 12, 31).isocalendar()[1]
if 0 < week < max_week:
start = date(year, 1, 1) + timedelta(weeks=week - 1)
start = get_start_week(start.year, start.month, start.day)
stop = start + timedelta(days=6)
else:
raise ValueError()
elif month is not None:
# Monthly report
start = date(year, month, 1)
stop = start + timedelta(days=32)
stop = stop.replace(day=1)
stop = stop - timedelta(days=1)
elif year is not None:
# Yearly report
start = date(year, 1, 1)
stop = date(year, 12, 31)
else:
# Default: Complete list
start = None
stop = None
# TODO: Modify make_leaderboard to add filter
user_to_rank = g.tahrirdb.make_leaderboard(
start=start,
stop=stop,
)
limited_users = list(user_to_rank)[begin : begin + limit]
data = [
{
"mail": hash_email(user.avatar),
"nickname": user.nickname,
"badges": user_to_rank[user]["badges"],
"rank": {
"global": user.rank,
"period": user_to_rank[user]["rank"],
},
}
for user in limited_users
]
return jsonify(data)