Commit 67f85bce4211117eaf1dcdf4c19c6b7c5e9d9e80

Authored by Antoine Goutenoir
1 parent 4c745e05
Exists in master

Generate a CSV file with the scaling laws for each model.

/spend 20h
Showing 1 changed file with 63 additions and 17 deletions   Show diff stats
flaskr/controllers/main_controller.py
@@ -3,7 +3,7 @@ import geopy @@ -3,7 +3,7 @@ import geopy
3 import sqlalchemy 3 import sqlalchemy
4 4
5 from flask import Blueprint, render_template, flash, request, redirect, \ 5 from flask import Blueprint, render_template, flash, request, redirect, \
6 - url_for, abort, send_from_directory 6 + url_for, abort, send_from_directory, Response
7 from os.path import join 7 from os.path import join
8 8
9 from flaskr.extensions import cache, basic_auth 9 from flaskr.extensions import cache, basic_auth
@@ -14,9 +14,11 @@ from flaskr.geocoder import CachedGeocoder @@ -14,9 +14,11 @@ from flaskr.geocoder import CachedGeocoder
14 from flaskr.core import generate_unique_id 14 from flaskr.core import generate_unique_id
15 from flaskr.content import content 15 from flaskr.content import content
16 16
17 -# from io import StringIO  
18 from yaml import safe_dump as yaml_dump 17 from yaml import safe_dump as yaml_dump
19 18
  19 +import csv
  20 +# from io import StringIO
  21 +from cStringIO import StringIO
20 22
21 main = Blueprint('main', __name__) 23 main = Blueprint('main', __name__)
22 24
@@ -24,6 +26,27 @@ main = Blueprint('main', __name__) @@ -24,6 +26,27 @@ main = Blueprint('main', __name__)
24 OUT_ENCODING = 'utf-8' 26 OUT_ENCODING = 'utf-8'
25 27
26 28
  29 +# -----------------------------------------------------------------------------
  30 +# refactor this outta here, like in core?
  31 +
  32 +def get_emission_models():
  33 + emission_models_confs = content.models
  34 + emission_models = []
  35 +
  36 + for model_conf in emission_models_confs:
  37 + model_file = model_conf.file
  38 + the_module = importlib.import_module("flaskr.laws.%s" % model_file)
  39 +
  40 + model = the_module.EmissionModel(model_conf)
  41 + # model.configure(extra_model_conf)
  42 +
  43 + emission_models.append(model)
  44 +
  45 + return emission_models
  46 +
  47 +# -----------------------------------------------------------------------------
  48 +
  49 +
27 @main.route('/favicon.ico') 50 @main.route('/favicon.ico')
28 def favicon(): # we want it served from the root, not from static/ 51 def favicon(): # we want it served from the root, not from static/
29 return send_from_directory( 52 return send_from_directory(
@@ -209,17 +232,7 @@ def compute(): # process the queue of estimation requests @@ -209,17 +232,7 @@ def compute(): # process the queue of estimation requests
209 232
210 # GRAB AND CONFIGURE THE EMISSION MODELS ################################## 233 # GRAB AND CONFIGURE THE EMISSION MODELS ##################################
211 234
212 - emission_models_confs = content.models  
213 - emission_models = []  
214 -  
215 - for model_conf in emission_models_confs:  
216 - model_file = model_conf.file  
217 - the_module = importlib.import_module("flaskr.laws.%s" % model_file)  
218 -  
219 - model = the_module.EmissionModel(model_conf)  
220 - # model.configure(extra_model_conf)  
221 -  
222 - emission_models.append(model) 235 + emission_models = get_emission_models()
223 236
224 # print(emission_models) 237 # print(emission_models)
225 238
@@ -419,9 +432,6 @@ def consult_estimation(public_id, extension): @@ -419,9 +432,6 @@ def consult_estimation(public_id, extension):
419 if estimation.status in unavailable_statuses: 432 if estimation.status in unavailable_statuses:
420 abort(404) 433 abort(404)
421 434
422 - import csv  
423 - from cStringIO import StringIO  
424 -  
425 si = StringIO() 435 si = StringIO()
426 cw = csv.writer(si, quoting=csv.QUOTE_ALL) 436 cw = csv.writer(si, quoting=csv.QUOTE_ALL)
427 cw.writerow([u"city", u"address", u"co2 (g)"]) 437 cw.writerow([u"city", u"address", u"co2 (g)"])
@@ -443,12 +453,48 @@ def consult_estimation(public_id, extension): @@ -443,12 +453,48 @@ def consult_estimation(public_id, extension):
443 ]) 453 ])
444 454
445 # HTTP headers? 455 # HTTP headers?
446 - return si.getvalue().strip('\r\n') 456 + # return si.getvalue().strip('\r\n')
  457 + return Response(
  458 + response=si.getvalue().strip('\r\n'),
  459 + headers={
  460 + 'Content-type': 'text/csv',
  461 + 'Content-disposition': "attachment; filename=%s.csv"%public_id,
  462 + },
  463 + )
447 464
448 else: 465 else:
449 abort(404) 466 abort(404)
450 467
451 468
  469 +@main.route("/scaling_laws.csv")
  470 +def get_scaling_laws_csv():
  471 + distances = [
  472 + 500., 1000., 1500., 2500., 3000., 4500.,
  473 + 5000., 8000., 10000., 12000.,
  474 + ]
  475 + models = get_emission_models()
  476 +
  477 + si = StringIO()
  478 + cw = csv.writer(si, quoting=csv.QUOTE_ALL)
  479 +
  480 + header = ['distance'] + [model.slug for model in models]
  481 + cw.writerow(header)
  482 +
  483 + for distance in distances:
  484 + row = [distance]
  485 + for model in models:
  486 + row.append(model.compute_airplane_distance_footprint(distance))
  487 + cw.writerow(row)
  488 +
  489 + return Response(
  490 + response=si.getvalue().strip('\r\n'),
  491 + headers={
  492 + 'Content-type': 'text/csv',
  493 + 'Content-disposition': 'attachment; filename=scaling_laws.csv',
  494 + },
  495 + )
  496 +
  497 +
452 @main.route("/test") 498 @main.route("/test")
453 @basic_auth.required 499 @basic_auth.required
454 def dev_test(): 500 def dev_test():