diff options
author | Florian Dold <florian.dold@gmail.com> | 2018-01-18 18:32:45 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2018-01-18 18:50:48 +0100 |
commit | 62118eb9531e11c38cc6cebb1cc2f7255d755ffc (patch) | |
tree | d31df3bcead5048202a64da40306fb3fee0e4799 /talersurvey/survey/survey.py | |
parent | 13425b472be2b693a2847b8190185eee1b1b2710 (diff) | |
download | survey-62118eb9531e11c38cc6cebb1cc2f7255d755ffc.tar.gz survey-62118eb9531e11c38cc6cebb1cc2f7255d755ffc.tar.bz2 survey-62118eb9531e11c38cc6cebb1cc2f7255d755ffc.zip |
use new tipping API, fix various little things
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"]) |