-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
237 lines (202 loc) · 8.5 KB
/
app.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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#!/usr/bin/python3
import os
import json
# For debugging
import logging, traceback
# So we can see the output when webapp is running
import subprocess, time
from flask import Flask, request, session, redirect, render_template, url_for, jsonify
from twilio import twiml
from runenv import load_env
from flask_sqlalchemy import SQLAlchemy
# Include our own models
import data.check as dc
import data.tracker as dt
import data.user as du
from model.db import db
from connect.database import uri
# Create and fill out .env file from .env_sample
load_env(env_file='.env')
# Ideally this will not be here. We will hopefully dockerize/containerize this
# So the environment variables are global in the app
TWILIO_NUMBER = os.getenv('TWILIO_NUMBER')
# initialize the flask app
app = Flask(__name__)
# Secret key so our session vars stay safe
app.secret_key = os.getenv('APP_SECRET_KEY')
# sqlalchemy track mod is required to speed up queries
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# access database
app.config['SQLALCHEMY_DATABASE_URI'] = uri
db.init_app(app)
@app.route('/', methods=['GET', 'POST'])
def landing():
return render_template('landing.html')
@app.route('/home', methods=['GET', 'POST'])
def home():
session.modified = True
if session.get('email') is None:
try:
# Init session vars
session['email'] = request.form['email']
print(session['email'])
session['name'] = request.form['name']
print(session['name'])
session['media'] = request.form['media']
print(session['media'])
session['user'] = True
print(session['user'])
print('Got session vars')
except:
print('Could not get session vars')
pass
else:
print('Already have existing session vars', session.get('email'))
if session.get('email') is not None:
if du.in_person_first_time(session['email'], session['media']):
# First time this person has logged in, we need to get their email
print('First time login')
return render_template("welcome.html")
else:
# Save user id into this session
session['user_id'] = du.get_user_id(session['email'], session['media'])
print('user id:', session['user_id'])
# List of dicts with tracker info:
# [{tracker_id, tracker_name, imei, type_, make, model, year, color}]
# Separate the list of tracker ids and the tracker's info
# So we don't pass the tracker id into front end
if session.get('user_id') is not None:
session['new_trackers'] = dt.get_new_tracker(session['user_id'])
session['new_tracker_info'] = dt.get_info(session['new_trackers'])
if session.get('user_id') is not None and len(session['new_tracker_info']) > 0:
# There are uninitialized trackers
print(session['new_trackers'])
return redirect(url_for('new_tracker'))
elif session.get('user_id') is not None:
# Go to page of trackers
return redirect(url_for('trackers'))
else:
return render_template("welcome.html")
@app.route('/trackers', methods=['POST', 'GET'])
def trackers():
# Get list of trackers for this user_id
session['tracker_name_id'] = dt.get_trackers_name_id(session['user_id'])
# Check if user is admin
admin = du.get_role(session['user_id'])
if admin:
return render_template("trackers.html", tracker_names=list(session['tracker_name_id'].keys()), admin=True)
else:
return render_template("trackers.html", tracker_names=list(session['tracker_name_id'].keys()))
@app.route('/credits', methods=['POST', 'GET'])
def credits():
remaining = du.get_credits(session['user_id'])
return render_template("credits.html", credits_remaining=remaining)
@app.route('/new', methods=['POST', 'GET'])
def new():
if request.method == 'POST':
# Get their primary number
session['phone'] = request.form['phone']
# Link their fb email to their phone number
try:
linked = du.link(session['phone'], session['email'], session['media'], session['name'])
print(linked)
session['user_id'] = du.get_user_id(session['email'], session['media'])
print('user id:', session['user_id'])
if not linked:
print('Not linked')
return render_template("welcome.html", try_again='true')
except:
# Take them back to enter their number again
return render_template("welcome.html", try_again='true')
# Get any new trackers they need to init
if session.get('new_trackers') is not None and len(session['new_trackers']) > 0:
# They have an unintialized tracker they need to verify
return redirect(url_for('new_tracker'))
else:
# No trackers to initialize
return redirect(url_for('home'))
@app.route('/new_tracker', methods=['POST', 'GET'])
def new_tracker():
# After a submit, check if there are any more new trackers to initialize
if request.method == 'POST':
print('Got an ajax post')
if (len(session['new_tracker_info']) > 0):
# Get the tracker info from form and commit to db
inputs = request.form
if len(inputs) > 0:
added = dt.init(inputs, session['new_trackers'][0])
print('added:', added, inputs)
if not added:
print('not added')
# Commit not successful, refresh, put up an error message
return render_template("info.html", tracker=session['new_tracker_info'][0], error_msg="Sorry, something went wrong, please try again")
else:
# Commit successful
# Remove the first tracker's info - the one just committed
print('added')
session['new_trackers'] = session['new_trackers'][1:]
session['new_tracker_info'] = session['new_tracker_info'][1:]
# For simplicity, render one form/one tracker's info at a time
if len(session['new_tracker_info']) > 0:
# There are still uninitialized trackers
return render_template("info.html", tracker=session['new_tracker_info'][0])
else:
# No more new trackers, go to main trackers page
return redirect(url_for('trackers'))
@app.route('/tracker/<string:tracker_name>', methods=['POST', 'GET'])
def tracker_name(tracker_name):
# Get their remaining credits
credits = du.get_credits(session['user_id'])
# Read locations from db
locations = dt.get_locations(dt.get_tracker_id(session['user_id'], tracker_name))
return render_template("location.html", locations=locations, tracker_name=tracker_name, credits=credits)
@app.route('/ping/<string:tracker_name>', methods=['POST', 'GET'])
def ping(tracker_name):
try:
# Make a call to the tracker
# The tracker will acknoledge the call and then hang up
call = twilio_client.calls.create(
to=get_tracker_id(session['user_id'], tracker_name),
from_=TWILIO_NUMBER,
url="http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient")
du.use_credit(session['user_id'])
except Exception as e:
print(e)
return redirect('/tracker/'+tracker_name)
@app.route('/register', methods=['POST', 'GET'])
def register():
if request.method == 'POST':
print('Got ajax post')
# Grap user info from new register page
user = request.form
print(user)
if (len(user['name']) > 0):
print(user['name'])
# Tracker id is empty here
added = du.init(user, '')
# Print different messages on page depending on outcome
if added:
print('added')
return render_template('register.html', added='success', user=user['name'])
else:
print('not added')
return render_template('register.html', added='fail')
return render_template('register.html')
@app.route('/logout')
def logout():
# Get rid of the session vars
session.clear()
# Go home
return redirect('/')
DB_PORT=3306
@app.errorhandler(500)
def server_error(e):
# Goddamn errors
logging.exception('An error occurred during a request.')
return """
An internal error occurred: <pre>{}</pre>
See logs for full stacktrace.
""".format(e), 500
if __name__ == '__main__':
# Point browser to localhost:8000
app.run(port=8000, debug=True, host='0.0.0.0')