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.

121 lines
3.8 KiB

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