|
1 | | -from datetime import datetime |
2 | | -from itertools import chain |
| 1 | +""" |
| 2 | +Routes available to CSH users only |
| 3 | +""" |
3 | 4 |
|
4 | | -from flask import redirect, render_template |
5 | | -from sqlalchemy import func, case |
| 5 | +from flask import redirect, render_template, url_for |
| 6 | +from itertools import chain |
| 7 | +from operator import itemgetter |
6 | 8 |
|
7 | | -from packet import auth, app, db |
8 | | -from packet.models import Packet, UpperSignature, MiscSignature |
| 9 | +from packet import auth, app |
| 10 | +from packet.models import Packet, MiscSignature |
9 | 11 | from packet.utils import before_request |
10 | 12 |
|
11 | 13 |
|
12 | 14 | @app.route("/") |
13 | 15 | @auth.oidc_auth |
14 | 16 | def index(): |
15 | | - return redirect("/packets", 302) |
| 17 | + return redirect(url_for("packets"), 302) |
16 | 18 |
|
17 | 19 |
|
18 | | -@app.route("/member/<uid>") |
| 20 | +@app.route("/member/<uid>/") |
19 | 21 | @auth.oidc_auth |
20 | 22 | @before_request |
21 | 23 | def upperclassman(uid, info=None): |
22 | | - open_packets = Packet.query.filter(Packet.end > datetime.now()).filter(Packet.start < datetime.now()).all() |
23 | | - signatures = 0 |
| 24 | + open_packets = Packet.open_packets() |
24 | 25 |
|
| 26 | + # Pre-calculate and store the return value of did_sign() |
25 | 27 | for packet in open_packets: |
26 | | - packet.did_sign = False |
| 28 | + packet.did_sign_result = packet.did_sign(uid, True) |
27 | 29 |
|
28 | | - for sig in chain(filter(lambda sig: sig.signed, packet.upper_signatures), packet.misc_signatures): |
29 | | - if sig.member == uid: |
30 | | - packet.did_sign = True |
31 | | - signatures += 1 |
32 | | - break |
| 30 | + signatures = sum(map(lambda packet: 1 if packet.did_sign_result else 0, open_packets)) |
33 | 31 |
|
34 | | - open_packets.sort(key=lambda x: x.did_sign, reverse=True) |
| 32 | + open_packets.sort(key=lambda packet: packet.freshman_username) |
| 33 | + open_packets.sort(key=lambda packet: packet.did_sign_result, reverse=True) |
35 | 34 |
|
36 | 35 | return render_template("upperclassman.html", info=info, open_packets=open_packets, member=uid, |
37 | 36 | signatures=signatures) |
38 | 37 |
|
39 | 38 |
|
40 | | -@app.route("/upperclassmen") |
| 39 | +@app.route("/upperclassmen/") |
41 | 40 | @auth.oidc_auth |
42 | 41 | @before_request |
43 | 42 | def upperclassmen_total(info=None): |
44 | | - open_packets = Packet.query.filter(Packet.end > datetime.now()).filter(Packet.start < datetime.now()).count() |
| 43 | + open_packets = Packet.open_packets() |
45 | 44 |
|
46 | | - # TODO: Only count open Packets |
47 | | - upperclassmen = (db.session.query(func.count(case([(UpperSignature.signed == True, 1)])).label("signatures"), |
48 | | - UpperSignature.member)).group_by(UpperSignature.member).all() |
49 | | - upperclassmen += (db.session.query(func.count().label("signatures"), |
50 | | - MiscSignature.member)).group_by(MiscSignature.member).all() |
| 45 | + # Sum up the signed packets per upperclassman |
| 46 | + upperclassmen = dict() |
| 47 | + for packet in open_packets: |
| 48 | + for sig in chain(packet.upper_signatures, packet.misc_signatures): |
| 49 | + if sig.member not in upperclassmen: |
| 50 | + upperclassmen[sig.member] = 0 |
51 | 51 |
|
52 | | - upperclassmen.sort(reverse=True) |
| 52 | + if isinstance(sig, MiscSignature): |
| 53 | + upperclassmen[sig.member] += 1 |
| 54 | + elif sig.signed: |
| 55 | + upperclassmen[sig.member] += 1 |
53 | 56 |
|
54 | | - return render_template("upperclassmen_totals.html", info=info, upperclassmen=upperclassmen, |
55 | | - open_packets=open_packets) |
| 57 | + return render_template("upperclassmen_totals.html", info=info, num_open_packets=len(open_packets), |
| 58 | + upperclassmen=sorted(upperclassmen.items(), key=itemgetter(1), reverse=True)) |
0 commit comments