summaryrefslogtreecommitdiff
path: root/talersurvey/survey/survey.py
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2018-01-18 18:32:45 +0100
committerFlorian Dold <florian.dold@gmail.com>2018-01-18 18:50:48 +0100
commit62118eb9531e11c38cc6cebb1cc2f7255d755ffc (patch)
treed31df3bcead5048202a64da40306fb3fee0e4799 /talersurvey/survey/survey.py
parent13425b472be2b693a2847b8190185eee1b1b2710 (diff)
downloadsurvey-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.py66
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"])