/
api.py
executable file
·203 lines (165 loc) · 5.96 KB
/
api.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#!/usr/bin/env python
import sys
import os
import re
import urllib
import urlparse
import urllib2
from flask import Flask, render_template, url_for, request, redirect, session
import streetlight_form
import sms
import users
import history
from utils import *
app = Flask(__name__)
if os.getlogin() == "boris":
app.debug = True # local account - debug
else:
app.debug = False # aws/heroku account - no debug
brand = "CrowdLit"
HIGHLIGHT_COLOR = '\x1b[96;1m'
HIGHLIGHT_END = '\x1b[0m'
@app.route('/')
def index():
return render_template('home.html')
def begin_session(args, no_session=True):
if 'sessionId' in args:
userId = history.History(args['sessionId'])
dbgInfo("Logged in as", userId.userId)
return userId
elif no_session:
userId = history.History('000')
dbgInfo("Logged in as", userId.userId)
return userId
else:
dbgErr("no sessionId submitted and no_session turned off")
return False
@app.route('/getuser', methods=['POST', 'GET'])
def getuser():
return begin_session(request.args).userId
@app.route('/home', methods=['POST', 'GET'])
def home():
u = begin_session(request.values)
if not u:
dbgErr('request', request)
return "Error: provide sessionId"
return u.get_all_history()
# TODO - FIX this - returns exception but method works
@app.route('/delete', methods=['POST', 'GET'])
def delete_history():
u = begin_session(request.values)
if not u:
dbgErr('request', request)
return "Error: provide sessionId"
return str(u.clear_history())
@app.route('/submitlight', methods=['POST', 'GET'])
def submitlight():
"""Submit to seattle streetlight and internal DB"""
print HIGHLIGHT_COLOR + "RECEIVED: " + HIGHLIGHT_END + str(request.values)
mandatory_args = ['LastName', 'Email', 'PoleNumber', 'Street']
for a in mandatory_args:
if not a in request.values:
return "failure: submit all args. " + a + " is missing"
u = begin_session(request.values, no_session=True)
if not u:
dbgErr('request', request)
return "failure: provide sessionId"
u.add_history(request.values['PoleNumber'], request.values['Street'])
dbgInfo('seattle light request to submit', streetlight_form.build_string(request.args))
return "success" + "<br>submitted: " + streetlight_form.build_string(request.args)
#return render_template('submitlight.html')
@app.route('/login', methods=['POST', 'GET'])
def login():
"""Pass a userId=myuserid pair to login"""
print "\n"
if not 'userId' in request.values:
return "ERROR: submit a userId"
userId = request.values['userId']
return users.login(userId)
@app.route('/logged_in', methods=['POST', 'GET'])
def logged_in():
if not 'sessionId' in request.values:
return "ERROR: submit a sessionId"
sessionId = request.values['sessionId']
return users.check_login(sessionId)
@app.route('/smsreply', methods=['POST', 'GET'])
def smsreply():
return sms.process_sms_message(request.values)
@app.route('/submit2', methods=['POST', 'GET'])
def submit2():
dbgInfo('request', request)
print HIGHLIGHT_COLOR + "RECEIVED: " + HIGHLIGHT_END + str(request.values)
resp = "<small>"+ render_args(request.values) + "</small><br>"
return resp
@app.route('/submit', methods=['POST', 'GET'])
def submit():
print HIGHLIGHT_COLOR + "RECEIVED: " + HIGHLIGHT_END + str(request.values)
u = begin_session(request.values, no_session=True)
if not u:
dbgErr('request', request)
return "Error: provide sessionId"
if 'Body' in request.values:
pole_number = request.values['Body']
if not sms.verify_pole_number(pole_number):
dbgInfo('pole number is in wrong format. Continuing to From attr check and generic response')
else:
if 'Address' in request.values:
dbgInfo('Got polenum and address')
print u.add_history(pole_number, request.values['Address'])
resp = "last history: " + u.get_last_history()
else: # use fake address
dbgInfo('Got polenum and generated fake address')
print u.add_history(pole_number, history.newaddr())
resp = "last history: " + u.get_last_history()
dbgInfo('added history. ALL history up to now', u.get_all_history())
if 'Test' in request.values and request.values['Test'] == 'True':
dbgInfo("Got polenum. Return JSON because of 'Test' param. last history", u.get_last_history())
return u.get_last_history()
if not 'From' in request.values:
dbgWarn("no 'From' key in request. Not SMS - Not Replying")
return render_args(request.values) + "<br>WARN: Not an SMS. Not replying"
# SEND SMS
dbgInfo("FROM DETECTED. WILL TRY TO RESPOND", request.values)
rcpt = request.values['From']
resp += "<hr>RECIPIENT: " + rcpt + "<br>"
dbgInfo('FROM', rcpt)
resp += "<h3>Twilio Response:</h3>"
dbgInfo("send_sms() retval", sms.send_sms())
return resp
@app.route('/map', methods=['POST', 'GET'])
def get_map():
BASE_URL = "http://maps.googleapis.com/maps/api/staticmap?center=Seattle,WA&zoom=10&size=500x500&sensor=false&markers=color:blue|label:*|"
import json
#http://maps.googleapis.com/maps/api/staticmap?center=Seattle,WA&zoom=10&size=500x500&sensor=false&markers=color:blue|label:*|220%202nd%20Avenue%20S%20Seattle|4540%2019th%20Ave%20NE%20Seattle
u = begin_session(request.values, no_session=True)
if not u:
dbgErr('request', request)
return "Error: provide sessionId"
dbgInfo("user", u.userId)
my_locations = []
data = BASE_URL
my_history = json.loads(u.get_all_history())
for item in my_history:
my_locations.append(item['address'])
data += urllib.quote(str(item['address'])) + "Seattle |"
data = data[:-1]
dbgInfo("my_locations", my_locations)
dbgInfo("url", data)
return '<img src="' + data + '">'
def render_args(args):
s = "<h3>REQUEST PARAMS</h3>"
for item in args:
s += item + " = " + args[item] + "<br>"
return s
@app.route('/wsdl', methods=['POST', 'GET'])
def wsdl():
return render_template('wsdl_response.wsdl')
@app.route('/hello', methods=['POST', 'GET'])
def hello_wsdl():
return render_template('hello.wsdl')
def main():
port = int(os.environ.get('PORT', 5000)) # for heroku
app.run(host='0.0.0.0', port=port)
return 0
if __name__ == "__main__":
sys.exit(main())