|
1 | | -import copy |
| 1 | +from datetime import datetime |
2 | 2 | from functools import lru_cache |
3 | 3 |
|
| 4 | +from sqlalchemy import exc |
| 5 | + |
4 | 6 | from packet.ldap import ldap_get_member, ldap_is_intromember |
5 | | -from .models import Freshman, UpperSignature, FreshSignature, MiscSignature, db |
| 7 | +from .models import Freshman, UpperSignature, FreshSignature, MiscSignature, db, Packet |
6 | 8 |
|
7 | 9 |
|
8 | 10 | def sign(signer_username, freshman_username): |
@@ -34,20 +36,81 @@ def sign(signer_username, freshman_username): |
34 | 36 | return True |
35 | 37 |
|
36 | 38 |
|
| 39 | +def get_essays(freshman_username): |
| 40 | + packet = Freshman.query.filter_by(rit_username=freshman_username).first().current_packet() |
| 41 | + return {'eboard': packet.info_eboard, |
| 42 | + 'events': packet.info_events, |
| 43 | + 'achieve': packet.info_achieve} |
| 44 | + |
| 45 | + |
| 46 | +def set_essays(freshman_username, eboard=None, events=None, achieve=None): |
| 47 | + packet = Freshman.query.filter_by(rit_username=freshman_username).first().current_packet() |
| 48 | + if eboard is not None: |
| 49 | + packet.info_eboard = eboard |
| 50 | + if events is not None: |
| 51 | + packet.info_events = events |
| 52 | + if achieve is not None: |
| 53 | + packet.info_achieve = achieve |
| 54 | + try: |
| 55 | + db.session.commit() |
| 56 | + except exc.SQLAlchemyError: |
| 57 | + return False |
| 58 | + return True |
| 59 | + |
| 60 | + |
37 | 61 | @lru_cache(maxsize=2048) |
38 | 62 | def get_signatures(freshman_username): |
39 | | - packet = get_current_packet(freshman_username) |
40 | | - eboard = UpperSignature.query.filter_by(packet_id=packet.id, eboard=True).order_by(UpperSignature.signed.desc()) |
41 | | - upper_signatures = UpperSignature.query.filter_by(packet_id=packet.id, eboard=False).order_by( |
42 | | - UpperSignature.signed.desc()) |
43 | | - fresh_signatures = FreshSignature.query.filter_by(packet_id=packet.id).order_by(FreshSignature.signed.desc()) |
44 | | - misc_signatures = MiscSignature.query.filter_by(packet_id=packet.id) |
| 63 | + """ |
| 64 | + Gets a list of all signatures for the given member |
| 65 | + :param freshman_username: the freshman to get the signatures in their most recent packet |
| 66 | + :return: <dict><list> list of signatures for the different categories |
| 67 | + """ |
| 68 | + packet = Freshman.query.filter_by(rit_username=freshman_username).first().current_packet() |
| 69 | + |
| 70 | + eboard = db.session.query(UpperSignature.member, UpperSignature.signed, Freshman.rit_username) \ |
| 71 | + .select_from(UpperSignature).join(Packet).join(Freshman) \ |
| 72 | + .filter(UpperSignature.packet_id == packet.id, UpperSignature.eboard.is_(True)) \ |
| 73 | + .order_by(UpperSignature.signed.desc()) \ |
| 74 | + .distinct().all() |
| 75 | + |
| 76 | + upper_signatures = db.session.query(UpperSignature.member, UpperSignature.signed, Freshman.rit_username) \ |
| 77 | + .select_from(UpperSignature).join(Packet).join(Freshman) \ |
| 78 | + .filter(UpperSignature.packet_id == packet.id, UpperSignature.eboard.is_(False))\ |
| 79 | + .order_by(UpperSignature.signed.desc())\ |
| 80 | + .distinct().all() |
| 81 | + fresh_signatures = \ |
| 82 | + db.session.query(FreshSignature.freshman_username, FreshSignature.signed, Freshman.rit_username, Freshman.name) \ |
| 83 | + .select_from(Packet).join(FreshSignature).join(Freshman) \ |
| 84 | + .filter(FreshSignature.packet_id == packet.id) \ |
| 85 | + .order_by(FreshSignature.signed.desc()) \ |
| 86 | + .distinct().all() |
| 87 | + |
| 88 | + misc_signatures = db.session.query(MiscSignature.member, Freshman.rit_username)\ |
| 89 | + .select_from(MiscSignature).join(Packet).join(Freshman) \ |
| 90 | + .filter(MiscSignature.packet_id == packet.id) \ |
| 91 | + .distinct().all() |
| 92 | + |
45 | 93 | return {'eboard': eboard, |
46 | 94 | 'upperclassmen': upper_signatures, |
47 | 95 | 'freshmen': fresh_signatures, |
48 | 96 | 'misc': misc_signatures} |
49 | 97 |
|
50 | 98 |
|
| 99 | +def get_misc_signatures(): |
| 100 | + packet_misc_sigs = {} |
| 101 | + try: |
| 102 | + result = db.engine.execute(""" |
| 103 | + SELECT packet.freshman_username AS username, count(signature_misc.member) AS signatures FROM packet |
| 104 | + RIGHT OUTER JOIN signature_misc ON packet.id = signature_misc.packet_id |
| 105 | + GROUP BY packet.freshman_username; |
| 106 | + """) |
| 107 | + for packet in result: |
| 108 | + packet_misc_sigs[packet.username] = packet.signatures |
| 109 | + except exc.SQLAlchemyError: |
| 110 | + raise exc.SQLAlchemyError("Error: Unable to query miscellaneous signatures from database") |
| 111 | + return packet_misc_sigs |
| 112 | + |
| 113 | + |
51 | 114 | @lru_cache(maxsize=2048) |
52 | 115 | def valid_signature(signer_username, freshman_username): |
53 | 116 | if signer_username == freshman_username: |
@@ -75,24 +138,39 @@ def get_current_packet(freshman_username): |
75 | 138 |
|
76 | 139 |
|
77 | 140 | @lru_cache(maxsize=2048) |
78 | | -def get_number_signed(freshman_username): |
79 | | - return get_current_packet(freshman_username).signatures_received() |
| 141 | +def get_number_signed(freshman_username, separated=False): |
| 142 | + """ |
| 143 | + Gets the raw number of signatures for the user |
| 144 | + :param freshman_username: The user to get signature numbers for |
| 145 | + :param separated: A boolean indicating whether to return the results as separated |
| 146 | + :return: <Packet> list of results that are in the form of Packet database objects |
| 147 | + """ |
| 148 | + return db.session.query(Packet) \ |
| 149 | + .filter(Packet.freshman_username == freshman_username, |
| 150 | + Packet.start < datetime.now(), Packet.end > datetime.now()) \ |
| 151 | + .first().signatures_received(not separated) |
80 | 152 |
|
81 | 153 |
|
82 | 154 | @lru_cache(maxsize=2048) |
83 | | -def get_number_required(freshman_username): |
84 | | - return get_current_packet(freshman_username).signatures_required() |
| 155 | +def get_number_required(separated=False): |
| 156 | + """ |
| 157 | + Get the number of required signatures for Packet (not counting on/off-floor status) |
| 158 | + :param separated: whether or not to separate those by category |
| 159 | + :return: a map or an integer of total signatures required |
| 160 | + """ |
| 161 | + return db.session.query(Packet) \ |
| 162 | + .filter(Packet.start < datetime.now(), Packet.end > datetime.now()).first().signatures_required(not separated) |
85 | 163 |
|
86 | 164 |
|
87 | 165 | @lru_cache(maxsize=2048) |
88 | | -def get_upperclassmen_percent(uid): |
89 | | - upperclassmen_required = copy.deepcopy(get_number_required(uid)) |
90 | | - del upperclassmen_required['freshmen'] |
91 | | - upperclassmen_required = sum(upperclassmen_required.values()) |
92 | | - |
93 | | - upperclassmen_signature = copy.deepcopy(get_number_signed(uid)) |
94 | | - del upperclassmen_signature['freshmen'] |
95 | | - upperclassmen_signature = sum(upperclassmen_signature.values()) |
| 166 | +def get_upperclassmen_percent(username, onfloor=False): |
| 167 | + required = get_number_required(True) |
| 168 | + upperclassmen_required = required['upperclassmen'] + required['eboard'] + required['miscellaneous'] |
| 169 | + if onfloor: |
| 170 | + upperclassmen_required -= 1 |
| 171 | + |
| 172 | + signatures = get_number_signed(username, True) |
| 173 | + upperclassmen_signature = signatures['upperclassmen'] + signatures['eboard'] + signatures['miscellaneous'] |
96 | 174 |
|
97 | 175 | return upperclassmen_signature / upperclassmen_required * 100 |
98 | 176 |
|
|
0 commit comments