55from secrets import token_hex
66from datetime import datetime , time , timedelta
77import csv
8+ from itertools import chain
89import click
910
1011from . import app , db
11- from .models import Freshman , Packet , UpperSignature , FreshSignature
12+ from .models import *
1213from .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