Commit a4c03d8e24df344c33abe0dbdbeb5527e21439f6
1 parent
96ddf8ec
Exists in
master
Add the controller route to consult an estimation.
Also doubles as CSV generator.
Showing
1 changed file
with
66 additions
and
4 deletions
Show diff stats
flaskr/controllers/main_controller.py
1 | import importlib | 1 | import importlib |
2 | 2 | ||
3 | -from flask import Blueprint, render_template, flash, request, redirect, url_for | 3 | +from flask import Blueprint, render_template, flash, request, redirect, \ |
4 | + url_for, abort | ||
4 | 5 | ||
5 | from flaskr.extensions import cache | 6 | from flaskr.extensions import cache |
6 | from flaskr.forms import LoginForm, EstimateForm | 7 | from flaskr.forms import LoginForm, EstimateForm |
@@ -10,6 +11,7 @@ from flaskr.geocoder import CachedGeocoder | @@ -10,6 +11,7 @@ from flaskr.geocoder import CachedGeocoder | ||
10 | from flaskr.core import generate_unique_id | 11 | from flaskr.core import generate_unique_id |
11 | from flaskr.content import content | 12 | from flaskr.content import content |
12 | 13 | ||
14 | +# from io import StringIO | ||
13 | from yaml import safe_dump as yaml_dump | 15 | from yaml import safe_dump as yaml_dump |
14 | 16 | ||
15 | import sqlalchemy | 17 | import sqlalchemy |
@@ -33,7 +35,7 @@ def estimate(): | @@ -33,7 +35,7 @@ def estimate(): | ||
33 | id = generate_unique_id() | 35 | id = generate_unique_id() |
34 | 36 | ||
35 | estimation = Estimation() | 37 | estimation = Estimation() |
36 | - estimation.email = form.email.data | 38 | + # estimation.email = form.email.data |
37 | estimation.first_name = form.first_name.data | 39 | estimation.first_name = form.first_name.data |
38 | estimation.last_name = form.last_name.data | 40 | estimation.last_name = form.last_name.data |
39 | estimation.status = StatusEnum.pending | 41 | estimation.status = StatusEnum.pending |
@@ -45,7 +47,11 @@ def estimate(): | @@ -45,7 +47,11 @@ def estimate(): | ||
45 | db.session.commit() | 47 | db.session.commit() |
46 | 48 | ||
47 | flash("Estimation request submitted successfully.", "success") | 49 | flash("Estimation request submitted successfully.", "success") |
48 | - return redirect(url_for(".home")) | 50 | + return redirect(url_for( |
51 | + endpoint=".consult_estimation", | ||
52 | + public_id=estimation.public_id, | ||
53 | + format='html' | ||
54 | + )) | ||
49 | # return render_template("estimate-debrief.html", form=form) | 55 | # return render_template("estimate-debrief.html", form=form) |
50 | 56 | ||
51 | return render_template("estimate.html", form=form) | 57 | return render_template("estimate.html", form=form) |
@@ -58,7 +64,7 @@ def compute(): # process the queue of estimation requests | @@ -58,7 +64,7 @@ def compute(): # process the queue of estimation requests | ||
58 | return "<pre>%s</pre>" % _msg | 64 | return "<pre>%s</pre>" % _msg |
59 | 65 | ||
60 | def _handle_failure(_estimation, _failure_message): | 66 | def _handle_failure(_estimation, _failure_message): |
61 | - _estimation.status = StatusEnum.failed | 67 | + _estimation.status = StatusEnum.failure |
62 | _estimation.errors = _failure_message | 68 | _estimation.errors = _failure_message |
63 | db.session.commit() | 69 | db.session.commit() |
64 | 70 | ||
@@ -260,6 +266,62 @@ def compute(): # process the queue of estimation requests | @@ -260,6 +266,62 @@ def compute(): # process the queue of estimation requests | ||
260 | else: | 266 | else: |
261 | pass | 267 | pass |
262 | 268 | ||
269 | + # WRITE RESULTS INTO THE DATABASE ######################################### | ||
270 | + | ||
271 | + estimation.status = StatusEnum.success | ||
272 | + estimation.output_yaml = yaml_dump(results) | ||
273 | + db.session.commit() | ||
274 | + | ||
275 | + # FINALLY, RESPOND ######################################################## | ||
276 | + | ||
263 | response += yaml_dump(results) + "\n" | 277 | response += yaml_dump(results) + "\n" |
264 | 278 | ||
265 | return _respond(response) | 279 | return _respond(response) |
280 | + | ||
281 | + | ||
282 | +@main.route("/estimation/<public_id>.<format>") | ||
283 | +def consult_estimation(public_id, format): | ||
284 | + try: | ||
285 | + estimation = Estimation.query \ | ||
286 | + .filter_by(public_id=public_id) \ | ||
287 | + .one() | ||
288 | + except sqlalchemy.orm.exc.NoResultFound: | ||
289 | + return abort(404) | ||
290 | + except Exception as e: | ||
291 | + # TODO: log | ||
292 | + return abort(500) | ||
293 | + | ||
294 | + # allowed_formats = ['html'] | ||
295 | + # if format not in allowed_formats: | ||
296 | + # abort(404) | ||
297 | + | ||
298 | + if 'html' == format: | ||
299 | + if estimation.status in [StatusEnum.pending]: | ||
300 | + return render_template( | ||
301 | + "estimation-queue-wait.html", | ||
302 | + estimation=estimation | ||
303 | + ) | ||
304 | + else: | ||
305 | + return render_template( | ||
306 | + "estimation.html", | ||
307 | + estimation=estimation | ||
308 | + ) | ||
309 | + | ||
310 | + elif 'csv' == format: | ||
311 | + | ||
312 | + import csv | ||
313 | + from cStringIO import StringIO | ||
314 | + | ||
315 | + si = StringIO() | ||
316 | + cw = csv.writer(si, quoting=csv.QUOTE_ALL) | ||
317 | + cw.writerow([u"city", u"co2 (g)"]) | ||
318 | + | ||
319 | + results = estimation.get_output_dict() | ||
320 | + for city_name in results['mean_footprint']['cities'].keys(): | ||
321 | + cw.writerow([city_name, results['mean_footprint']['cities'][city_name]]) | ||
322 | + | ||
323 | + # Where are the headers? | ||
324 | + return si.getvalue().strip('\r\n') | ||
325 | + | ||
326 | + else: | ||
327 | + abort(404) |