Skip to content

Instantly share code, notes, and snippets.

@abhijitmamarde
Created October 9, 2016 12:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abhijitmamarde/62af0e86489bd4697b6a18413c7ae054 to your computer and use it in GitHub Desktop.
Save abhijitmamarde/62af0e86489bd4697b6a18413c7ae054 to your computer and use it in GitHub Desktop.
logic for scheduling event
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