import re import subprocess from datetime import date import requests from flask import Blueprint, current_app, g, render_template, request from flask_babel import gettext from flask_weasyprint import HTML, render_pdf from .forms import MembershipForm from .utils import calculate_age root_page = Blueprint("root", __name__, url_prefix="/") xml_template = "{name}{birthday:%d.%m.%Y}
{address}
{username}{email}{status}{voting}
" @root_page.url_defaults def add_lang_code(endpoint, values): values.setdefault("lang_code", g.lang_code) @root_page.url_value_preprocessor def pull_lang_code(endpoint, values): lang_code = values.pop("lang_code") if lang_code != "favicon.ico": g.lang_code = lang_code @root_page.route("/", methods=("GET", "POST")) def index(): form = MembershipForm() choices = [ ("cash", gettext("by cash")), ("wire transfer", gettext("by wire transfer")), ] if current_app.config["DIGICASH_ENABLED"]: choices.append(("digicash", gettext("by DigiCash/Payconiq"))) if current_app.config["SATISPAY_ENABLED"]: choices.append(("satispay", gettext("by Satispay"))) choices.extend( (cryptocurrency_label, " ".join((gettext("by"), cryptocurrency_label.title()))) for cryptocurrency_label, options in current_app.config[ "CRYPTOCURRENCIES" ].items() if options["ENABLED"] ) form.payment.choices = choices if form.validate_on_submit(): if form.birthday.data: if calculate_age(form.birthday.data) < 18: form.minor_member.data = True form.student.data = True else: form.minor_member.data = False if ( form.minor_member.data or form.student.data or form.membership.data == "supporting" ): price = current_app.config["SUPPORTING_FEE"] elif form.starving.data: price = 1 else: price = current_app.config["REGULAR_FEE"] if form.starving.data: status = "Starving" elif form.minor_member.data or form.student.data: status = "Student" elif form.membership.data == "supporting": status = "Supporter" else: status = "Regular" if form.payment.data in current_app.config["CRYPTOCURRENCIES"]: try: current_conversion_r = requests.get( current_app.config["CONVERSION_URL"], timeout=30 ) current_conversion_r.raise_for_status() except: return render_template("index.html", form=form, crypto_error=True), 503 else: current_conversion = current_conversion_r.json() commodity = current_app.config["CRYPTOCURRENCIES"][form.payment.data][ "COMMODITY" ] price = current_conversion[commodity][status.upper()] elif form.payment.data in ("digicash", "satispay"): price = price * 100 today = date.today() xml_data = { "status": status, "name": form.fullname.data, "birthday": form.birthday.data if form.birthday.data is not None else date(9999, 12, 12), "username": form.username.data, "email": form.email.data, "address": re.sub( "\s+", " ", " ".join( ( form.street.data, form.zip.data, form.city.data, form.state.data, form.country.data, ) ), ), "voting": 1 if form.membership.data == "regular" else 0, "date": today, } html = render_template( "member.html", form=form, price=price, year=today.year, voting=True if form.membership.data == "regular" else False, xml=xml_template.format(**xml_data), ) return render_pdf( HTML(string=html), download_filename=f"C3L_Membership_{form.username.data}.pdf", ) return render_template("index.html", form=form, crypto_error=False)