summaryrefslogtreecommitdiff
path: root/talermerchantdemos/donations
diff options
context:
space:
mode:
Diffstat (limited to 'talermerchantdemos/donations')
-rw-r--r--talermerchantdemos/donations/donations.py58
1 files changed, 44 insertions, 14 deletions
diff --git a/talermerchantdemos/donations/donations.py b/talermerchantdemos/donations/donations.py
index 01e8f12..1a95f45 100644
--- a/talermerchantdemos/donations/donations.py
+++ b/talermerchantdemos/donations/donations.py
@@ -20,16 +20,18 @@
import base64
import logging
import flask
-from flask import request
+import uwsgi
+from flask import request, url_for
from flask_babel import Babel
from flask_babel import refresh
from flask_babel import force_locale
from flask_babel import gettext
+from werkzeug.middleware.proxy_fix import ProxyFix
import os
import time
import traceback
import urllib
-from taler.util.talerconfig import TalerConfig, ConfigurationError
+from ..util.talerconfig import TalerConfig, ConfigurationError
from urllib.parse import urljoin
from ..httpcommon import backend_post, backend_get, make_utility_processor, get_locale
import sys
@@ -43,19 +45,20 @@ if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
)
sys.exit(1)
+logging.basicConfig()
LOGGER = logging.getLogger(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
app = flask.Flask(__name__, template_folder="../templates", static_folder="../static")
+app.wsgi_app = ProxyFix(app.wsgi_app, x_host=1, x_prefix=1)
app.debug = True
app.secret_key = base64.b64encode(os.urandom(64)).decode("utf-8")
-TC = TalerConfig.from_env()
try:
- BACKEND_BASE_URL = TC["frontends"]["backend"].value_string(required=True)
- CURRENCY = TC["taler"]["currency"].value_string(required=True)
- APIKEY = TC["frontends"]["backend_apikey"].value_string(required=True)
+ BACKEND_BASE_URL = uwsgi.opt["backend_url"].decode("utf-8")
+ CURRENCY = uwsgi.opt["currency"].decode("utf-8")
+ APIKEY = uwsgi.opt["apikey"].decode("utf-8")
except ConfigurationError as ce:
print(ce)
exit(1)
@@ -68,6 +71,8 @@ babel.localeselector(get_locale)
LOGGER.info("Using translations from:" + ":".join(list(babel.translation_directories)))
+LOGGER.info("backend: " + BACKEND_BASE_URL)
+LOGGER.info("currency: " + CURRENCY)
translations = [str(translation) for translation in babel.list_translations()]
if not "en" in translations:
translations.append("en")
@@ -77,7 +82,7 @@ LOGGER.info(
# Add context processor that will make additional variables
# and functions available in the template.
-app.context_processor(make_utility_processor("donations"))
+app.context_processor(make_utility_processor("donations", os.environ.get ("TALER_ENV_URL_MERCHANT_DONATIONS")))
##
# Return a error response to the client.
@@ -134,7 +139,10 @@ def expect_parameter(name):
# (and execution stack!).
@app.errorhandler(Exception)
def internal_error(e):
- return flask.render_template("donations-error.html.j2", message=str(e))
+ return flask.render_template(
+ "donations-error.html.j2",
+ page_title=gettext("GNU Taler Demo: Error"),
+ message=str(e))
##
# Serve the /favicon.ico requests.
@@ -158,7 +166,7 @@ def favicon():
def index():
default = "en"
target = flask.request.accept_languages.best_match(translations, default)
- return flask.redirect("/" + target + "/", code=302)
+ return flask.redirect(url_for ('index') + target + "/", code=302)
##
@@ -167,7 +175,21 @@ def index():
# @return response object of the index page.
@app.route("/<lang>/")
def start(lang):
- return flask.render_template("donations-index.html.j2", merchant_currency=CURRENCY)
+
+ # get_locale defaults to english, hence the
+ # condition below happens only when lang is
+ # wrong or unsupported, respond 404.
+ if lang != get_locale():
+ err_abort(
+ 404,
+ message=f"Language {lang} not found",
+ )
+
+ return flask.render_template(
+ "donations-index.html.j2",
+ page_title=gettext("GNU Taler Demo: Donations"),
+ merchant_currency=CURRENCY
+ )
##
@@ -183,6 +205,7 @@ def checkout(lang):
donation_donor = expect_parameter("donation_donor")
return flask.render_template(
"donations-checkout.html.j2",
+ page_title=gettext("GNU Taler Demo: Donations checkout"),
donation_amount=amount,
donation_receiver=donation_receiver,
donation_donor=donation_donor,
@@ -197,7 +220,10 @@ def checkout(lang):
# @return response object about the mentioned impossibility.
@app.route("/<lang>/provider-not-supported")
def provider_not_supported(lang):
- return flask.render_template("donations-provider-not-supported.html.j2")
+ return flask.render_template(
+ "donations-provider-not-supported.html.j2",
+ page_title=gettext("GNU Taler Demo: Donations"),
+)
##
@@ -214,7 +240,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"))
+ return flask.redirect(flask.url_for("provider_not_supported", lang=lang))
fulfillment_url = flask.url_for(
"fulfillment",
timestamp=str(time.time()),
@@ -230,7 +256,8 @@ def donate(lang):
),
fulfillment_url=fulfillment_url,
summary="Donation to {}".format(donation_receiver),
- wire_transfer_deadline=dict(t_ms=1000 * int(time.time() + 15 * 30)),
+ wire_transfer_deadline=dict(t_s=int(time.time() + 10)),
+ minimum_age = 16
)
order_resp = backend_instanced_post(
donation_receiver, "private/orders", dict(order=order)
@@ -269,6 +296,7 @@ def fulfillment(lang, receiver):
extra = pay_status["contract_terms"]["extra"]
return flask.render_template(
"donations-fulfillment.html.j2",
+ page_title=gettext("GNU Taler Demo: Donations"),
donation_receiver=extra["receiver"],
donation_amount=extra["amount"],
donation_donor=extra["donor"],
@@ -281,5 +309,7 @@ def fulfillment(lang, receiver):
@app.errorhandler(404)
def handler(e):
return flask.render_template(
- "donations-error.html.j2", message=gettext("Page not found")
+ "donations-error.html.j2",
+ page_title=gettext("GNU Taler Demo: Error"),
+ message=gettext("Page not found")
)