You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
3.0 KiB

import os
from googleapiclient.errors import HttpError
import gapi
from gapi.apis.base_api import API
APPLICATION_NAME = "Google Calendar API Python"
class calendar_api(API):
def __init__(
self,
app_name,
client_secret_file=os.path.join(gapi.state_dir, "client_secret.json"),
credentials_dir=gapi.state_dir,
scopes="https://www.googleapis.com/auth/calendar",
version="v3",
):
super().__init__(
"calendar", scopes, app_name, client_secret_file, credentials_dir, version
)
self.calendars = self.get_calendars()
self.ids = dict(
(calendar["summary"].lower(), calendar["id"]) for calendar in self.calendars
)
def create_event(self, calendar_id, body):
try:
calendar_id = self.ids[calendar_id]
except KeyError:
pass
service = self.service
event_service = service.events()
event = event_service.insert(calendarId=calendar_id, body=body).execute()
return event["id"]
def update_event(self, calendar_id, event_id, body):
try:
calendar_id = self.ids[calendar_id]
except KeyError:
pass
service = self.service
event_service = service.events()
try:
event = event_service.get(
calendarId=calendar_id, eventId=event_id
).execute()
except HttpError as e:
if e.resp.status == 404:
return self.create_event(calendar_id, body)
updated_event = (
service.events()
.update(calendarId=calendar_id, eventId=event["id"], body=body)
.execute()
)
return updated_event["id"]
def get_calendars(self):
page_token = None
cl = []
first = True
while page_token or first:
first = False
calendar_list_service = self.service.calendarList()
calendar_list = calendar_list_service.list(pageToken=page_token).execute()
cl += list(calendar_entry for calendar_entry in calendar_list["items"])
page_token = calendar_list.get("nextPageToken")
return cl
def get_events(self, cal_id):
service = self.service
try:
cal_id = self.ids[cal_id]
except KeyError:
pass
page_token = None
ret = []
while True:
event_service = service.events()
events = event_service.list(
calendarId=cal_id, pageToken=page_token
).execute()
ret += events["items"]
page_token = events.get("nextPageToken")
if not page_token:
break
return ret
def get_event_by_id(self, cal_id, event_id):
"""Retrieves event from cal_id and event_id"""
service = self.service
event_service = service.events()
return event_service.get(calendarId=cal_id, eventId=event_id).execute()