From 4a57aec0f0327937c87d4a2d6f07c4ae5b58cd42 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Mon, 23 Mar 2020 21:57:04 +0100 Subject: [PATCH] One more change of data model --- db.ddl | 20 +++++++++------ fetch-meetings.py | 63 ++++++++++++++++++++++++----------------------- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/db.ddl b/db.ddl index e969836..d745abb 100644 --- a/db.ddl +++ b/db.ddl @@ -1,18 +1,24 @@ CREATE TABLE zoom_users ( - id serial PRIMARY KEY, -- our internal + uid serial PRIMARY KEY, user_id varchar(255) UNIQUE NOT NULL, -- Zoom's email varchar(255) NOT NULL, full_name varchar(255) NOT NULL ); CREATE TABLE zoom_meetings ( - id serial PRIMARY KEY, -- our internal - meeting_id int NOT NULL, -- Zoom's meeting ID + mid serial PRIMARY KEY, + meeting_id int UNIQUE NOT NULL, -- Zoom's meeting ID uuid varchar(255) NOT NULL, -- Zoom's meeting instance ID - occurrence_id bigint DEFAULT NULL, -- Occurrence for recurring meetings - host_id int NOT NULL REFERENCES zoom_users(id), + host_uid int NOT NULL REFERENCES zoom_users(uid), topic varchar(255) DEFAULT '', - type int NOT NULL, -- 1=instant, 2=scheduled, 3=recurring no time, 8=recurring fixed time + type int NOT NULL -- 1=instant, 2=scheduled, 3=recurring no time, 8=recurring fixed time +); + +CREATE TABLE zoom_schedule ( + id serial PRIMARY KEY, + mid int NOT NULL REFERENCES zoom_meetings(mid), + occurrence_id bigint DEFAULT 0, -- Occurrence for recurring meetings, 0 otherwise start_time timestamp NOT NULL, - duration int NOT NULL -- minutes + duration int NOT NULL, -- minutes + UNIQUE(mid, occurrence_id) ); diff --git a/fetch-meetings.py b/fetch-meetings.py index 7037637..fbdf86d 100755 --- a/fetch-meetings.py +++ b/fetch-meetings.py @@ -8,7 +8,6 @@ import psycopg2 import psycopg2.extras import time import dateutil.parser -# import dateutil.tz import sys verbose = True @@ -23,14 +22,11 @@ db_conn = psycopg2.connect(dbname=config['db']['name'], user=config['db']['user' db = db_conn.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) -def parse_time(iso_time, tz_name): - utc = dateutil.parser.isoparse(iso_time) - # tz = dateutil.tz.gettz(tz_name) - # return utc.astimezone(tz) - return utc +def parse_time(iso_time): + return dateutil.parser.isoparse(iso_time) -def add_recurring(uid, meet): +def add_recurring(mid, meet): time.sleep(0.2) resp = client.meeting.get(host_id = meet['host_id'], id = meet['id']) resp.raise_for_status() @@ -40,45 +36,49 @@ def add_recurring(uid, meet): for occ in details["occurrences"]: db.execute(""" - INSERT INTO zoom_meetings - (meeting_id, uuid, occurrence_id, host_id, topic, type, start_time, duration) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s) + INSERT INTO zoom_schedule + (mid, occurrence_id, start_time, duration) + VALUES (%s, %s, %s, %s) """, ( - meet['id'], - meet['uuid'], + mid, occ['occurrence_id'], - uid, - meet['topic'], - meet['type'], - parse_time(occ['start_time'], meet['timezone']), + parse_time(occ['start_time']), occ['duration'], )) def add_meeting(uid, meet): - type = meet['type'] - if type == 3: - # Type 3 meetings (scheduled with no time) are ignored - return - - if type == 8: - # Recurring meetings: need to ask for the list of occurrences - add_recurring(uid, meet) - return - db.execute(""" INSERT INTO zoom_meetings - (meeting_id, uuid, host_id, topic, type, start_time, duration) - VALUES (%s, %s, %s, %s, %s, %s, %s) + (meeting_id, uuid, host_uid, topic, type) + VALUES (%s, %s, %s, %s, %s) + RETURNING mid """, ( meet['id'], meet['uuid'], uid, meet['topic'], meet['type'], - parse_time(meet['start_time'], meet['timezone']), - meet['duration'], )) + meeting_row = db.fetchone() + mid = meeting_row.mid + + mtype = meet['type'] + if mtype == 8: + # Recurring meetings: need to ask for the list of occurrences + add_recurring(mid, meet) + elif 'start_time' in meet: + # Other meetings usually have a starting time + db.execute(""" + INSERT INTO zoom_schedule + (mid, occurrence_id, start_time, duration) + VALUES (%s, %s, %s, %s) + """, ( + mid, + 0, + parse_time(meet['start_time']), + meet['duration'], + )) def get_meetings(uid, user_id): @@ -111,11 +111,12 @@ def get_meetings(uid, user_id): assert total_rec == expected_rec, "Unexpected number of records, probably because of race condition" +db.execute('DELETE FROM zoom_schedule') db.execute('DELETE FROM zoom_meetings') db.execute("SELECT * FROM zoom_users") users = db.fetchall() for u in users: - get_meetings(u.id, u.user_id) + get_meetings(u.uid, u.user_id) db_conn.commit() -- GitLab