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.

190 lines
6.1 KiB

  1. if __name__ == "__main__":
  2. from api import API
  3. else:
  4. from gapi.api import API
  5. import datetime
  6. import argparse
  7. import tzlocal
  8. from dateutil import rrule,tz
  9. from dateutil.parser import parse as date_parse
  10. from oauth2client import tools
  11. flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
  12. APPLICATION_NAME = 'Google Calendar API Python'
  13. SUN = 0
  14. MON = 1
  15. TUE = 2
  16. WED = 3
  17. THU = 4
  18. FRI = 5
  19. SAT = 6
  20. def to_dateTime(datetime):
  21. if not datetime.tzinfo:
  22. datetime = datetime.astimezone()
  23. zone = tzlocal.get_localzone().zone
  24. datetime = datetime.isoformat(timespec='seconds')
  25. return {
  26. "timeZone":zone,
  27. "dateTime":datetime,
  28. }
  29. def from_dateTime(dateTime):
  30. timezone = tz.gettz(dateTime['timeZone'])
  31. datetime = date_parse(dateTime['dateTime'])
  32. datetime.replace(tzinfo=timezone)
  33. return datetime
  34. #~~BODY EXAMPLE~~#
  35. class event:
  36. def __init__(self,
  37. start,
  38. end,
  39. name,
  40. description = None,
  41. recurrence = None,
  42. location = None,
  43. id = None
  44. ):
  45. self.start = start
  46. self.end = end
  47. self.summary = name
  48. self.description = description
  49. self.location = location
  50. self.id = id
  51. self.reminders = {'useDefault':True}
  52. def add_reminder(self,until,method = 'popup'):
  53. self.recurrence['useDefault'] = False
  54. if isinstance(until,datetime.timedelta):
  55. minutes_until = until.days * 24 * 60
  56. minutes_until += until.seconds//60
  57. else:
  58. minutes_until = until
  59. self.recurrence['overrides'] = {
  60. 'method':minutes_until,
  61. 'method':method,
  62. }
  63. def add_weekly_recurrence(self,until,*days):
  64. ret = rrule.rrule(freq=rrule.WEEKLY,dtstart=self.start,wkst=SUN,until=until,byweekday=days)
  65. ret_str = str(ret).split('\n')[-1]
  66. ret_str=re.sub(r'(UNTIL=[^;]+)',r'\1Z',ret_str)
  67. try:
  68. self.recurrence
  69. except AttributeError:
  70. self.recurrence = []
  71. self.recurrence.append(ret_str)
  72. def to_json(self):
  73. keys = ('attendees', 'description', 'location', 'recurrence', 'reminders', 'summary')
  74. ret = {
  75. 'start': to_dateTime(self.start),
  76. 'end': to_dateTime(self.end),
  77. }
  78. for key in keys:
  79. try:
  80. value = self.__getattribute__(key)
  81. if value:
  82. ret[key] = value
  83. except AttributeError:
  84. pass
  85. return ret
  86. def add_attendees(self):
  87. pass
  88. @classmethod
  89. def from_json(cls,body):
  90. args = {}
  91. args['name'] = body.get('summary','unamed')
  92. args['start'] = from_dateTime(body['start'])
  93. args['end'] = from_dateTime(body['end'])
  94. instance = cls(**args)
  95. keys = ('attendees', 'description', 'location', 'recurrence', 'reminders', 'summary')
  96. for key in keys:
  97. try:
  98. args[key] = body[key]
  99. except KeyError:
  100. pass
  101. class calendar_api(API):
  102. def __init__(self,
  103. app_name,
  104. client_secret_file,
  105. credentials_dir,
  106. scopes = 'https://www.googleapis.com/auth/calendar',
  107. version = 'v3',
  108. ):
  109. super().__init__('calendar',scopes,app_name,client_secret_file,credentials_dir,version)
  110. self.calendars=self.get_calendars()
  111. self.ids = dict((calendar['summary'].lower(),calendar['id']) for calendar in self.calendars)
  112. def create_event(self, calendar_id, body):
  113. try:
  114. calendar_id = self.ids[calendar_id]
  115. except KeyError:
  116. pass
  117. service = self.service
  118. event = service.events().insert(calendarId=calendar_id, body=body).execute()
  119. return event['id']
  120. def update_event(self,calendar_id, event_id, body):
  121. try:
  122. calendar_id = self.ids[calendar_id]
  123. except KeyError:
  124. pass
  125. service = self.service
  126. try:
  127. event = service.events().get(calendarId=calendar_id, eventId=event_id).execute()
  128. except HttpError as e:
  129. if e.resp.status==404:
  130. return self.create_event(calendar_id, body)
  131. updated_event = service.events().update(calendarId=calendar_id, eventId=event['id'], body=body).execute()
  132. return updated_event["id"]
  133. def get_calendars(self):
  134. page_token = None
  135. cl = []
  136. first = True
  137. while page_token or first:
  138. first = False
  139. calendar_list = self.service.calendarList().list(pageToken=page_token).execute()
  140. cl += list(calendar_list_entry for calendar_list_entry in calendar_list['items'])
  141. page_token = calendar_list.get('nextPageToken')
  142. return cl
  143. def get_events(self,id):
  144. service = self.service
  145. try:
  146. id = self.ids[id]
  147. except KeyError:
  148. pass
  149. page_token = None
  150. ret = []
  151. while True:
  152. events = service.events().list(calendarId=id, pageToken=page_token).execute()
  153. ret += events['items']
  154. page_token = events.get('nextPageToken')
  155. if not page_token:
  156. break
  157. return ret
  158. if __name__ == "__main__":
  159. example = {'attendees': [{'email': 'lpage@example.com'},
  160. {'email': 'sbrin@example.com'}],
  161. 'description': "A chance to hear more about Google's developer products.",
  162. 'end': {'dateTime': '2015-05-28T17:00:00-07:00',
  163. 'timeZone': 'America/Los_Angeles'},
  164. 'location': '800 Howard St., San Francisco, CA 94103',
  165. 'recurrence': ['RRULE:FREQ=DAILY;COUNT=2'],
  166. 'reminders': {'overrides': [{'method': 'email', 'minutes': 1440},
  167. {'method': 'popup', 'minutes': 10}],
  168. 'useDefault': False},
  169. 'start': {'dateTime': '2015-05-28T09:00:00-07:00',
  170. 'timeZone': 'America/Los_Angeles'},
  171. 'summary': 'Google I/O 2015'}
  172. e = event.from_json(example)