symposion_app/vendor/symposion/schedule/timetable.py

52 lines
1.6 KiB
Python
Raw Normal View History

2012-08-30 06:51:07 +00:00
import itertools
2012-09-20 02:48:54 +00:00
from django.db.models import Count, Min
from symposion.schedule.models import Room, Slot, SlotRoom
2012-08-30 06:52:50 +00:00
2012-08-30 06:51:07 +00:00
2012-08-30 06:53:31 +00:00
class TimeTable(object):
2014-07-30 18:19:26 +00:00
2012-08-30 06:51:07 +00:00
def __init__(self, day):
self.day = day
2014-07-30 18:19:26 +00:00
2012-08-30 06:51:07 +00:00
def slots_qs(self):
qs = Slot.objects.all()
qs = qs.filter(day=self.day)
return qs
2014-07-30 18:19:26 +00:00
2012-08-30 06:51:07 +00:00
def rooms(self):
qs = Room.objects.all()
qs = qs.filter(schedule=self.day.schedule)
2014-07-30 18:19:26 +00:00
qs = qs.filter(
pk__in=SlotRoom.objects.filter(slot__in=self.slots_qs().values("pk")).values("room"))
qs = qs.order_by("order")
return qs
2014-07-30 18:19:26 +00:00
2012-08-30 06:51:07 +00:00
def __iter__(self):
times = sorted(set(itertools.chain(*self.slots_qs().values_list("start", "end"))))
2012-09-20 02:48:54 +00:00
slots = Slot.objects.filter(pk__in=self.slots_qs().values("pk"))
slots = slots.annotate(room_count=Count("slotroom"), order=Min("slotroom__room__order"))
slots = slots.order_by("order")
2012-08-30 06:51:07 +00:00
row = []
total_room_count = self.rooms().count()
2012-08-30 06:51:07 +00:00
for time, next_time in pairwise(times):
row = {"time": time, "slots": []}
row_slots = [ slot for slot in slots if slot.start == time]
for slot in row_slots:
slot.rowspan = TimeTable.rowspan(times, slot.start, slot.end)
slot.colspan = slot.room_count if not slot.exclusive else total_room_count
row["slots"].append(slot)
2012-08-30 06:51:07 +00:00
if row["slots"] or next_time is None:
yield row
2014-07-30 18:19:26 +00:00
2012-08-30 06:51:07 +00:00
@staticmethod
def rowspan(times, start, end):
return times.index(end) - times.index(start)
2012-08-30 06:51:07 +00:00
def pairwise(iterable):
a, b = itertools.tee(iterable)
next(b)
return itertools.zip_longest(a, b)