Skip to content

Commit 31d101b

Browse files
authored
Add unique identifier for sessions; add dry-run (#33)
Closes #32 Signed-off-by: Phil Dibowitz <phil@ipom.com>
1 parent b5367cd commit 31d101b

File tree

1 file changed

+66
-16
lines changed

1 file changed

+66
-16
lines changed

guidebook/sync_guidebook.py

Lines changed: 66 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@
5252
class 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

8893
class 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

Comments
 (0)