amanuensis/amanuensis/server/lexicon/__init__.py

89 lines
2.3 KiB
Python

from flask import (
Blueprint,
flash,
redirect,
url_for,
g,
render_template,
Markup)
from flask_login import login_required, current_user
from amanuensis.lexicon import player_can_join_lexicon, add_player_to_lexicon
from amanuensis.parser import filesafe_title
from amanuensis.server.helpers import (
lexicon_param,
player_required_if_not_public)
from .forms import LexiconJoinForm
bp_lexicon = Blueprint('lexicon', __name__,
url_prefix='/lexicon/<name>',
template_folder='.')
@bp_lexicon.route("/join/", methods=['GET', 'POST'])
@lexicon_param
@login_required
def join(name):
if not g.lexicon.cfg.join.open:
flash("This game isn't open for joining")
return redirect(url_for('home.home'))
form = LexiconJoinForm()
if form.validate_on_submit():
# Gate on password if one is required
if (g.lexicon.cfg.join.password
and form.password.data != g.lexicon.cfg.join.password):
return redirect(url_for("lexicon.join", name=name))
# Gate on join validity
if player_can_join_lexicon(current_user, g.lexicon, form.password.data):
add_player_to_lexicon(current_user, g.lexicon)
return redirect(url_for('session.session', name=name))
else:
flash("Could not join game")
return redirect(url_for("home.home", name=name))
return render_template('lexicon.join.jinja', form=form)
@bp_lexicon.route('/contents/', methods=['GET'])
@lexicon_param
@player_required_if_not_public
def contents(name):
articles = []
filenames = g.lexicon.ctx.article.ls()
for filename in filenames:
with g.lexicon.ctx.article.read(filename) as a:
articles.append({
'title': a.title,
'link': url_for('lexicon.article',
name=name,
title=filesafe_title(a.title)),
})
return render_template('lexicon.contents.jinja', articles=articles)
@bp_lexicon.route('/article/<title>')
@lexicon_param
@player_required_if_not_public
def article(name, title):
with g.lexicon.ctx.article.read(title) as a:
article = {**a, 'html': Markup(a['html'])}
return render_template('lexicon.article.jinja', article=article)
@bp_lexicon.route('/rules/', methods=['GET'])
@lexicon_param
@player_required_if_not_public
def rules(name):
return render_template('lexicon.rules.jinja')
@bp_lexicon.route('/statistics/', methods=['GET'])
@lexicon_param
@player_required_if_not_public
def stats(name):
return render_template('lexicon.statistics.jinja')