summaryrefslogtreecommitdiff
path: root/talermerchantdemos/donations/donations.py
diff options
context:
space:
mode:
Diffstat (limited to 'talermerchantdemos/donations/donations.py')
-rw-r--r--talermerchantdemos/donations/donations.py97
1 files changed, 42 insertions, 55 deletions
diff --git a/talermerchantdemos/donations/donations.py b/talermerchantdemos/donations/donations.py
index ea9612c..19f1372 100644
--- a/talermerchantdemos/donations/donations.py
+++ b/talermerchantdemos/donations/donations.py
@@ -31,19 +31,23 @@ import traceback
import urllib
from taler.util.talerconfig import TalerConfig, ConfigurationError
from urllib.parse import urljoin
-from ..httpcommon import backend_post, backend_get, fallback_404, self_localized
+from ..httpcommon import backend_post, backend_get, self_localized
import sys
if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
print("Python 3.6 or higher is required.")
- print("You are using Python {}.{}.".format(sys.version_info.major, sys.version_info.minor))
+ print(
+ "You are using Python {}.{}.".format(
+ sys.version_info.major, sys.version_info.minor
+ )
+ )
sys.exit(1)
LOGGER = logging.getLogger(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
-app = flask.Flask(__name__, template_folder=BASE_DIR)
+app = flask.Flask(__name__, template_folder="../templates", static_folder="../static")
app.debug = True
app.secret_key = base64.b64encode(os.urandom(64)).decode("utf-8")
@@ -56,23 +60,27 @@ except ConfigurationError as ce:
print(ce)
exit(1)
+BABEL_TRANSLATION_DIRECTORIES = "../translations"
+
app.config.from_object(__name__)
babel = Babel(app)
-LOGGER.info("Using translations from:" + ':'.join(list(babel.translation_directories)))
+LOGGER.info("Using translations from:" + ":".join(list(babel.translation_directories)))
translations = [str(translation) for translation in babel.list_translations()]
-if not 'en' in translations:
- translations.append('en')
-LOGGER.info("Operating with the following translations available: " + ' '.join(translations))
+if not "en" in translations:
+ translations.append("en")
+LOGGER.info(
+ "Operating with the following translations available: " + " ".join(translations)
+)
-app.jinja_env.globals.update(self_localized=self_localized)
+app.add_template_global(self_localized)
@babel.localeselector
def get_locale():
- parts = request.path.split('/', 2)
- if (2 >= len(parts)):
+ parts = request.path.split("/", 2)
+ if 2 >= len(parts):
# Totally unexpected path format, do not localize
return "en"
lang = parts[1]
@@ -100,10 +108,7 @@ def utility_processor():
# @param abort_status_code status code to return along the response.
# @param params _kw_ arguments to passed verbatim to the templating engine.
def err_abort(abort_status_code, **params):
- t = flask.render_template(
- "templates/error.html.j2",
- lang=get_locale(),
- **params)
+ t = flask.render_template("donations-error.html.j2", lang=get_locale(), **params)
flask.abort(flask.make_response(t, abort_status_code))
@@ -116,7 +121,7 @@ def err_abort(abort_status_code, **params):
# if something unexpected happens.
def backend_instanced_get(instance, endpoint, params):
backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/")
- return backend_get(backend_url, endpoint, params)
+ return backend_get(backend_url, endpoint, params, auth_token=APIKEY)
##
@@ -129,7 +134,7 @@ def backend_instanced_get(instance, endpoint, params):
# @return the backend response (JSON format).
def backend_instanced_post(instance, endpoint, json):
backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/")
- return backend_post(backend_url, endpoint, json)
+ return backend_post(backend_url, endpoint, json, auth_token=APIKEY)
##
@@ -153,32 +158,34 @@ def expect_parameter(name):
@app.errorhandler(Exception)
def internal_error(e):
return flask.render_template(
- "templates/error.html.j2",
+ "donations-error.html.j2",
message=gettext("Internal error"),
lang=get_locale(),
- stack=traceback.format_exc()
+ stack=traceback.format_exc(),
)
+
##
# Serve the /favicon.ico requests.
#
# @return the favicon.ico file.
@app.route("/favicon.ico")
def favicon():
- LOGGER.info("will look into: " + os.path.join(app.root_path, 'static'))
+ LOGGER.info("will look into: " + os.path.join(app.root_path, "static"))
return flask.send_from_directory(
- os.path.join(app.root_path, 'static'),
+ os.path.join(app.root_path, "static"),
"favicon.ico",
- mimetype="image/vnd.microsoft.ico"
+ mimetype="image/vnd.microsoft.ico",
)
+
##
# Serve the main index page, redirecting to /<lang>/
#
# @return response object of the index page.
@app.route("/")
def index():
- default = 'en'
+ default = "en"
target = flask.request.accept_languages.best_match(translations, default)
return flask.redirect("/" + target + "/", code=302)
@@ -190,22 +197,11 @@ def index():
@app.route("/<lang>/")
def start(lang):
return flask.render_template(
- "templates/index.html.j2",
- lang=lang,
- merchant_currency=CURRENCY
+ "donations-index.html.j2", lang=lang, merchant_currency=CURRENCY
)
##
-# Serve the "/javascript" page.
-#
-# @return response object for the /javascript page.
-@app.route("/javascript")
-def javascript_licensing():
- return flask.render_template("templates/javascript.html")
-
-
-##
# Serve the "/checkout" page. This page lets the
# user pick the payment method they want to use,
# and finally confirm the donation.
@@ -217,7 +213,7 @@ def checkout(lang):
donation_receiver = expect_parameter("donation_receiver")
donation_donor = expect_parameter("donation_donor")
return flask.render_template(
- "templates/checkout.html.j2",
+ "donations-checkout.html.j2",
donation_amount=amount,
donation_receiver=donation_receiver,
donation_donor=donation_donor,
@@ -232,11 +228,8 @@ def checkout(lang):
#
# @return response object about the mentioned impossibility.
@app.route("/<lang>/provider-not-supported")
-def provider_not_supported():
- return flask.render_template(
- "templates/provider-not-supported.html.j2",
- lang=lang
- )
+def provider_not_supported(lang):
+ return flask.render_template("donations-provider-not-supported.html.j2", lang=lang)
##
@@ -253,8 +246,7 @@ def donate(lang):
donation_donor = expect_parameter("donation_donor")
payment_system = expect_parameter("payment_system")
if payment_system != "taler":
- return flask.redirect(flask.url_for("provider_not_supported",
- lang=lang))
+ return flask.redirect(flask.url_for("provider_not_supported", lang=lang))
fulfillment_url = flask.url_for(
"fulfillment",
timestamp=str(time.time()),
@@ -266,9 +258,7 @@ def donate(lang):
order = dict(
amount=donation_amount,
extra=dict(
- donor=donation_donor,
- receiver=donation_receiver,
- amount=donation_amount
+ donor=donation_donor, receiver=donation_receiver, amount=donation_amount
),
fulfillment_url=fulfillment_url,
summary="Donation to {}".format(donation_receiver),
@@ -279,10 +269,9 @@ def donate(lang):
)
order_id = order_resp["order_id"]
return flask.redirect(
- flask.url_for("fulfillment",
- receiver=donation_receiver,
- lang=lang,
- order_id=order_id)
+ flask.url_for(
+ "fulfillment", receiver=donation_receiver, lang=lang, order_id=order_id
+ )
)
@@ -295,9 +284,8 @@ def donate(lang):
# page is returned; otherwise, the browser will be redirected
# to a page that accepts the payment.
@app.route("/<lang>/donation/<receiver>")
-def fulfillment(lang,receiver):
+def fulfillment(lang, receiver):
order_id = expect_parameter("order_id")
- pay_params = dict(order_id=order_id)
pay_status = backend_instanced_get(
receiver, f"private/orders/{order_id}", params=dict()
)
@@ -305,7 +293,7 @@ def fulfillment(lang,receiver):
if order_status == "paid":
extra = pay_status["contract_terms"]["extra"]
return flask.render_template(
- "templates/fulfillment.html.j2",
+ "donations-fulfillment.html.j2",
donation_receiver=extra["receiver"],
donation_amount=extra["amount"],
donation_donor=extra["donor"],
@@ -315,10 +303,9 @@ def fulfillment(lang,receiver):
)
return flask.redirect(pay_status["order_status_url"])
+
@app.errorhandler(404)
def handler(e):
return flask.render_template(
- "templates/error.html.j2",
- lang=get_locale(),
- message=gettext("Page not found")
+ "donations-error.html.j2", lang=get_locale(), message=gettext("Page not found")
)