diff --git a/README.md b/README.md index 8c192a7..b2b8b3b 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,8 @@ wget https://raw.githubusercontent.com/b4tman/sync_ics2gcal/develop/sample-confi * `start_from` - start date: * full format datetime, `2018-04-03T13:23:25.000001Z` for example * or just `now` -* `service_account` - service account filename +* *(Optional)* `service_account` - service account filename, remove it from config to use [default credentials](https://developers.google.com/identity/protocols/application-default-credentials) +* *(Optional)* `logging` - [config](https://docs.python.org/3.8/library/logging.config.html#dictionary-schema-details) to setup logging * `google_id` - target google calendar id, `my-calendar@group.calendar.google.com` for example * `source` - source `.ics` filename, `my-calendar.ics` for example diff --git a/sync_ics2gcal/gcal.py b/sync_ics2gcal/gcal.py index 8481a08..6bc9ed9 100644 --- a/sync_ics2gcal/gcal.py +++ b/sync_ics2gcal/gcal.py @@ -14,6 +14,21 @@ class GoogleCalendarService(): service Resource """ + @staticmethod + def default(): + """make service Resource from default credentials (authorize) + ( https://developers.google.com/identity/protocols/application-default-credentials ) + ( https://googleapis.dev/python/google-auth/latest/reference/google.auth.html#google.auth.default ) + + Returns: + service Resource + """ + + scopes = ['https://www.googleapis.com/auth/calendar'] + credentials, _ = google.auth.default(scopes=scopes) + service = discovery.build('calendar', 'v3', credentials=credentials) + return service + @staticmethod def from_srv_acc_file(service_account_file): """make service Resource from service account filename (authorize) @@ -27,6 +42,26 @@ class GoogleCalendarService(): scoped_credentials = credentials.with_scopes(scopes) service = discovery.build('calendar', 'v3', credentials=scoped_credentials) return service + + @staticmethod + def from_config(config): + """make service Resource from config dict + + Arguments: + config -- dict() config with keys: + (optional) service_account: - service account filename + if key not in dict then default credentials will be used + ( https://developers.google.com/identity/protocols/application-default-credentials ) + + Returns: + service Resource + """ + + if 'service_account' in config: + service = GoogleCalendarService.from_srv_acc_file(config['service_account']) + else: + service = GoogleCalendarService.default() + return service def select_event_key(event): """select event key for logging diff --git a/sync_ics2gcal/manage_calendars.py b/sync_ics2gcal/manage_calendars.py index b1236a2..f457294 100644 --- a/sync_ics2gcal/manage_calendars.py +++ b/sync_ics2gcal/manage_calendars.py @@ -86,8 +86,7 @@ def main(): if 'logging' in config: logging.config.dictConfig(config['logging']) - srv_acc_file = config['service_account'] - service = GoogleCalendarService.from_srv_acc_file(srv_acc_file) + service = GoogleCalendarService.from_config(config) if 'list' == args.command: list_calendars(service) diff --git a/sync_ics2gcal/sync_calendar.py b/sync_ics2gcal/sync_calendar.py index 37f5805..814d9d5 100644 --- a/sync_ics2gcal/sync_calendar.py +++ b/sync_ics2gcal/sync_calendar.py @@ -34,14 +34,13 @@ def main(): calendarId = config['calendar']['google_id'] ics_filepath = config['calendar']['source'] - srv_acc_file = config['service_account'] start = get_start_date(config['start_from']) converter = CalendarConverter() converter.load(ics_filepath) - service = GoogleCalendarService.from_srv_acc_file(srv_acc_file) + service = GoogleCalendarService.from_config(config) gcalendar = GoogleCalendar(service, calendarId) sync = CalendarSync(gcalendar, converter)