Source code for tahrir.views.leaderboard

import tahrir_api.model as m
from flask import g, jsonify, render_template, request

from tahrir.utils.user import get_person

from . import blueprint as bp


[docs] @bp.route("/leaderboard") def leaderboard(): """Render a top users view.""" query = ( g.tahrirdb.session.query(m.Person) .order_by( m.Person.rank, m.Person.created_on, ) .filter(m.Person.opt_out.is_(False)) ) leaderboard = query.filter(m.Person.rank.isnot(None)).all() # Get total user count. user_count = len(leaderboard) leaderboard.extend(query.filter(m.Person.rank.is_(None)).all()) user_to_rank = g.tahrirdb.make_leaderboard() if g.oidc_user.person: awarded_assertions = g.oidc_user.person.assertions rank = g.oidc_user.person.rank or 0 idx = rank - 1 # Handle the case of leaderboard[-2:2] which will be [] always. if idx < 2: idx = 2 competitors = leaderboard[(idx - 2) : (idx + 3)] try: percentile = (float(rank) / float(user_count)) * 100 except ZeroDivisionError: percentile = 0 else: awarded_assertions = None rank = None competitors = None percentile = None return render_template( "leaderboard.html", awarded_assertions=awarded_assertions, top_persons_sorted=leaderboard, rank=rank, user_count=user_count, percentile=percentile, competitors=competitors, user_to_rank=user_to_rank, )
[docs] @bp.route("/leaderboard/json") @bp.route("/leaderboard/<user_id>/json") def leaderboard_json(user_id=None): """Render a top-users JSON dump.""" limit = int(request.args.get("limit", 25)) user = None if user_id: user = get_person(user_id) query = ( g.tahrirdb.session.query(m.Person) .order_by( m.Person.rank, m.Person.created_on, ) .filter(m.Person.opt_out.is_(False)) ) leaderboard = query.filter(m.Person.rank.isnot(None)).all() # Get total user count. # user_count = len(leaderboard) leaderboard.extend(query.filter(m.Person.rank.is_(None)).all()) user_to_rank = g.tahrirdb.make_leaderboard() if user: rank = user.rank or 0 idx = rank - 1 # Handle the case of leaderboard[-2:2] which will be [] always. if idx < 2: idx = 2 leaderboard = leaderboard[(idx - 2) : (idx + 3)] else: leaderboard = leaderboard[:limit] ret = [ {**user_to_rank[p], **{"nickname": p.nickname}} for p in leaderboard if p in user_to_rank ] return jsonify({"leaderboard": ret})