diff options
Diffstat (limited to 'talersurvey/survey/survey.py')
-rw-r--r-- | talersurvey/survey/survey.py | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index 6c2f4c8..d068f66 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -48,55 +48,53 @@ def backend_error(requests_response): @app.context_processor def utility_processor(): - - def join_urlparts(*parts): - ret = "" - part = 0 - while part < len(parts): - buf = parts[part] - part += 1 - if ret.endswith("/"): - buf = buf.lstrip("/") - elif ret and not buf.startswith("/"): - buf = "/" + buf - ret += buf - return ret - - def url(my_url): - return join_urlparts(flask.request.script_root, my_url) def env(name, default=None): return os.environ.get(name, default) return dict(url=url, env=env) -@app.route("/tip-pickup", methods=["POST"]) -def pick(): - request_body = flask.request.get_json() - resp = requests.post(urljoin(BACKEND_URL, "tip-pickup"), - json=request_body) +def err_abort(abort_status_code, **params): + t = flask.render_template("templates/error.html", **params) + flask.abort(flask.make_response(t, abort_status_code)) + + +def backend_post(endpoint, json): + try: + resp = requests.post(urljoin(BACKEND_URL, endpoint), json=json) + except requests.ConnectionError: + err_abort(500, message="Could not establish connection to backend") + try: + response_json = resp.json() + except ValueError: + err_abort(500, message="Could not parse response from backend", + status_code=resp.status_code) if resp.status_code != 200: - return backend_error(resp) - response_body = resp.json() - return flask.jsonify(response_body) + err_abort(500, message="Backend returned error status", + json=response_json, status_code=resp.status_code) + return response_json + + +@app.errorhandler(Exception) +def internal_error(e): + return flask.render_template("templates/error.html", + message="Internal error", + stack=traceback.format_exc()) + @app.route("/submit-survey", methods=["POST"]) def submit_survey(): tip_spec = dict(pickup_url=urljoin(flask.request.base_url, "/tip-pickup"), - amount=Amount(CURRENCY, 1).dump(), + amount=CURRENCY + ":1.0", next_url=os.environ.get("TALER_ENV_URL_INTRO", "https://taler.net/"), instance="default", justification="Payment methods survey") - resp = requests.post(urljoin(BACKEND_URL, "tip-authorize"), - json=tip_spec) - if resp.status_code != 200: - return backend_error(resp) + resp = backend_post("tip-authorize", tip_spec) - response = flask.make_response( - flask.render_template("templates/wait.html", success=True), - 402) - response.headers["X-Taler-Tip"] = resp.json()["tip_token"] + if resp.get("tip_redirect_url"): + flask.redirect(resp["tip_redirect_url"] - return response + err_abort(500, message="Tipping failed, unexpected backend response", + json=resp) @app.route("/", methods=["GET"]) |