-
Notifications
You must be signed in to change notification settings - Fork 1
/
timer.py
153 lines (123 loc) · 4.97 KB
/
timer.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
import os
from flask import Flask, redirect, render_template, request, session
from pymongo import MongoClient
import json
characters_in_splits = 9
MONGODB_URI = os.environ.get('MONGODB_URI')
MONGODB_NAME = os.environ.get('MONGODB_NAME')
app = Flask(__name__)
@app.route('/')
def get_homepage():
return render_template('index.html')
@app.route('/login', methods=['POST'])
def login():
"""Assign a team, username, and meet to user and data document"""
sport = request.form['sport']
team = request.form['team']
username = request.form['username']
meet = request.form['meet']
return redirect("/" + sport + "/" + team + "/" + username + "/" + meet)
@app.route('/<sport>/<team>/<username>/<meet>')
def get_user_page(sport, team, username, meet):
"""Take user to stopwatch page"""
return render_template('timer_page.html', username=username,
team=team, sport=sport, meet=meet)
@app.route('/<sport>/<team>/<username>/<meet>/new', methods=['POST'])
def setup_timers(sport, team, username, meet):
"""Choose event and heat for document, depending on sport chosen"""
meet = request.form['meet']
event_name = request.form['event']
heat_num = request.form['heat']
event = "Event: " + event_name
heat = "Heat: " + heat_num
return redirect("/" + sport + "/" + team + "/" + username + "/"
+ meet + '/' + event + "/" + heat)
@app.route('/<sport>/<team>/<username>/<meet>/<event>/<heat>')
def timers_ready_with_event_heat(sport, team, username, meet, event, heat):
"""Display event and heat user is timing for (not required)"""
return render_template('timer_page.html', username=username,
team=team, sport=sport, meet=meet,
event=event, heat=heat)
@app.route('/time', methods=['POST'])
def save_times():
"""Save times to MongoDB"""
# Get times from AJAX call
team = request.form['team']
username = request.form['username']
meet = request.form['meet']
event = request.form['event']
heat = request.form['heat']
timer_one = request.form['lanes1']
timer_two = request.form['lanes2']
timer_three = request.form['lanes3']
final_one = request.form['final1']
final_two = request.form['final2']
final_three = request.form['final3']
split_one = request.form['split1']
split_two = request.form['split2']
split_three = request.form['split3']
# Data structure with meet data, new document for each heat
# Team, username, and meet used as identifiers when deciding which data
# to retrieve from database in view_times
meet_data = {
'team': team,
'username': username,
'meet': meet,
'event': event,
'heat': heat,
'lanes': {
timer_one: {
'final': final_one,
'splits': iterate_split_times(split_one),
},
timer_two: {
'final': final_two,
'splits': iterate_split_times(split_two),
},
timer_three: {
'final': final_three,
'splits': iterate_split_times(split_three),
}
}
}
# Connects to MongoDB and inserts meet_data as a document in
# final-times collection
with MongoClient(MONGODB_URI) as conn:
db = conn[MONGODB_NAME]
coll = db['final-times']
coll.insert(meet_data)
# Return OK as page is prevented from reloading via AJAX function
# Reloading page would clear stopwatches
return 'OK'
@app.route('/<sport>/<team>/<username>/<meet>/view', methods=['POST'])
def view_times_on_page(sport, team, username, meet):
"""View saved times underneath stopwatches"""
# From hidden fields
meet = request.form['meet']
event_name = request.form['event']
heat_num = request.form['heat']
# Get times from MongoDB and put into list
meet_data = get_times_from_database()
show_times = []
# Append new times saved to view page
for times in meet_data:
show_times.append(times)
return render_template('timer_page.html', username=username,
team=team, sport=sport, meet=meet,
event=event_name, heat=heat_num,
show_times=show_times, meets=meet)
def iterate_split_times(split_number):
"""Iterates over split list brought in from AJAX call."""
# There are 9 characters in each split time "00:00.00", list
# comprehension breaks them up. See README.
return [split_number[i:i+characters_in_splits] for i in range(0,
len(split_number), characters_in_splits)]
def get_times_from_database():
"""Get times from MongoDB to render on view times page"""
with MongoClient(MONGODB_URI) as conn:
db = conn[MONGODB_NAME]
coll = db['final-times']
all_times = coll.find()
return all_times
if __name__ == '__main__':
app.run(host=os.getenv('IP'), port=int(os.getenv('PORT')), debug=True)