From 141e949fa9f09e5f54acdfa90f609895236a8ac0 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 29 Aug 2019 23:08:26 +0200 Subject: make pretty --- talersurvey/survey/survey.py | 102 +++++++++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 33 deletions(-) (limited to 'talersurvey/survey/survey.py') diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index 79d0f16..1c6b8aa 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -48,14 +48,21 @@ LOGGER = logging.getLogger(__name__) # the merchant backend. # @return a flask-native response object. def backend_error(requests_response): - LOGGER.error("Backend error: status code: " - + str(requests_response.status_code)) + LOGGER.error( + "Backend error: status code: " + str(requests_response.status_code) + ) try: - return flask.jsonify(requests_response.json()), requests_response.status_code + return flask.jsonify( + requests_response.json() + ), requests_response.status_code except json.decoder.JSONDecodeError: - LOGGER.error("Backend error (NO JSON returned): status code: " - + str(requests_response.status_code)) - return flask.jsonify(dict(error="Backend died, no JSON got from it")), 502 + LOGGER.error( + "Backend error (NO JSON returned): status code: " + + str(requests_response.status_code) + ) + return flask.jsonify( + dict(error="Backend died, no JSON got from it") + ), 502 ## @@ -66,14 +73,15 @@ def backend_error(requests_response): def utility_processor(): def env(name, default=None): return os.environ.get(name, default) + def prettydate(talerdate): - parsed_time = re.search(r"/Date\(([0-9]+)\)/", talerdate) - if not parsed_time: - return "malformed date given" - parsed_time = int(parsed_time.group(1)) - timestamp = datetime.datetime.fromtimestamp(parsed_time) - # returns the YYYY-MM-DD date format. - return timestamp.strftime("%Y-%b-%d") + parsed_time = re.search(r"/Date\(([0-9]+)\)/", talerdate) + if not parsed_time: + return "malformed date given" + parsed_time = int(parsed_time.group(1)) + timestamp = datetime.datetime.fromtimestamp(parsed_time) + # returns the YYYY-MM-DD date format. + return timestamp.strftime("%Y-%b-%d") return dict(env=env, prettydate=prettydate) @@ -99,17 +107,26 @@ def err_abort(abort_status_code, **params): def backend_post(endpoint, json): headers = {"Authorization": "ApiKey " + APIKEY} try: - resp = requests.post(urljoin(BACKEND_URL, endpoint), json=json, headers=headers) + resp = requests.post( + urljoin(BACKEND_URL, endpoint), json=json, headers=headers + ) 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) + err_abort( + 500, + message="Could not parse response from backend", + status_code=resp.status_code + ) if resp.status_code != 200: - err_abort(500, message="Backend returned error status", - json=response_json, status_code=resp.status_code) + err_abort( + 500, + message="Backend returned error status", + json=response_json, + status_code=resp.status_code + ) return response_json @@ -123,7 +140,9 @@ def backend_post(endpoint, json): def backend_get(endpoint, params): headers = {"Authorization": "ApiKey " + APIKEY} try: - resp = requests.get(urljoin(BACKEND_URL, endpoint), params=params, headers=headers) + resp = requests.get( + urljoin(BACKEND_URL, endpoint), params=params, headers=headers + ) except requests.ConnectionError: err_abort(500, message="Could not establish connection to backend") try: @@ -131,8 +150,12 @@ def backend_get(endpoint, params): except ValueError: err_abort(500, message="Could not parse response from backend") if resp.status_code != 200: - err_abort(500, message="Backend returned error status", - json=response_json, status_code=resp.status_code) + err_abort( + 500, + message="Backend returned error status", + json=response_json, + status_code=resp.status_code + ) return response_json @@ -144,9 +167,11 @@ def backend_get(endpoint, params): # (and execution stack!). @app.errorhandler(Exception) def internal_error(e): - return flask.render_template("templates/error.html", - message="Internal error", - stack=traceback.format_exc()) + return flask.render_template( + "templates/error.html", + message="Internal error", + stack=traceback.format_exc() + ) ## @@ -156,8 +181,12 @@ def internal_error(e): @app.route("/favicon.ico") def favicon(): print("will look into: " + os.path.join(app.root_path, 'static')) - return flask.send_from_directory(os.path.join(app.root_path, 'static'), - "favicon.ico", mimetype="image/vnd.microsoft.ico") + return flask.send_from_directory( + os.path.join(app.root_path, 'static'), + "favicon.ico", + mimetype="image/vnd.microsoft.ico" + ) + ## # Give information about the tip reserve status. @@ -169,6 +198,7 @@ def survey_stats(): stats = backend_get("tip-query", dict(instance="default")) return flask.render_template("templates/survey_stats.html", stats=stats) + ## # Tell the backend to 'authorize' a tip; this means that # the backend will allocate a certain amount to be later @@ -179,17 +209,21 @@ def survey_stats(): # otherwise. @app.route("/submit-survey", methods=["POST"]) def submit_survey(): - tip_spec = dict(amount=CURRENCY + ":1.0", - next_url=os.environ.get("TALER_ENV_URL_INTRO", "https://taler.net/"), - instance="default", - justification="Payment methods survey") + tip_spec = dict( + amount=CURRENCY + ":1.0", + next_url=os.environ.get("TALER_ENV_URL_INTRO", "https://taler.net/"), + instance="default", + justification="Payment methods survey" + ) resp = backend_post("tip-authorize", tip_spec) if resp.get("tip_redirect_url"): return flask.redirect(resp["tip_redirect_url"]) - err_abort(500, message="Tipping failed, unexpected backend response", - json=resp) + err_abort( + 500, message="Tipping failed, unexpected backend response", json=resp + ) + ## # Serve the main index page. @@ -197,4 +231,6 @@ def submit_survey(): # @return response object of the index page. @app.route("/", methods=["GET"]) def index(): - return flask.render_template("templates/index.html", merchant_currency=CURRENCY) + return flask.render_template( + "templates/index.html", merchant_currency=CURRENCY + ) -- cgit v1.2.3 From 095aa94e9adfaf1c60260839782c741b40b10e8f Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 30 Aug 2019 14:13:23 +0200 Subject: mobile tipping --- talersurvey/survey/survey.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'talersurvey/survey/survey.py') diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index 1c6b8aa..e64de96 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -199,6 +199,12 @@ def survey_stats(): return flask.render_template("templates/survey_stats.html", stats=stats) +def get_qrcode_svg(data): + factory = qrcode.image.svg.SvgImage + img = qrcode.make(data, image_factory=factory) + return lxml.etree.tostring(img.get_image()).decode("utf-8") + + ## # Tell the backend to 'authorize' a tip; this means that # the backend will allocate a certain amount to be later @@ -215,10 +221,18 @@ def submit_survey(): instance="default", justification="Payment methods survey" ) - resp = backend_post("tip-authorize", tip_spec) - - if resp.get("tip_redirect_url"): - return flask.redirect(resp["tip_redirect_url"]) + backend_resp = backend_post("tip-authorize", tip_spec) + + taler_tip_uri = backend_resp.get("taler_tip_uri") + if taler_tip_uri: + qrcode_svg = get_qrcode_svg(taler_tip_uri) + content = flask.render_tempate( + "templates/show_tip.html", + qrcode_svg=qrcode_svg, + taler_tip_uri=taler_tip_uri, + ) + headers = {"Taler", taler_tip_uri} + return flask.Response(content, status=402, headers) err_abort( 500, message="Tipping failed, unexpected backend response", json=resp -- cgit v1.2.3 From 2f09f9049d1dca01dfe7c49fadf75c6eff321808 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 30 Aug 2019 14:14:30 +0200 Subject: deps and imports --- setup.py | 2 +- talersurvey/survey/survey.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'talersurvey/survey/survey.py') diff --git a/setup.py b/setup.py index fa132d6..01425ac 100755 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ setup( packages=find_packages(), install_requires=["Flask>=0.10", "jsmin"], test_suite="nose.collector", - tests_require=["mock", "nose", "requests", "uwsgi"], + tests_require=["mock", "nose", "requests", "uwsgi", "qrcode", "lxml"], package_data={ '': [ "survey/templates/*.html", diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index e64de96..076aa93 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -26,6 +26,9 @@ from urllib.parse import urljoin import flask import requests import traceback +import qrcode +import qrcode.image.svg +import lxml.etree from ..talerconfig import TalerConfig BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -- cgit v1.2.3 From 991e4c08cb5a5cb89557743e707041f97d55107f Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 30 Aug 2019 14:15:28 +0200 Subject: set headers correctly --- talersurvey/survey/survey.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'talersurvey/survey/survey.py') diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index 076aa93..7ac4efa 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -235,7 +235,7 @@ def submit_survey(): taler_tip_uri=taler_tip_uri, ) headers = {"Taler", taler_tip_uri} - return flask.Response(content, status=402, headers) + return flask.Response(content, status=402, headers=headers) err_abort( 500, message="Tipping failed, unexpected backend response", json=resp -- cgit v1.2.3 From 894c77695f9eca57390825b5894e3796b57454b0 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 30 Aug 2019 14:18:12 +0200 Subject: typo --- talersurvey/survey/survey.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'talersurvey/survey/survey.py') diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index 7ac4efa..76e2dbb 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -229,7 +229,7 @@ def submit_survey(): taler_tip_uri = backend_resp.get("taler_tip_uri") if taler_tip_uri: qrcode_svg = get_qrcode_svg(taler_tip_uri) - content = flask.render_tempate( + content = flask.render_template( "templates/show_tip.html", qrcode_svg=qrcode_svg, taler_tip_uri=taler_tip_uri, -- cgit v1.2.3 From 6caf873159bc7482771dc65e8f0bed28c89a65ef Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 30 Aug 2019 14:19:03 +0200 Subject: typo --- talersurvey/survey/survey.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'talersurvey/survey/survey.py') diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index 76e2dbb..14e2258 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -205,7 +205,7 @@ def survey_stats(): def get_qrcode_svg(data): factory = qrcode.image.svg.SvgImage img = qrcode.make(data, image_factory=factory) - return lxml.etree.tostring(img.get_image()).decode("utf-8") + return lxml.etree.tostring(img.get_image()).decode("utf-8") ## @@ -234,7 +234,7 @@ def submit_survey(): qrcode_svg=qrcode_svg, taler_tip_uri=taler_tip_uri, ) - headers = {"Taler", taler_tip_uri} + headers = {"Taler": taler_tip_uri} return flask.Response(content, status=402, headers=headers) err_abort( -- cgit v1.2.3