bitvend/bitvend/views.py

120 lines
3.1 KiB
Python

from flask import Blueprint, render_template, redirect, request, flash, url_for, jsonify
from flask import current_app as app
import six
import qrcode
import qrcode.image.svg
from bitvend import dev, proc
from bitvend.models import db, User, Transaction, NoFunds
from bitvend.forms import TransferForm
from bitvend.graphs import gen_main_graph
from bitvend.stats import hall_of_shame, hall_of_addicts, bottles_purchased
from spaceauth import login_required, current_user, cap_required
bp = Blueprint("bitvend", __name__, template_folder="templates")
@bp.route("/")
def index():
transactions = []
if current_user.is_authenticated:
transactions = current_user.transactions.order_by(
Transaction.created.desc()
).limit(10)
return render_template(
"index.html",
items=app.config["ITEMS"],
transactions=transactions,
transfer_form=TransferForm(),
hallofshame=hall_of_shame(),
hallofaddicts=hall_of_addicts(),
hallofaddicts_30d=hall_of_addicts(window=24 * 30),
bottles_purchased=bottles_purchased(),
)
@bp.route("/transactions/", defaults={"page": 1})
@bp.route("/transactions/p/<int:page>")
def transactions(page):
return render_template(
"transactions.html", transactions=current_user.transactions.paginate(page)
)
@bp.route("/transfer", methods=["GET", "POST"])
def transfer():
transfer_form = TransferForm()
if transfer_form.validate_on_submit():
try:
current_user.transfer(
User.query.get(transfer_form.target.data), transfer_form.amount.data
)
db.session.commit()
flash("Transfer succeeded.", "success")
except NoFunds:
flash("No funds.", "danger")
return redirect(url_for(".index"))
flash("; ".join(sum(transfer_form.errors.values(), [])), "danger")
return redirect(url_for(".index"))
@bp.route("/begin")
@login_required
def begin():
if Transaction.query.filter(Transaction.finished == False).count():
flash("Nope xD", "danger")
return redirect(url_for(".index"))
if current_user.amount_available <= 0:
flash("Nope xD", "danger")
return redirect(url_for(".index"))
tx = Transaction(type="purchase")
current_user.transactions.append(tx)
db.session.commit()
dev.begin_session(current_user.amount_available, tx.id)
return redirect(url_for(".index"))
@bp.route("/cancel")
@login_required
def cancel():
dev.cancel_session()
# FIXME racey
Transaction.query.filter(Transaction.finished == False).delete()
db.session.commit()
return redirect(url_for(".index"))
@bp.route("/qrcode/<path:data>")
def qrcode_gen(data):
bio = six.BytesIO()
qr = qrcode.QRCode(border=0, box_size=50)
qr.add_data(data)
img = qr.make_image(image_factory=qrcode.image.svg.SvgPathFillImage)
img.save(bio)
return (
bio.getvalue(),
200,
{
"Content-Type": "image/svg+xml",
"Cache-Control": "public,max-age=3600",
},
)
@bp.route("/api/1/history.json")
def history():
return jsonify(gen_main_graph())