Source code for tahrir.endpoints.invitations
from datetime import datetime
from flask import abort, g, jsonify
from ..app import csrf, oidc
from ..utils.user import get_person, need_access_user
from . import blueprint as bp
[docs]
@bp.route("/api/invitations/<string:invitation_id>/claim")
@csrf.exempt
@oidc.accept_token()
@need_access_user
def claim_invitation(invitation_id: str):
"""Action that awards a person a badge after scanning a qrcode."""
if not g.token_email:
return abort(401, "Unauthorized")
claim = g.tahrirdb.get_invitation(invitation_id)
if not claim:
abort(404, f"That invitation {invitation_id!r} does not exists.")
if claim.expires_on < datetime.now():
return abort(410, f"That invitation {invitation_id!r} is expired.")
# Check to see if the user already has the badge.
if g.tahrirdb.assertion_exists(claim.badge_id, g.token_person.email):
abort(422, f"You already have badge {claim.badge_id!r}")
g.tahrirdb.add_assertion(claim.badge_id, g.token_person.email, datetime.now())
return jsonify({"message": f"You have earned badge {claim.badge_id!r}"})
[docs]
@bp.route("/api/invitations/<string:user_id>", methods=["GET"])
def get_invitations(user_id: str):
"""Endpoint to list all invitations created by a given user."""
# TODO - Modify the endpoint to require authentication
# TODO - Remove the user_id path parameter requirement
person = get_person(user_id)
if not person:
return abort(404, f"User {user_id!r} not found")
invitations = g.tahrirdb.get_invitations(person_id=person.id)
if not invitations:
return abort(404, "No invitations available")
invitations_data = {}
for invitation in invitations:
badge = invitation.badge
if badge.id not in invitations_data:
invitations_data[badge.id] = {
"name": badge.name,
"image": badge.image,
"invitations": [],
}
invitations_data[badge.id]["invitations"].append(
{
"invitation_id": invitation.id,
"created_on": invitation.created_on.timestamp() if invitation.created_on else None,
"expires_on": invitation.expires_on.timestamp() if invitation.expires_on else None,
"expired": invitation.expired,
}
)
return jsonify(invitations_data)