Files @ 401cab1bcd6c
Branch filter:

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

Dennis Fink
Begin typing annotations
587a9a50643f
6f06fc328a13
6f06fc328a13
401cab1bcd6c
6f06fc328a13
ade19bdcb84a
401cab1bcd6c
805cb46ada9a
6f06fc328a13
6f06fc328a13
6f06fc328a13
001f20e494f4
6f06fc328a13
4005eddcc559
6f06fc328a13
587a9a50643f
587a9a50643f
6f06fc328a13
4005eddcc559
401cab1bcd6c
4005eddcc559
4005eddcc559
4005eddcc559
4005eddcc559
401cab1bcd6c
8e2c954d832f
8e2c954d832f
8e2c954d832f
4005eddcc559
4005eddcc559
6f06fc328a13
401cab1bcd6c
6f06fc328a13
7cf7d1e162a4
805cb46ada9a
805cb46ada9a
805cb46ada9a
805cb46ada9a
7cf7d1e162a4
10cfc4437178
568ea5d76267
10cfc4437178
bcd9fd777f07
bcd9fd777f07
bcd9fd777f07
dbf7ee7956eb
dbf7ee7956eb
dbf7ee7956eb
dbf7ee7956eb
dbf7ee7956eb
dbf7ee7956eb
dbf7ee7956eb
10cfc4437178
7cf7d1e162a4
7cf7d1e162a4
6f06fc328a13
6f06fc328a13
0b4955bdc703
001f20e494f4
68ea3e6dd3a6
0b4955bdc703
0b4955bdc703
68ea3e6dd3a6
0b4955bdc703
ed73d84e572c
ed73d84e572c
ed73d84e572c
7cf7d1e162a4
34a737f6fb8d
34a737f6fb8d
b314c40f5920
b314c40f5920
b314c40f5920
52127f437376
ade19bdcb84a
68ea3e6dd3a6
ade19bdcb84a
587a9a50643f
ade19bdcb84a
587a9a50643f
ade19bdcb84a
587a9a50643f
10cfc4437178
ade19bdcb84a
53bbd1295ee2
53bbd1295ee2
53bbd1295ee2
ade19bdcb84a
ade19bdcb84a
53bbd1295ee2
ade19bdcb84a
ade19bdcb84a
ade19bdcb84a
ade19bdcb84a
ade19bdcb84a
ade19bdcb84a
bcd9fd777f07
6f06fc328a13
6f06fc328a13
001f20e494f4
81d8f0641a9c
81d8f0641a9c
81d8f0641a9c
81d8f0641a9c
81d8f0641a9c
81d8f0641a9c
81d8f0641a9c
81d8f0641a9c
262323080d4e
262323080d4e
262323080d4e
262323080d4e
262323080d4e
262323080d4e
c4c5ab9a2bb8
262323080d4e
262323080d4e
262323080d4e
262323080d4e
262323080d4e
81d8f0641a9c
81d8f0641a9c
0b4955bdc703
81d8f0641a9c
6f06fc328a13
587a9a50643f
81d8f0641a9c
81d8f0641a9c
81d8f0641a9c
0b4955bdc703
de9af48b4e60
81d8f0641a9c
68ea3e6dd3a6
587a9a50643f
15ae859b8261
15ae859b8261
15ae859b8261
15ae859b8261
15ae859b8261
15ae859b8261
15ae859b8261
15ae859b8261
53bbd1295ee2
import re
import subprocess
from datetime import date
from typing import Any, Dict, Optional, cast

import requests
from flask import Blueprint, Response, 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: Any, values: Dict[str, Any]) -> None:
    values.setdefault("lang_code", g.lang_code)


@root_page.url_value_preprocessor
def pull_lang_code(endpoint: Optional[str], values: Optional[Dict[Any, Any]]) -> None:
    lang_code = values.pop("lang_code")
    if lang_code != "favicon.ico":
        g.lang_code = lang_code


@root_page.route("/", methods=("GET", "POST"))
def index() -> Response:
    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"
        ) and not form.starving.data:
            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.postal.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)