Commit 24f55cdeded6e35233d91c47760c2076468ec33d
1 parent
4392f295
Exists in
master
Geocode destinations.
Showing
1 changed file
with
61 additions
and
7 deletions
Show diff stats
flaskr/controllers/main_controller.py
... | ... | @@ -2,10 +2,14 @@ from flask import Blueprint, render_template, flash, request, redirect, url_for |
2 | 2 | |
3 | 3 | from flaskr.extensions import cache |
4 | 4 | from flaskr.forms import LoginForm, EstimateForm |
5 | -from flaskr.models import db, User, Estimation | |
5 | +from flaskr.models import db, User, Estimation, StatusEnum | |
6 | +from flaskr.geocoder import CachedGeocoder | |
6 | 7 | |
7 | 8 | from flaskr.core import generate_unique_id |
8 | 9 | |
10 | +import sqlalchemy | |
11 | +import geopy | |
12 | + | |
9 | 13 | main = Blueprint('main', __name__) |
10 | 14 | |
11 | 15 | |
... | ... | @@ -27,10 +31,10 @@ def estimate(): |
27 | 31 | estimation.email = form.email.data |
28 | 32 | estimation.first_name = form.first_name.data |
29 | 33 | estimation.last_name = form.last_name.data |
30 | - estimation.status = 'pending' | |
31 | - estimation.origin_addresses = form.origin_addresses | |
32 | - estimation.destination_addresses = form.destination_addresses | |
33 | - estimation.compute_optimal_destination = form.compute_optimal_destination | |
34 | + estimation.status = StatusEnum.pending | |
35 | + estimation.origin_addresses = form.origin_addresses.data | |
36 | + estimation.destination_addresses = form.destination_addresses.data | |
37 | + estimation.compute_optimal_destination = form.compute_optimal_destination.data | |
34 | 38 | |
35 | 39 | db.session.add(estimation) |
36 | 40 | db.session.commit() |
... | ... | @@ -44,8 +48,58 @@ def estimate(): |
44 | 48 | |
45 | 49 | @main.route("/compute") |
46 | 50 | def compute(): |
51 | + | |
52 | + def _respond(_msg): | |
53 | + return "<pre>%s</pre>" % _msg | |
54 | + | |
55 | + def _handle_failure(_estimation, _failure_message): | |
56 | + _estimation.status = StatusEnum.failed | |
57 | + db.session.commit() | |
58 | + | |
47 | 59 | response = "" |
48 | 60 | |
49 | - # TODO | |
61 | + try: | |
62 | + estimation = Estimation.query \ | |
63 | + .filter_by(status=StatusEnum.pending) \ | |
64 | + .order_by(Estimation.id.desc()) \ | |
65 | + .one() | |
66 | + except sqlalchemy.orm.exc.NoResultFound: | |
67 | + return _respond("No estimation in the queue.") | |
68 | + | |
69 | + response += u"Processing estimation `%s` of `%s`...\n" % (estimation.id, estimation.email) | |
70 | + | |
71 | + geocoder = CachedGeocoder() | |
72 | + | |
73 | + destinations_addresses = estimation.destination_addresses.split("\n") | |
74 | + destinations = [] | |
75 | + | |
76 | + for i in range(len(destinations_addresses)): | |
77 | + | |
78 | + destination_address = str(destinations_addresses[i]) | |
79 | + | |
80 | + try: | |
81 | + destination = geocoder.geocode(destination_address) | |
82 | + except geopy.exc.GeopyError as e: | |
83 | + response += u"Failed to geolocalize destination `%s`.\n%s" % ( | |
84 | + destination_address, e, | |
85 | + ) | |
86 | + _handle_failure(estimation, response) | |
87 | + return _respond(response) | |
88 | + | |
89 | + if destination is None: | |
90 | + response += u"Failed to geolocalize destination `%s`." % ( | |
91 | + destination_address, | |
92 | + ) | |
93 | + _handle_failure(estimation, response) | |
94 | + return _respond(response) | |
95 | + | |
96 | + destinations.append(destination) | |
97 | + | |
98 | + response += u"Destination: %s == %s (%f, %f)\n" % ( | |
99 | + destination_address, destination.address, | |
100 | + destination.latitude, destination.longitude, | |
101 | + ) | |
102 | + | |
103 | + | |
50 | 104 | |
51 | - return response | |
105 | + return _respond(response) | ... | ... |