Files
@ 15ae859b8261
Branch filter:
Location: C3L/C3L-Membership-Online-Form/c3l_membership/views.py
15ae859b8261
4.5 KiB
text/x-python
Update dependencies and fix PDF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | 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="/<lang_code>")
xml_template = "<member><numm>{name}</numm><gebuertsdag>{birthday:%d.%m.%Y}</gebuertsdag><address>{address}</address><nick>{username}</nick><email>{email}</email><status>{status}</status><stemmrecht>{voting}</stemmrecht></member>"
@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:
minor_member = True
form.student.data = True
else:
minor_member = False
if minor_member 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 minor_member 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),
minor_member=minor_member,
)
if current_app.debug:
return render_pdf(HTML(string=html))
else:
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)
|