Commit e2637443102bd5929ab9cf2f502192d065c1f378

Authored by Antoine Goutenoir
1 parent 7662554f
Exists in master

Send emails to admins.

Showing 1 changed file with 64 additions and 38 deletions   Show diff stats
flaskr/controllers/main_controller.py
@@ -4,21 +4,30 @@ from copy import deepcopy @@ -4,21 +4,30 @@ from copy import deepcopy
4 import geopy 4 import geopy
5 import sqlalchemy 5 import sqlalchemy
6 6
7 -from flask import Blueprint, render_template, flash, request, redirect, \  
8 - url_for, abort, send_from_directory, Response  
9 from os.path import join 7 from os.path import join
10 -  
11 -from os import unlink  
12 -  
13 -from flask_mail import Message  
14 -  
15 -from flaskr.extensions import cache, basic_auth, mail 8 +from os import unlink, getenv
  9 +
  10 +from flask import (
  11 + Blueprint,
  12 + Response,
  13 + render_template,
  14 + flash,
  15 + request,
  16 + redirect,
  17 + url_for,
  18 + abort,
  19 + send_from_directory,
  20 +)
  21 +from flaskr.extensions import cache, basic_auth, mail, send_email
16 from flaskr.forms import LoginForm, EstimateForm 22 from flaskr.forms import LoginForm, EstimateForm
17 from flaskr.models import db, User, Estimation, StatusEnum, ScenarioEnum 23 from flaskr.models import db, User, Estimation, StatusEnum, ScenarioEnum
18 from flaskr.geocoder import CachedGeocoder 24 from flaskr.geocoder import CachedGeocoder
19 25
20 -from flaskr.core import generate_unique_id, \  
21 - get_emission_models, increment_hit_counter 26 +from flaskr.core import (
  27 + generate_unique_id,
  28 + get_emission_models,
  29 + increment_hit_counter,
  30 +)
22 from flaskr.content import content 31 from flaskr.content import content
23 32
24 from wtforms import validators 33 from wtforms import validators
@@ -39,6 +48,9 @@ OUT_ENCODING = 'utf-8' @@ -39,6 +48,9 @@ OUT_ENCODING = 'utf-8'
39 48
40 49
41 # ----------------------------------------------------------------------------- 50 # -----------------------------------------------------------------------------
  51 +
  52 +pi_email = "didier.barret@irap.omp.eu" # todo: move to content YAML
  53 +
42 # ----------------------------------------------------------------------------- 54 # -----------------------------------------------------------------------------
43 55
44 56
@@ -157,7 +169,7 @@ def gather_addresses(from_list, from_file): @@ -157,7 +169,7 @@ def gather_addresses(from_list, from_file):
157 169
158 @main.route("/estimate", methods=["GET", "POST"]) 170 @main.route("/estimate", methods=["GET", "POST"])
159 @main.route("/estimate.html", methods=["GET", "POST"]) 171 @main.route("/estimate.html", methods=["GET", "POST"])
160 -def estimate(): 172 +def estimate(): # register new estimation request, more accurately
161 models = get_emission_models() 173 models = get_emission_models()
162 form = EstimateForm() 174 form = EstimateForm()
163 175
@@ -203,6 +215,12 @@ def estimate(): @@ -203,6 +215,12 @@ def estimate():
203 db.session.add(estimation) 215 db.session.add(estimation)
204 db.session.commit() 216 db.session.commit()
205 217
  218 + send_email(
  219 + to_recipient=pi_email,
  220 + subject="[TCFM] New Estimation: %s" % estimation.public_id,
  221 + message="TODO"
  222 + )
  223 +
206 flash("Estimation request submitted successfully.", "success") 224 flash("Estimation request submitted successfully.", "success")
207 return redirect(url_for( 225 return redirect(url_for(
208 endpoint=".consult_estimation", 226 endpoint=".consult_estimation",
@@ -297,7 +315,7 @@ def compute(): # process the queue of estimation requests @@ -297,7 +315,7 @@ def compute(): # process the queue of estimation requests
297 failed_addresses = [] 315 failed_addresses = []
298 geocoder = CachedGeocoder() 316 geocoder = CachedGeocoder()
299 317
300 - # GEOCODE ORIGINS ######################################################### 318 + # GEOCODE ORIGINS #####################################################
301 319
302 origins_addresses = estimation.origin_addresses.strip().split("\n") 320 origins_addresses = estimation.origin_addresses.strip().split("\n")
303 origins_addresses_count = len(origins_addresses) 321 origins_addresses_count = len(origins_addresses)
@@ -350,7 +368,7 @@ def compute(): # process the queue of estimation requests @@ -350,7 +368,7 @@ def compute(): # process the queue of estimation requests
350 origin.latitude, origin.longitude, 368 origin.latitude, origin.longitude,
351 ) 369 )
352 370
353 - # GEOCODE DESTINATIONS #################################################### 371 + # GEOCODE DESTINATIONS ################################################
354 372
355 destinations_addresses = estimation.destination_addresses.strip().split("\n") 373 destinations_addresses = estimation.destination_addresses.strip().split("\n")
356 destinations_addresses_count = len(destinations_addresses) 374 destinations_addresses_count = len(destinations_addresses)
@@ -378,7 +396,9 @@ def compute(): # process the queue of estimation requests @@ -378,7 +396,9 @@ def compute(): # process the queue of estimation requests
378 continue 396 continue
379 397
380 try: 398 try:
381 - destination = geocoder.geocode(destination_address.encode('utf-8')) 399 + destination = geocoder.geocode(
  400 + destination_address.encode('utf-8')
  401 + )
382 except geopy.exc.GeopyError as e: 402 except geopy.exc.GeopyError as e:
383 warning = u"Ignoring destination `%s` " \ 403 warning = u"Ignoring destination `%s` " \
384 u"since we failed to geocode it.\n%s\n" % ( 404 u"since we failed to geocode it.\n%s\n" % (
@@ -410,7 +430,7 @@ def compute(): # process the queue of estimation requests @@ -410,7 +430,7 @@ def compute(): # process the queue of estimation requests
410 430
411 geocoder.close() 431 geocoder.close()
412 432
413 - # GTFO IF NO ORIGINS OR NO DESTINATIONS ################################### 433 + # GTFO IF NO ORIGINS OR NO DESTINATIONS ###############################
414 434
415 if 0 == len(origins): 435 if 0 == len(origins):
416 response += u"Failed to geocode ALL the origin(s).\n" 436 response += u"Failed to geocode ALL the origin(s).\n"
@@ -421,7 +441,7 @@ def compute(): # process the queue of estimation requests @@ -421,7 +441,7 @@ def compute(): # process the queue of estimation requests
421 _handle_failure(estimation, response) 441 _handle_failure(estimation, response)
422 return _respond(response) 442 return _respond(response)
423 443
424 - # GRAB AND CONFIGURE THE EMISSION MODELS ################################## 444 + # GRAB AND CONFIGURE THE EMISSION MODELS ##############################
425 445
426 emission_models = estimation.get_models() 446 emission_models = estimation.get_models()
427 # print(emission_models) 447 # print(emission_models)
@@ -431,11 +451,11 @@ def compute(): # process the queue of estimation requests @@ -431,11 +451,11 @@ def compute(): # process the queue of estimation requests
431 # 'use_train_below_distance': 300, 451 # 'use_train_below_distance': 300,
432 } 452 }
433 453
434 - # PREPARE RESULT DICTIONARY THAT WILL BE STORED ########################### 454 + # PREPARE RESULT DICTIONARY THAT WILL BE STORED #######################
435 455
436 results = {} 456 results = {}
437 457
438 - # UTILITY PRIVATE FUNCTION(S) ############################################# 458 + # UTILITY PRIVATE FUNCTION(S) #########################################
439 459
440 def get_city_key(_location): 460 def get_city_key(_location):
441 # Will this hack hold? Suspense... 461 # Will this hack hold? Suspense...
@@ -550,9 +570,9 @@ def compute(): # process the queue of estimation requests @@ -550,9 +570,9 @@ def compute(): # process the queue of estimation requests
550 570
551 return _results 571 return _results
552 572
553 - # SCENARIO A : One Origin, At Least One Destination ####################### 573 + # SCENARIO A : One Origin, At Least One Destination ###################
554 # 574 #
555 - # In this scenario, we compute the sum of each of the travels' footprint, 575 + # We compute the sum of each of the travels' footprint,
556 # for each of the Emission Models, and present a mean of all Models. 576 # for each of the Emission Models, and present a mean of all Models.
557 # 577 #
558 if 1 == len(origins): 578 if 1 == len(origins):
@@ -563,7 +583,7 @@ def compute(): # process the queue of estimation requests @@ -563,7 +583,7 @@ def compute(): # process the queue of estimation requests
563 _extra_config=extra_config, 583 _extra_config=extra_config,
564 ) 584 )
565 585
566 - # SCENARIO B : At Least One Origin, One Destination ####################### 586 + # SCENARIO B : At Least One Origin, One Destination ###################
567 # 587 #
568 # Same as A for now. 588 # Same as A for now.
569 # 589 #
@@ -575,7 +595,7 @@ def compute(): # process the queue of estimation requests @@ -575,7 +595,7 @@ def compute(): # process the queue of estimation requests
575 _extra_config=extra_config, 595 _extra_config=extra_config,
576 ) 596 )
577 597
578 - # SCENARIO C : At Least One Origin, At Least One Destination ############## 598 + # SCENARIO C : At Least One Origin, At Least One Destination ##########
579 # 599 #
580 # Run Scenario A for each Destination, and expose optimum Destination. 600 # Run Scenario A for each Destination, and expose optimum Destination.
581 # 601 #
@@ -605,15 +625,24 @@ def compute(): # process the queue of estimation requests @@ -605,15 +625,24 @@ def compute(): # process the queue of estimation requests
605 'cities': result_cities, 625 'cities': result_cities,
606 } 626 }
607 627
608 - # WRITE RESULTS INTO THE DATABASE ######################################### 628 + # WRITE RESULTS INTO THE DATABASE #####################################
609 629
610 estimation.status = StatusEnum.success 630 estimation.status = StatusEnum.success
  631 + # Don't use YAML, it is too slow for big data.
611 # estimation.output_yaml = u"%s" % yaml_dump(results) 632 # estimation.output_yaml = u"%s" % yaml_dump(results)
612 estimation.informations = response 633 estimation.informations = response
613 estimation.set_output_dict(results) 634 estimation.set_output_dict(results)
614 db.session.commit() 635 db.session.commit()
615 636
616 - # FINALLY, RESPOND ######################################################## 637 + # SEND AN EMAIL #######################################################
  638 +
  639 + send_email(
  640 + to_recipient=pi_email,
  641 + subject="[TCFM] Run completed: %s" % estimation.public_id,
  642 + message="TODO"
  643 + )
  644 +
  645 + # FINALLY, RESPOND ####################################################
617 646
618 # response += yaml_dump(results) + "\n" 647 # response += yaml_dump(results) + "\n"
619 648
@@ -742,17 +771,14 @@ def get_scaling_laws_csv(): @@ -742,17 +771,14 @@ def get_scaling_laws_csv():
742 def dev_test(): 771 def dev_test():
743 import os 772 import os
744 773
745 - # return os.getenv('ADMIN_USERNAME')  
746 -  
747 -  
748 -def send_email(to_recipient, subject, message):  
749 - try:  
750 - msg = Message(  
751 - subject=subject,  
752 - html=message,  
753 - sender="bot-noreply@travel-carbon-footprint.irap.omp.eu",  
754 - recipients=[to_recipient],  
755 - )  
756 - mail.send(msg)  
757 - except:  
758 - pass 774 + # email_content = render_template(
  775 + # 'new_run.email.html',
  776 + # # run=run,
  777 + # )
  778 + # send_email(
  779 + # 'goutte@protonmail.com',
  780 + # subject=u"[TCFC] New run request",
  781 + # message=email_content
  782 + # )
  783 +
  784 + return "ok"