Adds integration with Google Calendar: includes API configuration, event management nodes, and project structure in the README
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
from google.oauth2.credentials import Credentials
|
||||
from google_auth_oauthlib.flow import InstalledAppFlow
|
||||
from google.auth.transport.requests import Request
|
||||
from googleapiclient.discovery import build
|
||||
import os.path
|
||||
import os
|
||||
import pickle
|
||||
from datetime import datetime, timedelta
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
CALENDAR_ID = os.getenv('GOOGLE_CALENDAR_ID')
|
||||
GOOGLE_APPLICATION_CREDENTIALS = os.getenv('GOOGLE_APPLICATION_CREDENTIALS')
|
||||
TIMEZONE = os.getenv('TIMEZONE')
|
||||
|
||||
SCOPES = ['https://www.googleapis.com/auth/calendar']
|
||||
|
||||
def get_calendar_service():
|
||||
"""Gets the authenticated Google Calendar service."""
|
||||
creds = None
|
||||
if os.path.exists('token.pickle'):
|
||||
with open('token.pickle', 'rb') as token:
|
||||
creds = pickle.load(token)
|
||||
|
||||
if not creds or not creds.valid:
|
||||
if creds and creds.expired and creds.refresh_token:
|
||||
creds.refresh(Request())
|
||||
else:
|
||||
flow = InstalledAppFlow.from_client_secrets_file(
|
||||
GOOGLE_APPLICATION_CREDENTIALS, SCOPES)
|
||||
creds = flow.run_local_server(port=0)
|
||||
with open('token.pickle', 'wb') as token:
|
||||
pickle.dump(creds, token)
|
||||
|
||||
return build('calendar', 'v3', credentials=creds)
|
||||
|
||||
def create_event(summary, description, start_time, end_time, timezone=TIMEZONE):
|
||||
"""Creates a new event in Google Calendar."""
|
||||
service = get_calendar_service()
|
||||
|
||||
event = {
|
||||
'summary': summary,
|
||||
'description': description,
|
||||
'start': {
|
||||
'dateTime': start_time.isoformat(),
|
||||
'timeZone': timezone,
|
||||
},
|
||||
'end': {
|
||||
'dateTime': end_time.isoformat(),
|
||||
'timeZone': timezone,
|
||||
},
|
||||
}
|
||||
|
||||
event = service.events().insert(calendarId=CALENDAR_ID, body=event).execute()
|
||||
return event
|
||||
|
||||
def list_events(days=7):
|
||||
"""Lists events for the next X days."""
|
||||
service = get_calendar_service()
|
||||
|
||||
now = datetime.utcnow()
|
||||
time_min = now.isoformat() + 'Z'
|
||||
time_max = (now + timedelta(days=days)).isoformat() + 'Z'
|
||||
|
||||
events_result = service.events().list(
|
||||
calendarId=CALENDAR_ID,
|
||||
timeMin=time_min,
|
||||
timeMax=time_max,
|
||||
singleEvents=True,
|
||||
orderBy='startTime'
|
||||
).execute()
|
||||
|
||||
return events_result.get('items', [])
|
||||
|
||||
def create_custom_calendar(calendar_name, description=""):
|
||||
"""Creates a new custom calendar in Google Calendar."""
|
||||
service = get_calendar_service()
|
||||
|
||||
calendar = {
|
||||
'summary': calendar_name,
|
||||
'description': description,
|
||||
'timeZone': TIMEZONE
|
||||
}
|
||||
|
||||
created_calendar = service.calendars().insert(body=calendar).execute()
|
||||
return created_calendar
|
||||
|
||||
def list_calendar_lists():
|
||||
"""Lists all available calendars for the user."""
|
||||
service = get_calendar_service()
|
||||
|
||||
calendar_list = service.calendarList().list().execute()
|
||||
return calendar_list.get('items', [])
|
||||
Reference in New Issue
Block a user