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.

100 lines
3.0 KiB

  1. import os
  2. from googleapiclient.errors import HttpError
  3. import gapi
  4. from gapi.apis.base_api import API
  5. APPLICATION_NAME = "Google Calendar API Python"
  6. class calendar_api(API):
  7. def __init__(
  8. self,
  9. app_name,
  10. client_secret_file=os.path.join(gapi.state_dir, "client_secret.json"),
  11. credentials_dir=gapi.state_dir,
  12. scopes="https://www.googleapis.com/auth/calendar",
  13. version="v3",
  14. ):
  15. super().__init__(
  16. "calendar", scopes, app_name, client_secret_file, credentials_dir, version
  17. )
  18. self.calendars = self.get_calendars()
  19. self.ids = dict(
  20. (calendar["summary"].lower(), calendar["id"])
  21. for calendar in self.calendars.values()
  22. )
  23. def create_event(self, calendar_id, body):
  24. try:
  25. calendar_id = self.ids[calendar_id]
  26. except KeyError:
  27. pass
  28. service = self.service
  29. event_service = service.events()
  30. event = event_service.insert(calendarId=calendar_id, body=body).execute()
  31. return event["id"]
  32. def update_event(self, calendar_id, event_id, body):
  33. try:
  34. calendar_id = self.ids[calendar_id]
  35. except KeyError:
  36. pass
  37. service = self.service
  38. event_service = service.events()
  39. try:
  40. event = event_service.get(
  41. calendarId=calendar_id, eventId=event_id
  42. ).execute()
  43. except HttpError as e:
  44. if e.resp.status == 404:
  45. return self.create_event(calendar_id, body)
  46. updated_event = (
  47. service.events()
  48. .update(calendarId=calendar_id, eventId=event["id"], body=body)
  49. .execute()
  50. )
  51. return updated_event["id"]
  52. def get_calendars(self):
  53. page_token = None
  54. cl = {}
  55. first = True
  56. while page_token or first:
  57. first = False
  58. calendar_list_service = self.service.calendarList()
  59. calendar_list = calendar_list_service.list(pageToken=page_token).execute()
  60. for calendar_entry in calendar_list["items"]:
  61. cl[calendar_entry["id"]] = calendar_entry
  62. page_token = calendar_list.get("nextPageToken")
  63. return cl
  64. def get_events(self, cal_id):
  65. service = self.service
  66. try:
  67. cal_id = self.ids[cal_id]
  68. except KeyError:
  69. pass
  70. page_token = None
  71. ret = []
  72. while True:
  73. event_service = service.events()
  74. events = event_service.list(
  75. calendarId=cal_id, pageToken=page_token
  76. ).execute()
  77. ret += events["items"]
  78. page_token = events.get("nextPageToken")
  79. if not page_token:
  80. break
  81. return ret
  82. def get_event_by_id(self, cal_id, event_id):
  83. """Retrieves event from cal_id and event_id"""
  84. service = self.service
  85. event_service = service.events()
  86. return event_service.get(calendarId=cal_id, eventId=event_id).execute()