Files
@ 21b24576ab09
Branch filter:
Location: C3L/C3L-Membership-Online-Form/c3l_membership/views.py
21b24576ab09
4.6 KiB
text/x-python
Make button full size and use correct css class
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 142 143 144 145 146 147 | 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
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():
today = date.today()
if form.birthday.data:
born = form.birthday.data
try:
birthday = born.replace(year=today.year)
except ValueError:
birthday = born.replace(year=today.year, month=born.month + 1, day=1)
age = today.year - born.year
if birthday > today:
age -= 1
if age < 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
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))
return render_template("index.html", form=form, crypto_error=False)
|