forked from Ugric/cov-to-ics
timezone fixes, completed
This commit is contained in:
69
main.py
69
main.py
@@ -1,9 +1,10 @@
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from googleapiclient.discovery import build
|
||||
from httplib2 import Http
|
||||
from oauth2client import file, client, tools
|
||||
import pytz
|
||||
|
||||
URL = open("timetableurl").read().strip()
|
||||
|
||||
@@ -38,51 +39,79 @@ def parse_events(page_data):
|
||||
|
||||
parsed_data = eval(cleaned_data)
|
||||
|
||||
# Parse the datetime info
|
||||
for event in parsed_data:
|
||||
if "start" in event:
|
||||
event["start"] = list(event["start"])
|
||||
event["start"][1] += 1
|
||||
event["start"].append(0)
|
||||
event["start"] = datetime(*event["start"])
|
||||
event["start"] = pytz.timezone("Europe/London").localize(event["start"])
|
||||
|
||||
if "end" in event:
|
||||
event["end"] = list(event["end"])
|
||||
event["end"][1] += 1
|
||||
event["end"].append(0)
|
||||
event["end"] = datetime(*event["end"])
|
||||
event["end"] = pytz.timezone("Europe/London").localize(event["end"])
|
||||
|
||||
return parsed_data
|
||||
|
||||
def get_timetable_data(url):
|
||||
return requests.get(url).text
|
||||
|
||||
def create_google_event(event):
|
||||
new_event = event.copy()
|
||||
|
||||
if not new_event:
|
||||
return new_event
|
||||
|
||||
# Make the event the correct format
|
||||
new_event["summary"] = event["moduleDesc"] + " - " + event["title"]
|
||||
new_event["description"] = event["lecturer"] + " - " + event["room"]
|
||||
|
||||
new_event["end"] = {"dateTime": str(event["end"].isoformat()), "timeZone": "Europe/London"}
|
||||
new_event["start"] = {"dateTime": str(event["start"].isoformat()), "timeZone": "Europe/London"}
|
||||
|
||||
new_event["reminders"] = {'useDefault': False,
|
||||
'overrides': [{'method': 'popup', 'minutes': 30}]}
|
||||
return new_event
|
||||
|
||||
# If modifying these scopes, delete the file token.json.
|
||||
SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'
|
||||
SCOPES = 'https://www.googleapis.com/auth/calendar'
|
||||
|
||||
def main():
|
||||
"""Shows basic usage of the Google Calendar API.
|
||||
Prints the start and name of the next 10 events on the user's calendar.
|
||||
"""
|
||||
|
||||
type_to_color = {}
|
||||
color_queue = list(range(0, 12))
|
||||
|
||||
store = file.Storage('token.json')
|
||||
creds = store.get()
|
||||
|
||||
if not creds or creds.invalid:
|
||||
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
|
||||
creds = tools.run_flow(flow, store)
|
||||
service = build('calendar', 'v3', http=creds.authorize(Http()))
|
||||
|
||||
# Call the Calendar API
|
||||
now = datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
|
||||
print('Getting the upcoming 10 events')
|
||||
events_result = service.events().list(calendarId='primary', timeMin=now,
|
||||
maxResults=10, singleEvents=True,
|
||||
orderBy='startTime').execute()
|
||||
events = events_result.get('items', [])
|
||||
cov_events = parse_events(get_timetable_data(URL))
|
||||
|
||||
if not events:
|
||||
print('No upcoming events found.')
|
||||
for event in events:
|
||||
start = event['start'].get('dateTime', event['start'].get('date'))
|
||||
print(start, event['summary'])
|
||||
|
||||
new_event = parse_events(requests.get(URL).text)[0]
|
||||
new_event["title"] += " - " + new_event["lecturer"]
|
||||
new_event["description"] = new_event[""]
|
||||
print(new_event)
|
||||
service.events().insert(body=new_event).execute()
|
||||
for event in cov_events:
|
||||
new_event = create_google_event(event)
|
||||
|
||||
color_type = new_event["mainColor"]
|
||||
|
||||
if color_type in type_to_color:
|
||||
colorId = type_to_color[color_type]
|
||||
else:
|
||||
colorId = color_queue.pop(0)
|
||||
color_queue.append(colorId)
|
||||
type_to_color[color_type] = colorId
|
||||
|
||||
new_event["colorId"] = colorId
|
||||
|
||||
service.events().insert(body=new_event, calendarId='primary').execute()
|
||||
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user