Created
October 9, 2016 12:27
-
-
Save abhijitmamarde/62af0e86489bd4697b6a18413c7ae054 to your computer and use it in GitHub Desktop.
logic for scheduling event
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
import time | |
from pprint import pprint | |
# duration of each slot, in mins | |
mins_of_slot = 15 | |
# default time slots info | |
default_time_slots = [ | |
{ | |
'start': datetime.time(10,0), | |
'end': datetime.time(14,0), | |
}, | |
{ | |
'start': datetime.time(18,0), | |
'end': datetime.time(9,30), | |
}, | |
] | |
# time slots info for each day of week | |
# weekday starts with Mon - 0, Tue - 1 .. Sun - 6 | |
time_table = { | |
6: [ | |
{ | |
'start': datetime.time(18,0), | |
'end': datetime.time(18,30), | |
}, | |
], | |
0: [ | |
{ | |
'start': datetime.time(17,0), | |
'end': datetime.time(18,30), | |
}, | |
], | |
} | |
# some events assumed to be already added | |
# remember that event should start/end at the slot boundry! | |
events_already_added = [ | |
{ | |
'id': 1, | |
'on': datetime.datetime(2016, 10, 9, 18, 0), | |
}, | |
{ | |
'id': 2, | |
'on': datetime.datetime(2016, 10, 9, 18, 15), | |
}, | |
{ | |
'id':3, | |
'on': datetime.datetime(2016, 10, 10, 18, 0), | |
}, | |
] | |
def get_availability_for_day(day): | |
weekday = day.weekday() | |
day_time_table = time_table.get(weekday, default_time_slots) | |
day_events = [event for event in events_already_added if event['on'].date() == day] | |
slots_booked = [event['on'].time() for event in day_events] | |
slots_available = [] | |
# print "slots_booked:" | |
# print slots_booked | |
for tt in day_time_table: | |
t = tt['start'] | |
while t < tt['end']: | |
if not (t in slots_booked): | |
slots_available.append(t) | |
t = (datetime.datetime.combine(datetime.date(1, 1, 1), t) + datetime.timedelta(minutes=mins_of_slot)).time() | |
# print "Slots:" | |
# print slots_available | |
data = { | |
'availability': True if len(slots_available) else False, | |
'available': slots_available, | |
'booked': slots_booked, | |
} | |
return data | |
# if len(slots_available): | |
# return (True, data) | |
# return (False, data) | |
def get_availability_for_days(next_days): | |
today = datetime.datetime.now().date() | |
end_date = today + datetime.timedelta(days=next_days) | |
day = today | |
while True: | |
print "Day: ", day | |
info = get_availability_for_day(day) | |
print "data:" | |
pprint(info) | |
print "-" * 30 | |
day = day + datetime.timedelta(days=1) | |
if day >= end_date: | |
break | |
get_availability_for_days(2) | |
# output: | |
''' | |
Day: 2016-10-09 | |
data: | |
{'availability': False, | |
'available': [], | |
'booked': [datetime.time(18, 0), datetime.time(18, 15)]} | |
------------------------------ | |
Day: 2016-10-10 | |
data: | |
{'availability': True, | |
'available': [datetime.time(17, 0), | |
datetime.time(17, 15), | |
datetime.time(17, 30), | |
datetime.time(17, 45), | |
datetime.time(18, 15)], | |
'booked': [datetime.time(18, 0)]} | |
------------------------------ | |
''' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment