symposion_app/symposion/schedule/timetable.py

40 lines
1.2 KiB
Python
Raw Normal View History

2012-08-30 06:51:07 +00:00
import itertools
2012-08-30 06:52:50 +00:00
from symposion.schedule.models import Room, Slot
2012-08-30 06:51:07 +00:00
2012-08-30 06:53:31 +00:00
class TimeTable(object):
2012-08-30 06:51:07 +00:00
def __init__(self, day):
self.day = day
def slots_qs(self):
return Slot.objects.filter(day=self.day)
def rooms(self):
2012-08-30 06:58:16 +00:00
return Room.objects.filter(schedule=self.day.schedule).order_by("order")
2012-08-30 06:51:07 +00:00
def __iter__(self):
times = sorted(set(itertools.chain(*self.slots_qs().values_list("start", "end"))))
slots = list(self.slots_qs().order_by("start"))
row = []
for time, next_time in pairwise(times):
row = {"time": time, "slots": []}
for slot in slots:
if slot.start == time:
2012-08-30 06:53:31 +00:00
slot.rowspan = TimeTable.rowspan(times, slot.start, slot.end)
2012-08-30 07:02:49 +00:00
slot.colspan = slot.rooms.consecutive_count()
2012-08-30 06:51:07 +00:00
row["slots"].append(slot)
if row["slots"] or next_time is None:
yield row
@staticmethod
def rowspan(times, start, end):
return times.index(end) - times.index(start)
def pairwise(iterable):
a, b = itertools.tee(iterable)
b.next()
return itertools.izip_longest(a, b)