Source code for tahrir.views.badge
from datetime import datetime, timezone
from feedgen.feed import FeedGenerator
from flask import abort, flash, g, redirect, request, url_for
from tahrir.utils.avatar import get_avatar
from tahrir.utils.badge import get_badge_or_404
from . import blueprint as bp
[docs]
@bp.route("/badge/<badge_id>/rss")
def badge_rss(badge_id):
"""Render per-badge rss."""
badge = get_badge_or_404(badge_id)
# this gives us the assertions sorted *earliest first*. feedgen's
# default when adding entries is to prepend - put the new item at
# the top of the feed. so as we iterate over this and add items to
# the feed, we add each newer assertion to the front of the feed
sorted_assertions = sorted(badge.assertions, key=lambda x: x.issued_on)
feed = FeedGenerator()
feed.title(f"Badges Feed for {badge.name}")
feed.link(href=url_for("tahrir.badge", badge_id=badge.id, _external=True), rel="self")
feed.subtitle(f"Latest recipients of the badge {badge.name}")
feed.language("en")
description_template = "<img src='%s' alt='%s' />%s"
for assertion in sorted_assertions:
url = url_for(
"tahrir.user", user_id=assertion.person.nickname or assertion.person.id, _external=True
)
entry = feed.add_entry()
entry.title(assertion.person.nickname)
entry.link(href=url)
pubdate = assertion.issued_on.replace(tzinfo=timezone.utc)
entry.published(pubdate)
entry.description(
description_template
% (
get_avatar(assertion.person.avatar, 128),
assertion.person.nickname,
assertion.person.nickname,
)
)
return feed.rss_str(pretty=True), {
"content-type": "application/rss+xml",
"charset": "utf-8",
}
# delegated admin endpoints
[docs]
@bp.route("/award", methods=["POST"])
def award():
badge_id = request.form.get("badge_id")
badge = g.tahrirdb.get_badge(badge_id)
if not badge:
abort(404, f"No such badge {badge_id!r}")
if not badge.authorized(g.oidc_user.person):
abort(403, f"Unauthorized for {badge_id!r}")
nickname = request.form.get("nickname")
user = g.tahrirdb.get_person(nickname=nickname)
if not user or user.opt_out:
abort(404, f"No such user {nickname!r}")
if g.tahrirdb.assertion_exists(badge.id, user.email):
flash(f"User {user.nickname} already has the {badge.id} badge")
else:
g.tahrirdb.add_assertion(badge.id, user.email, None)
flash(f"User {user.nickname} has been awarded the {badge.id} badge")
# COMMENT
return redirect(url_for("tahrir.badge", badge_id=badge.id))
[docs]
@bp.route("/invite", methods=["POST"])
def invite():
agent = g.oidc_user.person
badge_id = request.form.get("badge_id")
badge = g.tahrirdb.get_badge(badge_id)
if not badge:
abort(404, f"No such badge {badge_id!r}")
if not badge.authorized(agent):
abort(403, f"Unauthorized for {badge_id!r}")
try:
fmt = "%Y-%m-%d %H:%M"
expires_on = datetime.strptime(request.form.get("expires-on"), fmt)
except ValueError:
expires_on = None # Will default to 1 hour from now
# OK
g.tahrirdb.add_invitation(badge.id, expires_on=expires_on, created_by_email=agent.email)
return redirect(url_for("tahrir.home"))