Files @ 21b24576ab09
Branch filter:

Location: C3L/C3L-Membership-Online-Form/c3l_membership/views.py

Dennis Fink
Make button full size and use correct css class
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)