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.

120 lines
3.9 KiB

  1. from gapi.api import API
  2. import datetime
  3. import argparse
  4. import tzlocal
  5. from oauth2client import tools
  6. flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
  7. APPLICATION_NAME = 'Google Calendar API Python'
  8. def dateTime(datetime):
  9. if not datetime.tzinfo:
  10. datetime = datetime.astimezone()
  11. zone = tzlocal.get_localzone().zone
  12. datetime = datetime.isoformat(timespec='seconds')
  13. return {
  14. "timeZone":zone,
  15. "dateTime":datetime,
  16. }
  17. #~~BODY EXAMPLE~~#
  18. # {'attendees': [{'email': 'lpage@example.com'},
  19. # {'email': 'sbrin@example.com'}],
  20. # 'description': "A chance to hear more about Google's developer products.",
  21. # 'end': {'dateTime': '2015-05-28T17:00:00-07:00',
  22. # 'timeZone': 'America/Los_Angeles'},
  23. # 'location': '800 Howard St., San Francisco, CA 94103',
  24. # 'recurrence': ['RRULE:FREQ=DAILY;COUNT=2'],
  25. # 'reminders': {'overrides': [{'method': 'email', 'minutes': 1440},
  26. # {'method': 'popup', 'minutes': 10}],
  27. # 'useDefault': False},
  28. # 'start': {'dateTime': '2015-05-28T09:00:00-07:00',
  29. # 'timeZone': 'America/Los_Angeles'},
  30. # 'summary': 'Google I/O 2015'}
  31. class event:
  32. def __init__(self,
  33. start,
  34. end,
  35. summary,
  36. description = None,
  37. recurrence = None
  38. location = None,
  39. ):
  40. self.start = start,
  41. self.end = end,
  42. self.summary = summary,
  43. self.description = description,
  44. self.location = location
  45. def add_reminder(self,minutes_until,method = 'popup'):
  46. pass
  47. def add_weekly_recurrence(self,*days):
  48. pass
  49. def json(self):
  50. pass
  51. class calendar_api(API):
  52. def __init__(self,
  53. app_name,
  54. client_secret_file,
  55. credentials_dir,
  56. scopes = 'https://www.googleapis.com/auth/calendar',
  57. version = 'v3',
  58. ):
  59. super().__init__('calendar',scopes,app_name,client_secret_file,credentials_dir,version)
  60. self.calendars=self.get_calendars()
  61. self.ids = dict((calendar['summary'].lower(),calendar['id']) for calendar in self.calendars)
  62. def create_event(self, calendar_id, body):
  63. try:
  64. calendar_id = self.ids[calendar_id]
  65. except KeyError:
  66. pass
  67. service = self.service
  68. event = service.events().insert(calendarId=calendar_id, body=body).execute()
  69. return event['id']
  70. def update_event(self,calendar_id, event_id, body):
  71. try:
  72. calendar_id = self.ids[calendar_id]
  73. except KeyError:
  74. pass
  75. service = self.service
  76. try:
  77. event = service.events().get(calendarId=calendar_id, eventId=event_id).execute()
  78. except HttpError as e:
  79. if e.resp.status==404:
  80. return self.create_event(calendar_id, body)
  81. updated_event = service.events().update(calendarId=calendar_id, eventId=event['id'], body=body).execute()
  82. return updated_event["id"]
  83. def get_calendars(self):
  84. page_token = None
  85. cl = []
  86. first = True
  87. while page_token or first:
  88. first = False
  89. calendar_list = self.service.calendarList().list(pageToken=page_token).execute()
  90. cl += list(calendar_list_entry for calendar_list_entry in calendar_list['items'])
  91. page_token = calendar_list.get('nextPageToken')
  92. return cl
  93. def get_events(self,id):
  94. service = self.service
  95. try:
  96. id = self.ids[id]
  97. except KeyError:
  98. pass
  99. page_token = None
  100. ret = []
  101. while True:
  102. events = service.events().list(calendarId=id, pageToken=page_token).execute()
  103. ret += events['items']
  104. page_token = events.get('nextPageToken')
  105. if not page_token:
  106. break
  107. return ret
  108. if __name__ == "__main__":
  109. my_api = calendar_api(APPLICATION_NAME,r'..\test\calendar\client_secret.json',r'..\test\calendar')