Skip to content

Commit 7166136

Browse files
committed
Created the ldap-sync command
1 parent 5c80131 commit 7166136

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

packet/commands.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
from secrets import token_hex
66
from datetime import datetime, time, timedelta
77
import csv
8+
from itertools import chain
89
import click
910

1011
from . import app, db
11-
from .models import Freshman, Packet, UpperSignature, FreshSignature
12+
from .models import *
1213
from .ldap import ldap_get_eboard, ldap_get_live_onfloor
1314

1415
@app.cli.command("create-secret")
@@ -119,3 +120,35 @@ def create_packets(freshmen_csv):
119120

120121
db.session.commit()
121122
print("Done!")
123+
124+
@app.cli.command("ldap-sync")
125+
def ldap_sync():
126+
print("Fetching data from LDAP...")
127+
eboard = set(member.uid for member in ldap_get_eboard())
128+
onfloor = set(member.uid for member in ldap_get_live_onfloor())
129+
all_upper = eboard.union(onfloor)
130+
131+
print("Applying updates to the DB...")
132+
for packet in Packet.query.filter(Packet.end > datetime.now()).all():
133+
# Update the eboard state of all UpperSignatures
134+
for sig in packet.upper_signatures:
135+
sig.eboard = sig.member in eboard
136+
137+
# Migrate UpperSignatures that are from accounts that are not eboard or onfloor anymore
138+
for sig in filter(lambda sig: sig.member not in all_upper, packet.upper_signatures):
139+
UpperSignature.query.filter_by(packet_id=packet.id, member=sig.member).delete()
140+
if sig.signed:
141+
db.session.add(MiscSignature(packet=packet, member=sig.member))
142+
143+
# Migrate MiscSignatures that are from accounts that are now eboard or onfloor members
144+
for sig in filter(lambda sig: sig.member in all_upper, packet.misc_signatures):
145+
MiscSignature.query.filter_by(packet_id=packet.id, member=sig.member).delete()
146+
db.session.add(UpperSignature(packet=packet, member=sig.member, eboard=sig.member in eboard, signed=True))
147+
148+
# Create UpperSignatures for any new eboard or onfloor members
149+
upper_sigs = set(map(lambda sig: sig.member, packet.upper_signatures))
150+
for member in filter(lambda member: member not in upper_sigs, all_upper):
151+
db.session.add(UpperSignature(packet=packet, member=member, eboard=member in eboard))
152+
153+
db.session.commit()
154+
print("Done!")

0 commit comments

Comments
 (0)