import os.path import datetime as dt import random from datetime import datetime import pytz from django.conf import settings from google.auth.transport.requests import Request from .models import Room, Booking, CustomUser from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError SCOPES = ["https://www.googleapis.com/auth/calendar"] TIMEZONE = "Africa/Harare" CALENDARID = "85d16c70e076bda36c2ca524cc890bc169ba0dc4226260f3f6321b5b19d25915@group.calendar.google.com" def init_creds(): """Initialize google cal API creds""" creds = None # The file token.json stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists(settings.GOOGLE_TOKEN_FILE): creds = Credentials.from_authorized_user_file( settings.GOOGLE_TOKEN_FILE) # If there are no (valid) credentials available, let the user log in. 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(settings.GOOGLE_CREDENTIALS_FILE, SCOPES) creds = flow.run_local_server(port=0) # Save the credentials for the next run with open(settings.GOOGLE_TOKEN_FILE, "w") as token: token.write(creds.to_json()) return creds or None def list_upcoming_events(creds): if not creds: return {"error": "Could not find credentials."} try: service = build("calendar", "v3", credentials=creds) now = dt.datetime.now().isoformat() + "Z" event_result = service.events().list(calendarId="primary", timeMin=now, maxResults=4, singleEvents=True, orderBy="startTime").execute() events = event_result.get("items", []) if not events: print("No upcoming events") return {"events": []} event_list = [] for event in events: start = event["start"].get("dateTime", event["start"].get("date")) print(start, event["summary"]) event_list.append((start, event["summary"])) return {"events": event_list} except HttpError as error: return {"error": error} def add_booking_to_calendar(booking, creds): if not creds: return {"error": "Could not find credentials."} try: service = build("calendar", "v3", credentials=creds) event = { "summary": "Climate Summit", "location": str(booking.room), "colorId": int(random.randint(1, 11)), "start": { "dateTime": get_combined_datetime(booking.event_start, booking.event_date), "timeZone": TIMEZONE }, "end": { "dateTime": get_combined_datetime(booking.event_end, booking.event_date), "timeZone": TIMEZONE }, "attendees": [ {"email": str(booking.user.email)}, ], "reminders": { "useDefault": True, } } event = service.events().insert(calendarId=CALENDARID, body=event).execute() print(event) return event.get('htmlLink') except Exception as e: print(e) return {"error": str(e)} def get_combined_datetime(time, date): """Utility function to create combined datetime object from date and time""" # Combine date and time combined_datetime = datetime.combine(date,time) # Add timezone information timezone = pytz.timezone(TIMEZONE) localized_datetime = timezone.localize(combined_datetime) # Convert to ISO 8601 format iso_formatted_string = localized_datetime.isoformat() return iso_formatted_string