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.

122 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, **params):
  67. """Return events with params"""
  68. cal_id = params.pop("cal_id")
  69. service = self.service
  70. try:
  71. cal_id = self.ids[cal_id]
  72. except KeyError:
  73. pass
  74. page_token = None
  75. first = True
  76. while page_token is not None or first:
  77. first = False
  78. event_service = service.events()
  79. events = event_service.list(
  80. calendarId=cal_id, pageToken=page_token, **params
  81. ).execute()
  82. for event in events["items"]:
  83. yield event
  84. page_token = events.get("nextPageToken")
  85. def get_events_in_range(
  86. self,
  87. cal_id,
  88. start_date: datetime.datetime = None,
  89. end_date: datetime.datetime = None,
  90. ):
  91. """Returns events in between the given time range"""
  92. if start_date is not None:
  93. start_date = start_date.isoformat()
  94. if end_date is not None:
  95. end_date = end_date.isoformat()
  96. yield from self.get_events(cal_id=cal_id, timeMin=start_date, timeMax=end_date)
  97. def get_event_by_id(self, cal_id, event_id):
  98. """Retrieves event from cal_id and event_id"""
  99. service = self.service
  100. event_service = service.events()
  101. return event_service.get(calendarId=cal_id, eventId=event_id).execute()
  102. def delete_event(self, cal_id, event_id):
  103. service = self.service
  104. event_service = service.events()
  105. return event_service.delete(calendarId=cal_id, eventId=event_id).execute()