Source code for tahrir.endpoints.assertions
from flask import abort, g, jsonify, request
from ..utils.avatar import hash_email
from . import blueprint as bp
[docs]
@bp.route("/api/assertions", methods=["GET"])
def get_recent_assertions():
"""Endpoint to fetch all recent assertions across all badges."""
begin = request.args.get("begin", 0, type=int)
limit = min(request.args.get("limit", 40, type=int), 40)
assertions = list(g.tahrirdb.get_all_assertions(begin, limit))
if not assertions:
return jsonify([])
result = []
for item in assertions:
item_data = item.as_dict()
item_data["person"] = item.person.as_dict()
item_data["person"].pop("email", None)
item_data["person"]["mail"] = hash_email(item.person.avatar)
item_data["issued_on"] = item.issued_on.timestamp()
item_data["badge"]["id"] = item.badge.id
result.append(item_data)
return jsonify(result)
[docs]
@bp.route("/api/assertions/<string:badge_id>", methods=["GET"])
def get_assertions_by_badge(badge_id: str):
"""Endpoint to fetch all assertions for a specific badge."""
assertions = g.tahrirdb.get_assertions_by_badge(badge_id)
if assertions is False:
return abort(404, f"No such badge {badge_id!r}")
if not assertions:
return jsonify([])
assertions = sorted(assertions, key=lambda assertion: assertion.issued_on)
# This is a very unoptimised implementation for achieving pagination.
# The implementation should have been there in the upstream `tahrir-api` at database level.
begin = request.args.get("begin", 0, type=int)
limit = request.args.get("limit", 100, type=int)
result = []
for assertion in assertions[begin : begin + (limit if limit < 100 else 100)]:
assertion_data = assertion.as_dict()
assertion_data.pop("badge", None) # Remove unwanted fields
assertion_data["person"] = assertion.person.as_dict() # Add user info
assertion_data["person"].pop("email", None) # Remove email field
assertion_data["person"]["mail"] = hash_email(assertion.person.avatar) # Add user avatar
assertion_data["issued_on"] = assertion.issued_on.timestamp()
result.append(assertion_data)
return jsonify(result)