|
@@ -115,6 +115,7 @@ def get_talk_data(talkname):
|
|
|
return None
|
|
|
try:
|
|
|
gridstep = pelican.settings['TALKS_GRID_STEP']
|
|
|
+ data.setdefault('nooverlap', [])
|
|
|
if 'title' not in data:
|
|
|
logging.warn("Talk <{}> has no `title` field".format(talkname))
|
|
|
data['title'] = talkname
|
|
@@ -169,6 +170,45 @@ def get_talk_data(talkname):
|
|
|
raise
|
|
|
|
|
|
|
|
|
+def overlap(interval_a, interval_b):
|
|
|
+ '''how many minutes do they overlap?'''
|
|
|
+ return max(0, min(interval_a[1], interval_b[1]) - max(interval_a[0], interval_b[0]))
|
|
|
+
|
|
|
+
|
|
|
+def get_talk_overlaps(name):
|
|
|
+ data = get_talk_data(name)
|
|
|
+ overlapping_talks = set()
|
|
|
+ if 'time' not in data:
|
|
|
+ return overlapping_talks
|
|
|
+ start = int(data['time'].strftime('%s'))
|
|
|
+ end = start + data['duration'] * 60
|
|
|
+ for other in get_talk_names():
|
|
|
+ if other == name:
|
|
|
+ continue
|
|
|
+ if 'time' not in get_talk_data(other):
|
|
|
+ continue
|
|
|
+ other_start = int(get_talk_data(other)['time'].strftime('%s'))
|
|
|
+ other_end = other_start + get_talk_data(other)['duration'] * 60
|
|
|
+
|
|
|
+ minutes = overlap((start, end), (other_start, other_end))
|
|
|
+ if minutes > 0:
|
|
|
+ overlapping_talks.add(other)
|
|
|
+ return overlapping_talks
|
|
|
+
|
|
|
+
|
|
|
+@memoize
|
|
|
+def check_overlaps():
|
|
|
+ for t in get_talk_names():
|
|
|
+ over = get_talk_overlaps(t)
|
|
|
+ noover = get_talk_data(t)['nooverlap']
|
|
|
+ contacts = set(get_talk_data(t)['contacts'])
|
|
|
+ for overlapping in over:
|
|
|
+ if overlapping in noover or \
|
|
|
+ set(get_talk_data(overlapping)['contacts']).\
|
|
|
+ intersection(contacts):
|
|
|
+ logging.warning('Talk %s overlaps with %s' % (t, overlapping))
|
|
|
+
|
|
|
+
|
|
|
@memoize
|
|
|
def jinja_env():
|
|
|
env = jinja2.Environment(
|
|
@@ -358,6 +398,7 @@ class TalksGenerator(generators.Generator):
|
|
|
def generate_context(self):
|
|
|
self.talks = {n: get_talk_data(n) for n in get_talk_names()}
|
|
|
self._update_context(('talks',))
|
|
|
+ check_overlaps()
|
|
|
|
|
|
def generate_output(self, writer=None):
|
|
|
for talkname in sorted(self.talks):
|