logic-center / services /google_calendar.py
camphong24032002
Test
6b95d78
from gcsa.google_calendar import GoogleCalendar
from gcsa.event import Event
from datetime import datetime
from pathlib import Path
import pickle
import os.path
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
BASE_DIR = Path(__file__).parent
class GoogleCalendarAPI:
def __init__(self) -> None:
self.scopes = ['https://www.googleapis.com/auth/calendar']
self.calendar = self.create_service()
def create_service(self):
"""create service with credentials set up and token file,
Note:
If you use a new machine or browser, just delete the `token.pickle`
in folder `credentials`. And then run application again,
a new `sign in cookie pop up` would appear and loging in.
After logged, a new `token.pickle` would be created
automatically in folder credentials.
Returns:
GoogleCalendar: Calendar object
"""
creds = None
if os.path.exists(Path(BASE_DIR, 'credentials', 'token.pickle')):
with open(
Path(BASE_DIR, 'credentials', '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(
Path(BASE_DIR, 'credentials', 'credentials.json'),
self.scopes
)
creds = flow.run_local_server(port=0)
with open(
Path(BASE_DIR, 'credentials', 'token.pickle'), 'wb'
) as token:
pickle.dump(creds, token)
try:
calendar = GoogleCalendar('primary', credentials=creds)
except Exception as e:
print(e)
return None
return calendar
def setup_event(
self,
event_name: str,
event_start_time: str,
event_end_time: str,
attendees: list = [],
event_description: str = None
):
"""Set up event to calendar from given information from user
Args:
event_name (str): The title of event,
you could generate out by yourself if user not provided
event_start_time (str): The start time string of event that user
want to set calendar. Format is "%Y-%m-%d %H:%M"
Example:
"2001-01-02 13:55": which means 13:55 at 1s Feburary 2001
event_end_time (str): The end time string of event that user
want to set calendar. Format is "%Y-%m-%d %H:%M"
Example:
"2001-01-02 14:30": which means 14:30 at 1s Feburary 2001
attendees (list, optional): List of attendee's email.
Defaults to [].
event_description (str, optional): The desription of event.
Defaults to None.
Returns:
str: result status of this action
"""
try:
event = Event(
event_name,
start=datetime.strptime(event_start_time, "%Y-%m-%d %H:%M"),
end=datetime.strptime(event_end_time, "%Y-%m-%d %H:%M"),
attendees=attendees,
description=event_description,
default_reminders=True
)
self.calendar.add_event(event)
except Exception as ex:
return f"There is a problem while setting calendar, {ex}"
return "Set calendar successfully !"
def get_events(
self,
year_range: list,
month_range: list,
day_range: list,
hour_range: list
) -> list:
"""To get out all the events in user's calendar with
given range of time
Args:
year_range (list): Range year that user need to require
Example:
[2023, 2025]: Range from 2023 to 2025
month_range (list): Range month that user need to require
Example:
[1, 5]: Range from January to May
day_range (list): Range day that user need to require
Example:
[1, 31]: Range from 1st to 31st
day_range (list): Range hour that user need to require,
if user want to require in same date, hour must be [0, 23]
Example:
[0, 23]: Range from 0am to 23pm
Returns:
list: list of events found in user calendar with given range time
"""
start_date = datetime(
year=year_range[0],
month=month_range[0],
day=day_range[0],
hour=hour_range[0]
)
end_date = datetime(
year=year_range[1],
month=month_range[1],
day=day_range[1],
hour=hour_range[1]
)
return [event for event in self.calendar.get_events(
time_min=start_date, time_max=end_date
)]
def get_events_by_date(
self,
start_date: datetime,
end_date: datetime
) -> list:
return [event for event in self.calendar.get_events(
time_min=start_date, time_max=end_date
)]
if __name__ == "__main__":
calendar = GoogleCalendarAPI()
# # Sample set up event on calendar
# calendar.setup_event(
# event_name="This is sample buy signal",
# event_start_time="02/17/2024 14:33",
# event_end_time="02/17/2024 15:30",
# attendees=['ndthinh0201@gmail.com', 'camphong.work@gmail.com'],
# event_description="""
# W trend has found in 7 days past and today figure out
# the rise significantly, better to buy.
# """
# )