Source code for tahrir.views.invitation
from datetime import datetime, timezone
from io import BytesIO
from urllib.parse import quote_plus
import qrcode as qrcode_module
from flask import abort, flash, g, redirect, request, url_for
from . import blueprint as bp
[docs]
@bp.route("/invitations/<claim_id>/claim")
def invitation_claim(claim_id):
"""Action that awards a person a badge after scanning a qrcode."""
claim = g.tahrirdb.get_invitation(claim_id)
if claim.expires_on < datetime.now():
return abort(410, "That invitation is expired.")
email = g.oidc_user.email
if not email:
return redirect(f"{url_for('oidc_auth.login')}?next={quote_plus(request.url)}")
# Check to see if the user already has the badge.
if g.tahrirdb.assertion_exists(claim.badge_id, g.oidc_user.person.email):
flash(f"You already have {claim.badge_id} badge")
else:
g.tahrirdb.add_assertion(
claim.badge_id, g.oidc_user.person.email, datetime.now(timezone.utc)
)
flash(f"You have earned {claim.badge_id} badge. Your rank will be updated shortly.")
# TODO -- return them to a page that auto-exports their badges.
return redirect(url_for("tahrir.home"))
[docs]
@bp.route("/invitations/<claim_id>/qrcode")
def invitation_qrcode(claim_id):
"""Returns a raw dummy qrcode through to the user."""
claim = g.tahrirdb.get_invitation(claim_id)
if claim.expires_on < datetime.now():
return abort(410, "That invitation is expired.")
target = url_for("tahrir.invitation_claim", claim_id=claim_id, _external=True)
img = qrcode_module.make(target)
bytestream = BytesIO()
img.save(bytestream)
return bytestream.getvalue(), {
"content-type": "image/png",
}