diff --git a/packet/routes/api.py b/packet/routes/api.py index 4b0d97a8..f3d2f0f0 100644 --- a/packet/routes/api.py +++ b/packet/routes/api.py @@ -252,6 +252,84 @@ def report(info): return 'Success: ' + get_rit_name(info['uid']) + ' sent a report' +@app.route('/api/v1/stats/packet/') +@packet_auth +def packet_stats(packet_id): + packet = Packet.by_id(packet_id) + + dates = [packet.start.date() + timedelta(days=x) for x in range(0, (packet.end-packet.start).days + 1)] + + print(dates) + + upper_stats = {date: list() for date in dates} + for uid, date in map(lambda sig: (sig.member, sig.updated), + filter(lambda sig: sig.signed, packet.upper_signatures)): + upper_stats[date.date()].append(uid) + + fresh_stats = {date: list() for date in dates} + for username, date in map(lambda sig: (sig.freshman_username, sig.updated), + filter(lambda sig: sig.signed, packet.fresh_signatures)): + fresh_stats[date.date()].append(username) + + misc_stats = {date: list() for date in dates} + for uid, date in map(lambda sig: (sig.member, sig.updated), packet.misc_signatures): + misc_stats[date.date()].append(uid) + + total_stats = dict() + for date in dates: + total_stats[date.isoformat()] = { + 'upper': upper_stats[date], + 'fresh': fresh_stats[date], + 'misc': misc_stats[date], + } + + return { + 'packet_id': packet_id, + 'dates': total_stats, + } + + +def sig2dict(sig): + """ + A utility function for upperclassman stats. + Converts an UpperSignature to a dictionary with the date and the packet. + """ + packet = Packet.by_id(sig.packet_id) + return { + 'date': sig.updated.date(), + 'packet': { + 'id': packet.id, + 'freshman_username': packet.freshman_username, + }, + } + + +@app.route('/api/v1/stats/upperclassman/') +@packet_auth +def upperclassman_stats(uid): + + sigs = UpperSignature.query.filter( + UpperSignature.signed, + UpperSignature.member == uid + ).all() + MiscSignature.query.filter(MiscSignature.member == uid).all() + + sig_dicts = list(map(sig2dict, sigs)) + + dates = set(map(lambda sd: sd['date'], sig_dicts)) + + return { + 'member': uid, + 'signatures': { + date.isoformat() : list( + map(lambda sd: sd['packet'], + filter(lambda sig, d=date: sig['date'] == d, + sig_dicts + ) + ) + ) for date in dates + } + } + def commit_sig(packet, was_100, uid): packet_signed_notification(packet, uid) db.session.commit()