/
server.py
110 lines (72 loc) · 2.68 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import os
from flask import Flask, jsonify, render_template, request
from flask_sqlalchemy import SQLAlchemy
from model import DisasterEvent, db, connect_to_db
from datetime import date, datetime
app = Flask(__name__)
@app.route('/')
def displays_events():
"""
Renders table filter page.
"""
return render_template('/events.html')
@app.route('/api/events', methods=['GET'])
def get_events():
"""
Takes in date and event type parameters to query database
and return Json.
"""
events_info = []
from_date = parse_date_input(request.args.get('from'))
to_date = parse_date_input(request.args.get('to'))
if validate_date_params(from_date, to_date) is 'invalid':
return jsonify({}), 400
event_types = [event.lower() for event in request.args.getlist('event_type')]
queried_events = make_query_to_db(from_date, to_date, event_types)
for event in queried_events:
date = event.start_date.strftime('%Y/%m/%d')
events_info.append({ 'disasterId': event.disaster_id,
'state': event.state,
'incidentType': event.incident_type,
'startDate': date,
'count': event.count })
return jsonify(events_info)
def parse_date_input(date):
"""
Converts string to datetime object.
"""
try:
return datetime.strptime(date, '%Y-%m-%d')
except ValueError:
return 'invalid'
def validate_date_params(from_date, to_date):
"""
Checks that dates entered by user are valid.
"""
if to_date < from_date:
return 'invalid'
elif from_date == 'invalid' or to_date == 'invalid':
return 'invalid'
def make_query_to_db(from_date, to_date, event_types):
"""
Makes database query based on validated form inputs.
"""
q = DisasterEvent.query
filtered_events = q.filter( (DisasterEvent.incident_type.in_(event_types))
& (DisasterEvent.start_date >= from_date)
& (DisasterEvent.start_date <= to_date)
).order_by('start_date').all()
return filtered_events
@app.route('/event_types')
def get_distinct_event_types():
"""
Gets list of distinct event types in database.
"""
event_types = db.session.query(DisasterEvent.incident_type).distinct().order_by('incident_type').all()
return jsonify(event_types)
if __name__ == '__main__':
connect_to_db(app, os.environ.get('DATABASE_URL'))
db.create_all()
PORT = int(os.environ.get('PORT', 5000))
DEBUG = "NO_DEBUG" not in os.environ
app.run(debug=DEBUG, host='0.0.0.0', port=PORT)