From 6a946e276613e36ee3a3cd91317905baca13bae5 Mon Sep 17 00:00:00 2001 From: Max Meinhold Date: Sat, 14 Sep 2019 01:38:07 -0400 Subject: [PATCH 1/3] Create stats route for a specific packet ID --- packet/routes/api.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packet/routes/api.py b/packet/routes/api.py index 4b0d97a8..91d68dfc 100644 --- a/packet/routes/api.py +++ b/packet/routes/api.py @@ -252,6 +252,39 @@ 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)] + + upper_stats = dict() + for date in map(lambda sig: sig.updated, filter(lambda sig: sig.signed, packet.upper_signatures)): + upper_stats[date.date()] = upper_stats.get(date.date(), 0) + 1 + + fresh_stats = dict() + for date in map(lambda sig: sig.updated, filter(lambda sig: sig.signed, packet.fresh_signatures)): + fresh_stats[date.date()] = fresh_stats.get(date.date(), 0) + 1 + + misc_stats = dict() + for date in map(lambda sig: sig.updated, packet.misc_signatures): + misc_stats[date.date()] = misc_stats.get(date.date(), 0) + 1 + + total_stats = dict() + for date in dates: + total_stats[date.isoformat()] = { + 'upper': upper_stats.get(date, 0), + 'fresh': fresh_stats.get(date, 0), + 'misc': misc_stats.get(date, 0), + } + + return { + 'packet_id': packet_id, + 'dates': total_stats, + } + + def commit_sig(packet, was_100, uid): packet_signed_notification(packet, uid) db.session.commit() From 6206d1cf0d9b9b7f7d1fd6ff60d92b7a6e010f36 Mon Sep 17 00:00:00 2001 From: Max Meinhold Date: Sun, 6 Oct 2019 15:11:49 -0400 Subject: [PATCH 2/3] Use list of usernames in stats route outputs --- packet/routes/api.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/packet/routes/api.py b/packet/routes/api.py index 91d68dfc..d232e324 100644 --- a/packet/routes/api.py +++ b/packet/routes/api.py @@ -257,26 +257,30 @@ def report(info): 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)] + dates = [packet.start.date() + timedelta(days=x) for x in range(0, (packet.end-packet.start).days + 1)] - upper_stats = dict() - for date in map(lambda sig: sig.updated, filter(lambda sig: sig.signed, packet.upper_signatures)): - upper_stats[date.date()] = upper_stats.get(date.date(), 0) + 1 + print(dates) - fresh_stats = dict() - for date in map(lambda sig: sig.updated, filter(lambda sig: sig.signed, packet.fresh_signatures)): - fresh_stats[date.date()] = fresh_stats.get(date.date(), 0) + 1 + 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) - misc_stats = dict() - for date in map(lambda sig: sig.updated, packet.misc_signatures): - misc_stats[date.date()] = misc_stats.get(date.date(), 0) + 1 + 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.get(date, 0), - 'fresh': fresh_stats.get(date, 0), - 'misc': misc_stats.get(date, 0), + 'upper': upper_stats[date], + 'fresh': fresh_stats[date], + 'misc': misc_stats[date], } return { From 0a32b0d5ef076da3f62a532521347b62c748da3d Mon Sep 17 00:00:00 2001 From: Max Meinhold Date: Mon, 20 Jan 2020 00:14:46 -0500 Subject: [PATCH 3/3] Add Upperclassman stats route An initial pass at the router, very messy (and written late at night) --- packet/routes/api.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/packet/routes/api.py b/packet/routes/api.py index d232e324..f3d2f0f0 100644 --- a/packet/routes/api.py +++ b/packet/routes/api.py @@ -252,7 +252,7 @@ def report(info): return 'Success: ' + get_rit_name(info['uid']) + ' sent a report' -@app.route("/api/v1/stats/packet/") +@app.route('/api/v1/stats/packet/') @packet_auth def packet_stats(packet_id): packet = Packet.by_id(packet_id) @@ -289,6 +289,47 @@ def packet_stats(packet_id): } +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()