5252class OurJSON :
5353 rooms = set ()
5454 tracks = set ()
55- sessions = set ()
55+ sessions_by_name = {}
56+ sessions_by_nid = {}
5657
5758 FIELD_MAPPING = {
5859 "tracks" : "Track" ,
@@ -64,25 +65,29 @@ def __init__(self, path, logger):
6465 if path .startswith ("http://" ) or path .startswith ("https://" ):
6566 response = requests .get (path )
6667 blob = response .text
67- self .sessions = self .load_json (blob )
6868 else :
6969 blob = open (path , "r" ).read ()
70- self .session = self .load_json (blob )
70+ self . sessions_by_name , self .sessions_by_nid = self .load_json (blob )
7171
7272 def load_json (self , raw ):
7373 self .logger .info ("Loading JSON file" )
7474 raw = json .loads (raw )
75- data = []
75+ data_by_name = {}
76+ data_by_nid = {}
7677 for session in raw :
78+ # handle leading/trailing spaces in names
79+ name = session ["Name" ].strip ()
80+ session ["Name" ] = name
7781 track = session [self .FIELD_MAPPING ["tracks" ]].strip ()
7882 room = session [self .FIELD_MAPPING ["rooms" ]].strip ()
7983 if track != "" :
8084 self .tracks .add (track )
8185 if room != "" :
8286 self .rooms .add (room )
8387 clean_session = {k : v .strip () for k , v in session .items ()}
84- data .append (clean_session )
85- return data
88+ data_by_name [name ] = clean_session
89+ data_by_nid [session ["nid" ]] = clean_session
90+ return (data_by_name , data_by_nid )
8691
8792
8893class GuideBook :
@@ -106,12 +111,15 @@ class GuideBook:
106111 "Developer" : "#d65c09" ,
107112 "DevOpsDay LA" : "#565448" ,
108113 "Embedded Linux" : "#004a4a" ,
114+ "Entertainment" : "#ff6f91" ,
115+ "Fedora Hatch Day" : "#294172" ,
109116 "FOSS @ HOME" : "#998876" ,
110117 "General" : "#97a67a" ,
111118 "HAM Radio" : "#96beef" ,
112119 "Higher Education" : "#fff8dc" , # Open Source in Higher Education
113120 "Kernel & Low Level Systems" : "#ffa200" ,
114121 "Keynote" : "#d31111" ,
122+ "Kwaai Summit" : "#4b2e83" ,
115123 "MySQL" : "#0aaca0" ,
116124 "Next Generation" : "#96f74b" , # The Next Generation
117125 "Observability" : "#ffbc00" ,
@@ -155,14 +163,18 @@ class GuideBook:
155163
156164 REGIONED_MAP = "Pasadena-Convention-Center-Map-1000-72-fs8"
157165
158- def __init__ (self , logger , update , key , x_key = None ):
166+ def __init__ (self , logger , update , dryrun , key , x_key = None ):
159167 self .logger = logger
160168 self .update = update
169+ self .dryrun = dryrun
161170 self .headers = {"Authorization" : "JWT " + key }
162171 self .guide = self .get_guide ()
163172 self .tracks = self .get_things ("tracks" )
164173 self .rooms = self .get_things ("rooms" )
165174 self .sessions = self .get_things ("sessions" )
175+ self .sessions_by_nid = {
176+ session ["import_id" ]: session for session in self .sessions .values ()
177+ }
166178 self .x_rooms = []
167179
168180 if x_key :
@@ -253,6 +265,12 @@ def add_thing(self, thing, name, data, update, tid):
253265 self .logger .info ("%s %s '%s' to Guidebook" % (verb , thing , name ))
254266 self .logger .debug ("Data: %s" % data )
255267 headers = self .headers if not thing .startswith ("x-" ) else self .x_headers
268+ if self .dryrun :
269+ self .logger .info (
270+ "[DRYRUN] Would have %s %s '%s' to Guidebook"
271+ % (verb , thing , name )
272+ )
273+ return
256274 if update :
257275 response = requests .patch (
258276 self .URLS [thing ] + "%d/" % tid , data = data , headers = headers
@@ -414,7 +432,7 @@ def get_id(self, thing, session):
414432 ourlist = getattr (self , thing )
415433 self .logger .debug ("List of %s's is %s" % (thing , ourlist .keys ()))
416434 ourid = None
417- if session [key ] in ourlist :
435+ if session [key ] in ourlist and ourlist [ session [ key ]] is not None :
418436 ourid = ourlist [session [key ]]["id" ]
419437 else :
420438 ourlist = getattr (self , "x_%s" % thing )
@@ -438,26 +456,50 @@ def add_session(self, session, update, sid=None):
438456 "schedule_tracks" : self .get_id ("tracks" , session ),
439457 "locations" : self .get_id ("rooms" , session ),
440458 "add_to_schedule" : True ,
459+ "import_id" : session ["nid" ],
441460 }
442461 self .logger .debug ("Data: %s" % data )
443462 self .sessions [name ] = self .add_thing (
444463 "sessions" , name , data , update , sid
445464 )
446465
447- def setup_sessions (self , sessions ):
466+ def setup_sessions (self , sessions_by_name , sessions_by_nid ):
448467 """
449468 Add all rooms passed in if missing.
450469 """
451- for session in sessions :
470+ # first walk all already existing sessions, if they don't have
471+ # an NID, add one
472+ for name , info in self .sessions .items ():
473+ if info ["import_id" ] is None :
474+ if name in sessions_by_name .keys ():
475+ self .logger .info (
476+ "Adding NID %s to session '%s'" ,
477+ info ["import_id" ],
478+ name ,
479+ )
480+ session = sessions_by_name [name ]
481+ update = True
482+ sid = self .sessions [name ]["id" ]
483+ self .add_session (session , update , sid , True )
484+ else :
485+ self .logger .warning (
486+ "Session '%s' exists in Guidebook but not in our data. "
487+ "It will be left alone, but you may want to delete it." ,
488+ name ,
489+ )
490+
491+ # now loop through pass in sessions, and add/update as needed
492+ for nid , session in sessions_by_nid .items ():
452493 name = session ["Name" ]
453494 update = False
454495 sid = None
455496 if session ["StartTime" ] == "" :
456497 self .logger .warning ("Skipping %s - no date" % name )
457498 continue
458- if name in self .sessions :
499+ nid = session ["nid" ]
500+ if nid in self .sessions_by_nid :
459501 update = True
460- sid = self .sessions [ name ]["id" ]
502+ sid = self .sessions_by_nid [ nid ]["id" ]
461503 self .add_session (session , update , sid )
462504
463505 def delete_sessions (self ):
@@ -579,7 +621,13 @@ def get_tokens(logger):
579621 default = DBASE_DEFAULT ,
580622 help = "JSON file or http(s) URL to JSON data." ,
581623)
582- def main (debug , update , delete_all , feed ):
624+ @click .option (
625+ "--dryrun/--no-dryrun" ,
626+ "-n" ,
627+ default = False ,
628+ help = "Don't actually make any changes to Guidebook." ,
629+ )
630+ def main (debug , update , delete_all , feed , dryrun ):
583631 """
584632 Sync the schedule data from our website to Guidebook.
585633
@@ -605,7 +653,7 @@ def main(debug, update, delete_all, feed):
605653 ch .setFormatter (formatter )
606654 logger .addHandler (ch )
607655
608- ( key , x_key ) = get_tokens (logger )
656+ key , x_key = get_tokens (logger )
609657
610658 if delete_all :
611659 print ("WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ) # noqa: E999
@@ -615,13 +663,15 @@ def main(debug, update, delete_all, feed):
615663 else :
616664 ourdata = OurJSON (feed , logger )
617665
618- ourguide = GuideBook (logger , update , key , x_key = x_key )
666+ ourguide = GuideBook (logger , update , dryrun , key , x_key = x_key )
619667 if delete_all :
620668 ourguide .delete_all ()
621669 else :
622670 ourguide .setup_tracks (ourdata .tracks )
623671 ourguide .setup_rooms (ourdata .rooms )
624- ourguide .setup_sessions (ourdata .sessions )
672+ ourguide .setup_sessions (
673+ ourdata .sessions_by_name , ourdata .sessions_by_nid
674+ )
625675 if x_key :
626676 ourguide .setup_x_map_regions ()
627677 # unclear exactly when this is needed.
0 commit comments