Skip to content

Commit 21ae9ce

Browse files
authored
Merge pull request #184 from mxmeinhold/stats
Stats Routes
2 parents b2b50a0 + 0a32b0d commit 21ae9ce

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

packet/routes/api.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,84 @@ def report(info):
252252
return 'Success: ' + get_rit_name(info['uid']) + ' sent a report'
253253

254254

255+
@app.route('/api/v1/stats/packet/<packet_id>')
256+
@packet_auth
257+
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+
}
305+
306+
307+
@app.route('/api/v1/stats/upperclassman/<uid>')
308+
@packet_auth
309+
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+
}
332+
255333
def commit_sig(packet, was_100, uid):
256334
packet_signed_notification(packet, uid)
257335
db.session.commit()

0 commit comments

Comments
 (0)