sabrebooking / sabrebackend / sabre / sabreapi / calendar.py
calendar.py
Raw
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