From 0ac4f244f49349702d6728c95224d9dcf056b5c4 Mon Sep 17 00:00:00 2001 From: Raphael Roberts Date: Sun, 9 Sep 2018 00:39:59 -0500 Subject: [PATCH] made api baseclass and calendar service subclass --- api.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++ calendar.py | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 api.py create mode 100644 calendar.py diff --git a/api.py b/api.py new file mode 100644 index 0000000..a6fd82d --- /dev/null +++ b/api.py @@ -0,0 +1,76 @@ +from apiclient import discovery +import datetime +from googleapiclient.discovery import build +from googleapiclient.errors import HttpError + +from oauth2client import client +from oauth2client import tools +from oauth2client.file import Storage +from oauth2client.service_account import ServiceAccountCredentials + +import httplib2 +import os + +import argparse + +flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() + +class api: + def __init__( + self, + service, + scopes, + app_name, + client_secret_file, + credentials_dir, + version = '3', + ): + self.service_name = service + self.app_name = app_name + self.client_secret_file = client_secret_file + self.credentials_dir = credentials_dir + self.scopes = scopes + self._service = None + self._service_settime = None + + def get_credentials(self): + + credential_path = os.path.join(self.credentials_dir, + 'token.json') + + store = Storage(credential_path) + credentials = store.get() + if not credentials or credentials.invalid: + flow = client.flow_from_clientsecrets(self.client_secret_file, self.scopes) + flow.user_agent = APPLICATION_NAME + if flags: + credentials = tools.run_flow(flow, store, flags) + else: + credentials = tools.run(flow, store) + print('Storing credentials to ' + credential_path) + return credentials + + def build_service(self): + credentials = self.get_credentials() + + http = credentials.authorize(httplib2.Http()) + + service = build(self.service_name, self.version, http=http, cache_discovery=False) + return service + + def _needs_renewal(self): + now = datetime.datetime.today() + if self._service_settime: + return (now - self._service_settime) > datetime.timedelta(seconds = 60**2) + else: + return True + + @property + def service(self): + if self._needs_renewal(): + service = self.build_service() + self._service = service + self._service_settime = datetime.datetime.today() + return service + else: + return self._service \ No newline at end of file diff --git a/calendar.py b/calendar.py new file mode 100644 index 0000000..7a6c8ba --- /dev/null +++ b/calendar.py @@ -0,0 +1,85 @@ +from api import api +import datetime +import argparse +import tzlocal +flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() +APPLICATION_NAME = 'Google Calendar API Python' + +def dateTime(datetime): + if not datetime.tzinfo: + datetime = datetime.astimezone() + zone = tzlocal.get_localzone().zone + datetime = datetime.isoformat(timespec='seconds') + return { + "timeZone":zone, + "dateTime":datetime, + } + +class calendar_api(api): + def __init__( + self, + app_name, + client_secret_file, + credentials_dir, + scopes = 'https://www.googleapis.com/auth/calendar' + version = '3', + ): + super().__init__('calendar',scopes,app_name,client_secret_file,credentials_dir,version) + + self.calendars=self.get_calendars() + self.ids = dict((calendar['summary'].lower(),calendar['id']) for calendar in self.calendars) + + elif + + def create_event(self, calendar_id, body): + + try: + calendar_id = self.ids[calendar_id] + except KeyError: + pass + service = self.service + event = service.events().insert(calendarId=calendar_id, body=body).execute() + return event['id'] + + def update_event(self,calendar_id, event_id, body): + try: + calendar_id = self.ids[calendar_id] + except KeyError: + pass + + service = self.service + try: + event = service.events().get(calendarId=calendar_id, eventId=event_id).execute() + except HttpError as e: + if e.resp.status==404: + return self.create_event(calendar_id, body) + + updated_event = service.events().update(calendarId=calendar_id, eventId=event['id'], body=body).execute() + return updated_event["id"] + + def get_calendars(self): + page_token = None + cl = [] + while True: + calendar_list = self.service.calendarList().list(pageToken=page_token).execute() + cl += list(calendar_list_entry for calendar_list_entry in calendar_list['items']) + page_token = calendar_list.get('nextPageToken') + if not page_token: + break + return cl + + def get_events(self,id): + service = self.service + try: + id = self.ids[id] + except KeyError: + pass + page_token = None + ret = [] + while True: + events = service.events().list(calendarId=id, pageToken=page_token).execute() + ret += events['items'] + page_token = events.get('nextPageToken') + if not page_token: + break + return ret \ No newline at end of file