|
8 | 8 | import click |
9 | 9 |
|
10 | 10 | from . import app, db |
11 | | -from .models import Freshman, Packet, UpperSignature, FreshSignature |
| 11 | +from .models import Freshman, Packet, FreshSignature, UpperSignature, MiscSignature |
12 | 12 | from .ldap import ldap_get_eboard, ldap_get_live_onfloor |
13 | 13 |
|
14 | 14 | @app.cli.command("create-secret") |
@@ -100,27 +100,58 @@ def create_packets(freshmen_csv): |
100 | 100 | end = datetime.combine(base_date, time(hour=23, minute=59)) + timedelta(days=14) |
101 | 101 |
|
102 | 102 | print("Fetching data from LDAP...") |
103 | | - eboard = [member.uid for member in ldap_get_eboard()] |
104 | | - onfloor = [member.uid for member in ldap_get_live_onfloor()] |
| 103 | + eboard = set(member.uid for member in ldap_get_eboard()) |
| 104 | + onfloor = set(member.uid for member in ldap_get_live_onfloor()) |
| 105 | + all_upper = eboard.union(onfloor) |
105 | 106 |
|
106 | | - freshmen_in_csv = parse_csv(freshmen_csv) |
107 | | - |
108 | | - # Create the new packets and the signatures |
| 107 | + # Create the new packets and the signatures for each freshman in the given CSV |
109 | 108 | print("Creating DB entries...") |
110 | | - for freshman in freshmen_in_csv.values(): |
111 | | - packet = Packet(freshman=Freshman.query.filter_by(rit_username=freshman.rit_username).first(), start=start, |
112 | | - end=end) |
| 109 | + for freshman in Freshman.query.filter(Freshman.rit_username.in_(parse_csv(freshmen_csv))).all(): |
| 110 | + packet = Packet(freshman=freshman, start=start, end=end) |
113 | 111 | db.session.add(packet) |
114 | 112 |
|
115 | | - for username in eboard: |
116 | | - db.session.add(UpperSignature(packet=packet, member=username, eboard=True)) |
117 | | - |
118 | | - for username in onfloor: |
119 | | - db.session.add(UpperSignature(packet=packet, member=username)) |
| 113 | + for member in all_upper: |
| 114 | + db.session.add(UpperSignature(packet=packet, member=member, eboard=member in eboard)) |
120 | 115 |
|
121 | 116 | for onfloor_freshman in Freshman.query.filter_by(onfloor=True).filter(Freshman.rit_username != |
122 | 117 | freshman.rit_username).all(): |
123 | 118 | db.session.add(FreshSignature(packet=packet, freshman=onfloor_freshman)) |
124 | 119 |
|
125 | 120 | db.session.commit() |
126 | 121 | print("Done!") |
| 122 | + |
| 123 | +@app.cli.command("ldap-sync") |
| 124 | +def ldap_sync(): |
| 125 | + """ |
| 126 | + Updates the upper and misc sigs in the DB to match ldap. |
| 127 | + """ |
| 128 | + print("Fetching data from LDAP...") |
| 129 | + eboard = set(member.uid for member in ldap_get_eboard()) |
| 130 | + onfloor = set(member.uid for member in ldap_get_live_onfloor()) |
| 131 | + all_upper = eboard.union(onfloor) |
| 132 | + |
| 133 | + print("Applying updates to the DB...") |
| 134 | + for packet in Packet.query.filter(Packet.end > datetime.now()).all(): |
| 135 | + # Update the eboard state of all UpperSignatures |
| 136 | + for sig in packet.upper_signatures: |
| 137 | + sig.eboard = sig.member in eboard |
| 138 | + |
| 139 | + # Migrate UpperSignatures that are from accounts that are not eboard or onfloor anymore |
| 140 | + for sig in filter(lambda sig: sig.member not in all_upper, packet.upper_signatures): |
| 141 | + UpperSignature.query.filter_by(packet_id=packet.id, member=sig.member).delete() |
| 142 | + if sig.signed: |
| 143 | + db.session.add(MiscSignature(packet=packet, member=sig.member)) |
| 144 | + |
| 145 | + # Migrate MiscSignatures that are from accounts that are now eboard or onfloor members |
| 146 | + for sig in filter(lambda sig: sig.member in all_upper, packet.misc_signatures): |
| 147 | + MiscSignature.query.filter_by(packet_id=packet.id, member=sig.member).delete() |
| 148 | + db.session.add(UpperSignature(packet=packet, member=sig.member, eboard=sig.member in eboard, signed=True)) |
| 149 | + |
| 150 | + # Create UpperSignatures for any new eboard or onfloor members |
| 151 | + # pylint: disable=cell-var-from-loop |
| 152 | + upper_sigs = set(map(lambda sig: sig.member, packet.upper_signatures)) |
| 153 | + for member in filter(lambda member: member not in upper_sigs, all_upper): |
| 154 | + db.session.add(UpperSignature(packet=packet, member=member, eboard=member in eboard)) |
| 155 | + |
| 156 | + db.session.commit() |
| 157 | + print("Done!") |
0 commit comments