diff --git a/auto_calender/README.md b/auto_calender/README.md new file mode 100644 index 000000000..29a6c0966 --- /dev/null +++ b/auto_calender/README.md @@ -0,0 +1,7 @@ +## Steps to perform + +To start use the script you first need to go to https://developers.google.com/calendar/quickstart/python adn press the "ENABLE THE GOOGLE CALENDAR API" to activate it. + +Then you will get a popu with a file called credentials.json, that you will need to download. + +After that just add that file to the project root folder and then in the console or terminal you can run it by typing in: python calendarauto.py diff --git a/auto_calender/calendarauto.py b/auto_calender/calendarauto.py new file mode 100644 index 000000000..3191294cc --- /dev/null +++ b/auto_calender/calendarauto.py @@ -0,0 +1,135 @@ +from __future__ import print_function +import pickle +import os.path +from googleapiclient.discovery import build +from google_auth_oauthlib.flow import InstalledAppFlow +from google.auth.transport.requests import Request +from task import Task +from datetime import timedelta, datetime + + +categories = { + # Lavender + '#a4bdfc': '', + # Blueberry + '#5484ed': '', + # Peacock + '#46d6db': 'Exercise', + # Sage + '#7ae7bf': 'My Apps', + # Basil + '#51b749': 'App', + # Tangerine + '#ffb878': '', + # Banana + '#fbd75b': '', + # Flamingo + '#ff887c': '', + # Tomato + '#dc2127': 'YouTube', + # Mandarine + '#fa573c': '', + # Grape + '#dbadff': 'Work', + # Graphite + '#e1e1e1': 'School' +} + + +EVENTS_TO_LOOK_THROUGH = 60 +# If modifying these scopes, delete the file token.pickle. +SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'] + + +def main(): + """Shows basic usage of the Google Calendar API. + Prints the start and name of the next 10 events on the user's calendar. + """ + creds = None + # The file token.pickle 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('token.pickle'): + with open('token.pickle', 'rb') as token: + creds = pickle.load(token) + # 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( + 'credentials.json', SCOPES) + creds = flow.run_local_server() + # Save the credentials for the next run + with open('token.pickle', 'wb') as token: + pickle.dump(creds, token) + + service = build('calendar', 'v3', credentials=creds) + + # Call the Calendar API + start_day = datetime.utcnow() + now = datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time + last_monday = (datetime.utcnow()- timedelta(start_day.weekday())).isoformat() + 'Z' # 'Z' indicates UTC time + week_end_time = str(datetime.utcnow() + timedelta(days=7)) + 'Z' + print('Getting the upcoming 10 events') + print('**************************************************************\n') + events_result = service.events().list(calendarId='primary', timeMin=last_monday, timeMax=now, + maxResults=EVENTS_TO_LOOK_THROUGH, singleEvents=True, + orderBy='startTime').execute() + colors = service.colors().get(fields='event').execute() + defaultColor = (service.calendarList().get(calendarId="primary").execute())['backgroundColor'] + events = events_result.get('items', []) + tasks = [] + + if not events: + print('No upcoming events found.') + for event in events: + start_string = event['start'].get('dateTime', event['start'].get('date')) + end_string = event['end'].get('dateTime', event['end'].get('date')) + + name = event['summary'] + try: + color = colors['event'][event['colorId']]['background'] + except KeyError: + color = defaultColor + task = Task(name, parse_time(start_string), parse_time(end_string), color) + task.date = parse_time(start_string) + task.get_time_of_task() + tasks.append(task) + + total_tasks = [] + for color, category in categories.items(): + if len(category) > 1: + total_time = timedelta(hours=0) + for task in tasks: + if task.color == color: + total_time += task.total_time + text = "For " + category + " you have planned to spend:" + number_of_spaces = 15 + number_of_spaces -= len(category) + string_length=len(text)+number_of_spaces # will be adding 10 extra spaces + string_revised=text.ljust(string_length) + print("\n-----------------------------------------------------------------") + print(string_revised + format_timedelta(total_time) + "hrs this week") + print("\n-----------------------------------------------------------------\n") + print("\n********************************************************\n") + + +def parse_time(timestamp): + # Takes a timestamp string and returns a datetime object + try: + time_object = datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S%z") + except ValueError: + # If no start and end time is specified the format string must be different + time_object = datetime.strptime(timestamp, "%Y-%m-%d") + return time_object + + +def format_timedelta(timedelta): + # Takes a timedelta and returns a string + hours = timedelta.total_seconds() / 3600 + return("%.2f" % hours) + + +if __name__ == '__main__': + main() diff --git a/auto_calender/requirements.txt b/auto_calender/requirements.txt new file mode 100644 index 000000000..827d93192 Binary files /dev/null and b/auto_calender/requirements.txt differ diff --git a/auto_calender/task.py b/auto_calender/task.py new file mode 100644 index 000000000..7187f7740 --- /dev/null +++ b/auto_calender/task.py @@ -0,0 +1,29 @@ + + +import datetime + +class Task: + total_time = 0 + date = datetime.datetime.now() + + def __init__(self, name, start_time, end_time, color): + self.name=name + self.start_time=start_time + self.end_time=end_time + self.color=color + + def get_time_of_task(self): + self.total_time = self.end_time - self.start_time + + def make_int(self,time): + arr = [] + for line in time: + if line.strip(): + try: # line contains eol character(s) + n = int(line) + arr.append(n) + except Exception as e: + pass + hour_string = str(arr[0]) + str(arr[1]) + int_hour = int(hour_string) + return int_hour \ No newline at end of file