Files
@ 401cab1bcd6c
Branch filter:
Location: C3L/C3L-Membership-Online-Form/c3l_membership/__init__.py - annotation
401cab1bcd6c
2.3 KiB
text/x-python
Begin typing annotations
7cf7d1e162a4 6f06fc328a13 6f06fc328a13 7cf7d1e162a4 83d7cbad018a 401cab1bcd6c 6f06fc328a13 401cab1bcd6c 83d7cbad018a 4005eddcc559 6f06fc328a13 6f06fc328a13 6f06fc328a13 4005eddcc559 83d7cbad018a 6f06fc328a13 6f06fc328a13 401cab1bcd6c 6f06fc328a13 6f06fc328a13 6f06fc328a13 9b37bb918b8a 9b37bb918b8a 9b37bb918b8a 9b37bb918b8a 9b37bb918b8a 7f4b23cdb141 6f06fc328a13 7cf7d1e162a4 6f06fc328a13 6f06fc328a13 6f06fc328a13 6f06fc328a13 4005eddcc559 6f06fc328a13 7cf7d1e162a4 7cf7d1e162a4 4005eddcc559 7cf7d1e162a4 7cf7d1e162a4 7cf7d1e162a4 7cf7d1e162a4 7cf7d1e162a4 bcd9fd777f07 10cfc4437178 6f06fc328a13 4005eddcc559 401cab1bcd6c 4005eddcc559 4005eddcc559 4005eddcc559 4005eddcc559 6f06fc328a13 6f06fc328a13 6f06fc328a13 6f06fc328a13 4005eddcc559 401cab1bcd6c 4005eddcc559 4005eddcc559 4005eddcc559 83d7cbad018a 83d7cbad018a 6f06fc328a13 6f06fc328a13 6f06fc328a13 83d7cbad018a 401cab1bcd6c 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 401cab1bcd6c 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 83d7cbad018a 401cab1bcd6c 83d7cbad018a 83d7cbad018a 83d7cbad018a 6f06fc328a13 | import base64
import json
import os.path
import secrets
import subprocess
from typing import Any
from flask import Flask, Response, g, redirect, request, url_for
from flask.cli import AppGroup
from flask_babel import Babel
from flask_qrcode import QRcode
qrcode = QRcode()
babel = Babel()
babel_cli = AppGroup("babel")
def create_app() -> Flask:
app = Flask(__name__)
config_file = (
os.path.abspath("config.json")
if app.debug
else os.path.abspath("/etc/membership.json")
)
try:
app.config.from_file(config_file, load=json.load)
except FileNotFoundError:
pass
qrcode.init_app(app)
babel.init_app(app)
_default_secret_key = base64.b64encode(secrets.token_bytes()).decode("utf-8")
app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY", _default_secret_key)
app.config["LANGUAGES"] = ["en", "de", "fr", "lb"]
app.config.setdefault("SUPPORTING_FEE", 40)
app.config.setdefault("REGULAR_FEE", 120)
app.config.setdefault("DIGICASH_ENABLED", True)
app.config.setdefault("SATISPAY_ENABLED", True)
app.config.setdefault("CRYPTOCURRENCIES", dict())
@babel.localeselector
def get_locale() -> Any:
if not g.get("lang_code", None):
g.lang_code = request.accept_languages.best_match(app.config["LANGUAGES"])
return g.lang_code
from .views import root_page
app.register_blueprint(root_page)
@app.route("/")
def home() -> Response:
g.lang_code = request.accept_languages.best_match(app.config["LANGUAGES"])
return redirect(url_for("root.index"))
app.cli.add_command(babel_cli)
return app
@babel_cli.command("extract")
def babel_extract() -> None:
subprocess.run(
[
"pybabel",
"extract",
"-F",
"babel.cfg",
"-k",
"lazy_gettext",
"-o",
"messages.pot",
".",
]
)
@babel_cli.command("update")
def babel_update() -> None:
subprocess.run(
["pybabel", "update", "-i", "messages.pot", "-d", "c3l_membership/translations"]
)
@babel_cli.command("compile")
def babel_compile() -> None:
subprocess.run(["pybabel", "compile", "-d", "c3l_membership/translations"])
app = create_app()
|