Skip to content

Commit ce7d037

Browse files
committed
Move stats methods to stats.py
1 parent 6e1265e commit ce7d037

File tree

2 files changed

+116
-69
lines changed

2 files changed

+116
-69
lines changed

packet/routes/api.py

Lines changed: 3 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from packet.models import Packet, MiscSignature, NotificationSubscription, Freshman, FreshSignature, UpperSignature
1818
from packet.notifications import packet_signed_notification, packet_100_percent_notification, \
1919
packet_starting_notification, packets_starting_notification
20+
import packet.stats as stats
2021

2122

2223
@app.route('/api/v1/freshmen', methods=['POST'])
@@ -255,80 +256,13 @@ def report(info):
255256
@app.route('/api/v1/stats/packet/<packet_id>')
256257
@packet_auth
257258
def packet_stats(packet_id):
258-
packet = Packet.by_id(packet_id)
259-
260-
dates = [packet.start.date() + timedelta(days=x) for x in range(0, (packet.end-packet.start).days + 1)]
261-
262-
print(dates)
263-
264-
upper_stats = {date: list() for date in dates}
265-
for uid, date in map(lambda sig: (sig.member, sig.updated),
266-
filter(lambda sig: sig.signed, packet.upper_signatures)):
267-
upper_stats[date.date()].append(uid)
268-
269-
fresh_stats = {date: list() for date in dates}
270-
for username, date in map(lambda sig: (sig.freshman_username, sig.updated),
271-
filter(lambda sig: sig.signed, packet.fresh_signatures)):
272-
fresh_stats[date.date()].append(username)
273-
274-
misc_stats = {date: list() for date in dates}
275-
for uid, date in map(lambda sig: (sig.member, sig.updated), packet.misc_signatures):
276-
misc_stats[date.date()].append(uid)
277-
278-
total_stats = dict()
279-
for date in dates:
280-
total_stats[date.isoformat()] = {
281-
'upper': upper_stats[date],
282-
'fresh': fresh_stats[date],
283-
'misc': misc_stats[date],
284-
}
285-
286-
return {
287-
'packet_id': packet_id,
288-
'dates': total_stats,
289-
}
290-
291-
292-
def sig2dict(sig):
293-
"""
294-
A utility function for upperclassman stats.
295-
Converts an UpperSignature to a dictionary with the date and the packet.
296-
"""
297-
packet = Packet.by_id(sig.packet_id)
298-
return {
299-
'date': sig.updated.date(),
300-
'packet': {
301-
'id': packet.id,
302-
'freshman_username': packet.freshman_username,
303-
},
304-
}
259+
return stats.packet_stats(packet_id)
305260

306261

307262
@app.route('/api/v1/stats/upperclassman/<uid>')
308263
@packet_auth
309264
def upperclassman_stats(uid):
310-
311-
sigs = UpperSignature.query.filter(
312-
UpperSignature.signed,
313-
UpperSignature.member == uid
314-
).all() + MiscSignature.query.filter(MiscSignature.member == uid).all()
315-
316-
sig_dicts = list(map(sig2dict, sigs))
317-
318-
dates = set(map(lambda sd: sd['date'], sig_dicts))
319-
320-
return {
321-
'member': uid,
322-
'signatures': {
323-
date.isoformat() : list(
324-
map(lambda sd: sd['packet'],
325-
filter(lambda sig, d=date: sig['date'] == d,
326-
sig_dicts
327-
)
328-
)
329-
) for date in dates
330-
}
331-
}
265+
return stats.upperclassman_stats(uid)
332266

333267
def commit_sig(packet, was_100, uid):
334268
packet_signed_notification(packet, uid)

packet/stats.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
from datetime import timedelta
2+
3+
from packet.models import Packet, MiscSignature, UpperSignature
4+
5+
6+
def packet_stats(packet_id):
7+
"""
8+
Gather statistics for a packet in the form of number of signatures per day
9+
10+
Return format: {
11+
packet_id,
12+
freshman: {
13+
name,
14+
rit_username,
15+
},
16+
dates: {
17+
<date>: {
18+
upper: [ uid ],
19+
misc: [ uid ],
20+
fresh: [ freshman_username ],
21+
},
22+
},
23+
}
24+
"""
25+
packet = Packet.by_id(packet_id)
26+
27+
dates = [packet.start.date() + timedelta(days=x) for x in range(0, (packet.end-packet.start).days + 1)]
28+
29+
print(dates)
30+
31+
upper_stats = {date: list() for date in dates}
32+
for uid, date in map(lambda sig: (sig.member, sig.updated),
33+
filter(lambda sig: sig.signed, packet.upper_signatures)):
34+
upper_stats[date.date()].append(uid)
35+
36+
fresh_stats = {date: list() for date in dates}
37+
for username, date in map(lambda sig: (sig.freshman_username, sig.updated),
38+
filter(lambda sig: sig.signed, packet.fresh_signatures)):
39+
fresh_stats[date.date()].append(username)
40+
41+
misc_stats = {date: list() for date in dates}
42+
for uid, date in map(lambda sig: (sig.member, sig.updated), packet.misc_signatures):
43+
misc_stats[date.date()].append(uid)
44+
45+
total_stats = dict()
46+
for date in dates:
47+
total_stats[date.isoformat()] = {
48+
'upper': upper_stats[date],
49+
'fresh': fresh_stats[date],
50+
'misc': misc_stats[date],
51+
}
52+
53+
return {
54+
'packet_id': packet_id,
55+
'freshman': {
56+
'name': packet.freshman.name,
57+
'rit_username': packet.freshman.rit_username,
58+
},
59+
'dates': total_stats,
60+
}
61+
62+
63+
def sig2dict(sig):
64+
"""
65+
A utility function for upperclassman stats.
66+
Converts an UpperSignature to a dictionary with the date and the packet.
67+
"""
68+
packet = Packet.by_id(sig.packet_id)
69+
return {
70+
'date': sig.updated.date(),
71+
'packet': {
72+
'id': packet.id,
73+
'freshman_username': packet.freshman_username,
74+
},
75+
}
76+
77+
78+
def upperclassman_stats(uid):
79+
"""
80+
Gather statistics for an upperclassman's signature habits
81+
82+
Return format: {
83+
member: <uid>,
84+
signautes: {
85+
<date>: [{
86+
id: <packet_id>,
87+
freshman_username,
88+
}],
89+
},
90+
}
91+
"""
92+
93+
sigs = UpperSignature.query.filter(
94+
UpperSignature.signed,
95+
UpperSignature.member == uid
96+
).all() + MiscSignature.query.filter(MiscSignature.member == uid).all()
97+
98+
sig_dicts = list(map(sig2dict, sigs))
99+
100+
dates = set(map(lambda sd: sd['date'], sig_dicts))
101+
102+
return {
103+
'member': uid,
104+
'signatures': {
105+
date.isoformat() : list(
106+
map(lambda sd: sd['packet'],
107+
filter(lambda sig, d=date: sig['date'] == d,
108+
sig_dicts
109+
)
110+
)
111+
) for date in dates
112+
}
113+
}

0 commit comments

Comments
 (0)