Spaces:
Running
Running
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. | |
# """ | |
# ) | |