Skip to content

Instantly share code, notes, and snippets.

@Hironsan
Last active February 4, 2017 14:32
Show Gist options
  • Save Hironsan/2468f2379f0b8172cf19868eebfe7bfd to your computer and use it in GitHub Desktop.
Save Hironsan/2468f2379f0b8172cf19868eebfe7bfd to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
import datetime
from collections import defaultdict
import dateutil.parser
from application.google_calendar import get_upcoming_events
def extract_intervals(events_list):
intervals = defaultdict(list)
for events in events_list:
for event in events:
# Extract start and end time
start_datetime_str = event['start'].get('dateTime', event['start'].get('date'))
end_datetime_str = event['end'].get('dateTime', event['end'].get('date'))
# Convert datetime str to datetime
s_datetime = dateutil.parser.parse(start_datetime_str)
e_datetime = dateutil.parser.parse(end_datetime_str)
interval = (s_datetime, e_datetime)
date = datetime.date(s_datetime.year, s_datetime.month, s_datetime.day)
intervals[date].append(interval)
return intervals
def add_sentinels(intervals, min_time, max_time):
for date in intervals.keys():
tzinfo = intervals[date][0][0].tzinfo
s_datetime = datetime.datetime.combine(date, datetime.time.min.replace(tzinfo=tzinfo))
e_datetime = datetime.datetime.combine(date, min_time.replace(tzinfo=tzinfo))
intervals[date].append((s_datetime, e_datetime))
s_datetime = datetime.datetime.combine(date, max_time.replace(tzinfo=tzinfo))
e_datetime = datetime.datetime.combine(date, datetime.time.max.replace(tzinfo=tzinfo))
intervals[date].append((s_datetime, e_datetime))
return intervals
def sort_intervals(intervals):
for date in intervals.keys():
intervals[date].sort()
return intervals
def find_free_intervals(intervals):
free_intervals = defaultdict(list)
for date, ivals in intervals.items():
for i in range(len(ivals) - 1):
first, second = ivals[i], ivals[i+1]
if first[1] >= second[0]:
continue
free_interval = (first[1], second[0])
free_intervals[date].append(free_interval)
return free_intervals
def get_available_time(min_time, max_time, *events_list):
intervals = extract_intervals(events_list)
intervals = add_sentinels(intervals, min_time, max_time)
intervals = sort_intervals(intervals)
intervals = find_free_intervals(intervals)
return intervals
if __name__ == '__main__':
calendar_ids = {'John': '[email protected]',
'Mary': '[email protected]',
'Mike': '[email protected]'}
john_events = get_upcoming_events(calendar_id=calendar_ids['John'], max_results=100)
mary_events = get_upcoming_events(calendar_id=calendar_ids['Mary'], max_results=100)
mike_events = get_upcoming_events(calendar_id=calendar_ids['Mike'], max_results=100)
from pprint import pprint
min_time, max_time = datetime.time(9, 0), datetime.time(18, 0) # search free time between 9 and 18 o'clock.
pprint(get_available_time(min_time, max_time, john_events, mary_events, mike_events))
@Hironsan
Copy link
Author

Hironsan commented Feb 4, 2017

Execution Result

{datetime.date(2017, 2, 6): [(datetime.datetime(2017, 2, 6, 9, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 6, 9, 30, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 6, 11, 30, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 6, 13, 0, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 6, 15, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 6, 15, 30, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 6, 16, 30, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 6, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 7): [(datetime.datetime(2017, 2, 7, 9, 30, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 7, 10, 0, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 7, 12, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 7, 13, 0, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 7, 14, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 7, 15, 0, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 7, 16, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 7, 17, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 8): [(datetime.datetime(2017, 2, 8, 12, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 8, 13, 0, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 8, 14, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 8, 16, 30, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 9): [(datetime.datetime(2017, 2, 9, 9, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 9, 9, 30, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 9, 12, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 9, 13, 0, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 9, 14, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 9, 17, 0, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 2, 9, 17, 30, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 2, 9, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 10): [(datetime.datetime(2017, 2, 10, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 10, 10, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 10, 11, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 10, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 10, 17, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 10, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 13): [(datetime.datetime(2017, 2, 13, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 13, 9, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 13, 11, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 13, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 13, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 13, 15, 30, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 14): [(datetime.datetime(2017, 2, 14, 9, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 14, 10, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 14, 12, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 14, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 14, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 14, 15, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 14, 16, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 14, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 15): [(datetime.datetime(2017, 2, 15, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 15, 10, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 15, 12, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 15, 13, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 16): [(datetime.datetime(2017, 2, 16, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 16, 10, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 16, 12, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 16, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 16, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 16, 15, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 17): [(datetime.datetime(2017, 2, 17, 11, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 17, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 17, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 17, 14, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 17, 16, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 17, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 20): [(datetime.datetime(2017, 2, 20, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 20, 9, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 20, 11, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 20, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 20, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 20, 15, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 20, 16, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 20, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 21): [(datetime.datetime(2017, 2, 21, 9, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 21, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 21, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 21, 15, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 21, 17, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 21, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 22): [(datetime.datetime(2017, 2, 22, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 22, 10, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 22, 12, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 22, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 22, 15, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 22, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 23): [(datetime.datetime(2017, 2, 23, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 23, 10, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 23, 12, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 23, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 23, 17, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 23, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 24): [(datetime.datetime(2017, 2, 24, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 24, 10, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 24, 11, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 24, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 24, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 24, 14, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 24, 15, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 24, 16, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 24, 17, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 24, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 27): [(datetime.datetime(2017, 2, 27, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 27, 9, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 27, 11, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 27, 13, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 27, 14, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 27, 15, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 27, 16, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 27, 17, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 2, 28): [(datetime.datetime(2017, 2, 28, 9, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 28, 10, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 28, 12, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 28, 15, 0, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 2, 28, 17, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 2, 28, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 3, 6): [(datetime.datetime(2017, 3, 6, 9, 0, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 3, 6, 15, 30, tzinfo=tzoffset(None, 32400))),
                             (datetime.datetime(2017, 3, 6, 16, 30, tzinfo=tzoffset(None, 32400)),
                              datetime.datetime(2017, 3, 6, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 3, 13): [(datetime.datetime(2017, 3, 13, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 3, 13, 15, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 3, 13, 16, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 3, 13, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 3, 20): [(datetime.datetime(2017, 3, 20, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 3, 20, 15, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 3, 20, 16, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 3, 20, 18, 0, tzinfo=tzoffset(None, 32400)))],
 datetime.date(2017, 3, 27): [(datetime.datetime(2017, 3, 27, 9, 0, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 3, 27, 15, 30, tzinfo=tzoffset(None, 32400))),
                              (datetime.datetime(2017, 3, 27, 16, 30, tzinfo=tzoffset(None, 32400)),
                               datetime.datetime(2017, 3, 27, 18, 0, tzinfo=tzoffset(None, 32400)))]}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment