-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtalks.py
109 lines (88 loc) · 4.01 KB
/
talks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import os
import json
from datetime import datetime, timedelta
import config as cfg
# talks_path = "%s%s" % (os.path.dirname(os.path.abspath(__file__)), "/static/data/clean-talks.json")
# talks_path = "%s%s" % (os.path.dirname(os.path.abspath(__file__)), "/static/data/accepted_talks.json")
talks_path = cfg.TALKS_PATH
class Talks(object):
raw_talks = None
time_based_talks = {}
room_based_talks = {}
def __init__(self):
self.raw_talks = json.loads(open(talks_path, "r").read())
if not self.time_based_talks:
self.build_time_based_dict()
if not self.room_based_talks:
self.build_room_based_dict()
def build_time_based_dict(self):
for key, value in self.raw_talks.items():
for k, v in value.items():
# apparently there are some unset timerange keys
time_range = v.get('timerange') or None
if time_range is not None:
exists = self.time_based_talks.get(time_range)
if exists is None:
self.time_based_talks[time_range] = []
v.update({'talk_type': key})
self.time_based_talks[time_range].append(v)
def build_room_based_dict(self):
for key, value in self.raw_talks.items():
for k, v in value.items():
room = v.get('track_title') or None
if room:
exists = self.room_based_talks.get(room)
if exists is None:
self.room_based_talks[room] = []
v.update({'talk_type': key})
self.room_based_talks[room].append(v)
def filter_talks_by_time(self, time_obj):
items = self.time_based_talks.keys()
current_talks = []
next_talks = []
for item in items:
start, end = item.split(",")
talk_start = datetime.strptime(start.strip(), '%Y-%m-%d %H:%M:%S')
talk_end = datetime.strptime(end.strip(), '%Y-%m-%d %H:%M:%S')
next_timeframe = talk_end + timedelta(hours=1.5)
if talk_start <= time_obj <= talk_end:
current_talks.extend([i for i in self.time_based_talks[item]])
if talk_end <= time_obj <= next_timeframe:
next_talks.extend([i for i in self.time_based_talks[item]])
return current_talks, next_talks
def filter_talks_by_room(self, time_obj):
talks = {}
for key, value in self.room_based_talks.items():
room = talks.get(key)
if room is None:
talks[key] = {}
talks[key]['current'] = []
talks[key]['next'] = []
for v in value:
time_range = v.get('timerange')
if time_range:
timeranges = v.get('timerange').split(",")
if len(timeranges) > 2:
start, end = timeranges[0], timeranges[-1]
else:
start, end = timeranges
talk_start = datetime.strptime(start.strip(), '%Y-%m-%d %H:%M:%S')
talk_end = datetime.strptime(end.strip(), '%Y-%m-%d %H:%M:%S')
v['start_hour'] = talk_start.strftime("%H:%M")
v['start'] = talk_start
v['end'] = talk_end
next_timeframe = talk_end + timedelta(hours=1.5)
if talk_start <= time_obj <= talk_end:
talks[key]['current'].append(v)
continue
if talk_end <= time_obj <= next_timeframe:
talks[key]['next'].append(v)
return talks
def get_current(self, time_obj):
cur = []
for key, talk in self.filter_talks_by_room(time_obj).items():
if talk['current']:
cur.append(talk['current'])
return cur
def get_one_room(self, room, time_obj):
return self.filter_talks_by_room(time_obj)[room]