Skip to content

Instantly share code, notes, and snippets.

@terapyon
Created January 16, 2014 12:16
Show Gist options
  • Save terapyon/8454015 to your computer and use it in GitHub Desktop.
Save terapyon/8454015 to your computer and use it in GitHub Desktop.
calendar formating
# -*- coding: utf-8 -*-
from datetime import datetime as dt
from collections import OrderedDict, defaultdict
data1 = [{'id':"1", "start":(2014,01,16,9,0), "end": (2014,01,16,14,0)},
{'id':"2", "start":(2014,01,16,10,0), "end": (2014,01,16,11,0)},
{'id':"3", "start":(2014,01,16,12,0), "end": (2014,01,16,15,0)},
{'id':"4", "start":(2014,01,16,12,0), "end": (2014,01,16,14,0)},
{'id':"5", "start":(2014,01,16,15,0), "end": (2014,01,16,17,0)},
{'id':"6", "start":(2014,01,16,16,0), "end": (2014,01,16,18,0)},
{'id':"7", "start":(2014,01,16,18,0), "end": (2014,01,16,19,0)},
]
res_data1 = [{'children': ['4', '3', '2'],
'end': (2014, 1, 16, 14, 0),
'id': '1',
'num': 3,
'order_index': 1,
'parent': [],
'parent_num': 1,
'start': (2014, 1, 16, 9, 0)},
{'children': [],
'end': (2014, 1, 16, 11, 0),
'id': '2',
'num': 3,
'order_index': 2,
'parent': ['1'],
'parent_num': 2,
'start': (2014, 1, 16, 10, 0)},
{'children': ['4'],
'end': (2014, 1, 16, 15, 0),
'id': '3',
'num': 3,
'order_index': 2,
'parent': ['1'],
'parent_num': 2,
'start': (2014, 1, 16, 12, 0)},
{'children': [],
'end': (2014, 1, 16, 14, 0),
'id': '4',
'num': 3,
'order_index': 3,
'parent': ['1', '3'],
'parent_num': 3,
'start': (2014, 1, 16, 12, 0)},
{'children': ['6'],
'end': (2014, 1, 16, 17, 0),
'id': '5',
'num': 2,
'order_index': 1,
'parent': [],
'parent_num': 1,
'start': (2014, 1, 16, 15, 0)},
{'children': [],
'end': (2014, 1, 16, 18, 0),
'id': '6',
'num': 2,
'order_index': 2,
'parent': ['5'],
'parent_num': 2,
'start': (2014, 1, 16, 16, 0)},
{'children': [],
'end': (2014, 1, 16, 19, 0),
'id': '7',
'num': 1,
'order_index': 1,
'parent': [],
'parent_num': 1,
'start': (2014, 1, 16, 18, 0)}]
data2 = [{'id':"1", "start":(2014,01,16,9,0), "end": (2014,01,16,14,0)},
{'id':"2", "start":(2014,01,16,10,0), "end": (2014,01,16,11,0)},
{'id':"3", "start":(2014,01,16,12,0), "end": (2014,01,16,15,0)},
{'id':"4", "start":(2014,01,16,12,0), "end": (2014,01,16,14,0)},
{'id':"5", "start":(2014,01,16,15,0), "end": (2014,01,16,17,0)},
{'id':"6", "start":(2014,01,16,17,0), "end": (2014,01,16,18,0)},
{'id':"7", "start":(2014,01,16,17,0), "end": (2014,01,16,19,0)},
]
res_data2 = [{'children': ['4', '3', '2'],
'end': (2014, 1, 16, 14, 0),
'id': '1',
'num': 3,
'order_index': 1,
'parent': [],
'parent_num': 1,
'start': (2014, 1, 16, 9, 0)},
{'children': [],
'end': (2014, 1, 16, 11, 0),
'id': '2',
'num': 3,
'order_index': 2,
'parent': ['1'],
'parent_num': 2,
'start': (2014, 1, 16, 10, 0)},
{'children': ['4'],
'end': (2014, 1, 16, 15, 0),
'id': '3',
'num': 3,
'order_index': 2,
'parent': ['1'],
'parent_num': 2,
'start': (2014, 1, 16, 12, 0)},
{'children': [],
'end': (2014, 1, 16, 14, 0),
'id': '4',
'num': 3,
'order_index': 3,
'parent': ['1', '3'],
'parent_num': 3,
'start': (2014, 1, 16, 12, 0)},
{'children': [],
'end': (2014, 1, 16, 17, 0),
'id': '5',
'num': 1,
'order_index': 1,
'parent': [],
'parent_num': 1,
'start': (2014, 1, 16, 15, 0)},
{'children': ['7'],
'end': (2014, 1, 16, 18, 0),
'id': '6',
'num': 2,
'order_index': 1,
'parent': [],
'parent_num': 1,
'start': (2014, 1, 16, 17, 0)},
{'children': [],
'end': (2014, 1, 16, 19, 0),
'id': '7',
'num': 2,
'order_index': 2,
'parent': ['6'],
'parent_num': 2,
'start': (2014, 1, 16, 17, 0)}]
def _sort_key(x):
return x.get('start')
def is_area(base_data, start, end):
for d in base_data:
if start < dt(*d['end']) and end > dt(*d['start']):
yield d.get('id')
#def _is_area(base_data, start, end):
# out = []
# for d in base_data:
# if start < dt(*d['end']) and end > dt(*d['start']):
# out.append(d.get('id'))
# return out
def main(data):
res = []
res_dic = {}
parent_dic = defaultdict(list)
sorted_data = list(reversed(sorted(data, key=_sort_key)))
for i in range(len(sorted_data)):
dic = sorted_data.pop()
did = dic['id']
start = dt(*dic['start'])
end = dt(*dic['end'])
children = list(is_area(sorted_data, start, end))
dic['children'] = children
for child in children:
parent_dic[child].append(did)
parent = parent_dic.get(did, [])
dic['parent'] = parent
dic['parent_num'] = len(parent) + 1
res.append(dic)
res_dic[did] = dic
out = []
out_dic = {}
for dic in res:
num_list = [1,]
order_list = []
for child in dic['children']:
num_list.append(res_dic[child]['parent_num'])
for parent in dic['parent']:
num_list.append(out_dic[parent]['num'])
order_list.append(out_dic[parent]['order_index'])
dic['num'] = max(num_list)
for i in xrange(len(order_list) + 1):
if i + 1 not in order_list:
dic['order_index'] = i + 1
break
out.append(dic)
out_dic[dic['id']] = dic
return out
if __name__ == "__main__":
from pprint import pprint
res1 = main(data1)
if res1 == res_data1:
pprint("Success1")
else:
pprint(["error1", res1])
res2 = main(data2)
if res2 == res_data2:
pprint("Success2")
else:
pprint(["error2", res2])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment