Skip to content

Commit 93b4c13

Browse files
authored
Merge pull request #24 from JoelEager/cli-improvements
CLI improvements
2 parents 22471bb + f0cb3b5 commit 93b4c13

File tree

1 file changed

+45
-14
lines changed

1 file changed

+45
-14
lines changed

packet/commands.py

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import click
99

1010
from . import app, db
11-
from .models import Freshman, Packet, UpperSignature, FreshSignature
11+
from .models import Freshman, Packet, FreshSignature, UpperSignature, MiscSignature
1212
from .ldap import ldap_get_eboard, ldap_get_live_onfloor
1313

1414
@app.cli.command("create-secret")
@@ -100,27 +100,58 @@ def create_packets(freshmen_csv):
100100
end = datetime.combine(base_date, time(hour=23, minute=59)) + timedelta(days=14)
101101

102102
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)
105106

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
109108
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)
113111
db.session.add(packet)
114112

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))
120115

121116
for onfloor_freshman in Freshman.query.filter_by(onfloor=True).filter(Freshman.rit_username !=
122117
freshman.rit_username).all():
123118
db.session.add(FreshSignature(packet=packet, freshman=onfloor_freshman))
124119

125120
db.session.commit()
126121
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

Comments
 (0)