Files
@ b833b7d8695a
Branch filter:
Location: symposion_app/vendor/symposion/schedule/timetable.py - annotation
b833b7d8695a
1.6 KiB
text/x-python
Order slots by room order first
* lca2018 has a situation where we have multiple slots starting at the
same time, but ending at different times
* The headers of the timetable grid are sorted by room sort order
* In sqlite at least, ordering by start,order seems to implicitly
resolve duplicate start times by looking at the other sort fields
first, and will only sort on order if all other fields are identical
* This results in the slot that ends first going in column 1, which
gets out of sync with the room listed in the header
* I can't figure out how to solve this in the database, so...
* Force the slots to be sorted by room order.
* Then, for each start_time, select out slots starting at that time
and operate on them
* This both gets the slots in the right order *and* keeps multi-room
slots with the right colspan. Yay!
* It's possible that this wouldn't be needed on some DBs which might
do the sorting differently.
* lca2018 has a situation where we have multiple slots starting at the
same time, but ending at different times
* The headers of the timetable grid are sorted by room sort order
* In sqlite at least, ordering by start,order seems to implicitly
resolve duplicate start times by looking at the other sort fields
first, and will only sort on order if all other fields are identical
* This results in the slot that ends first going in column 1, which
gets out of sync with the room listed in the header
* I can't figure out how to solve this in the database, so...
* Force the slots to be sorted by room order.
* Then, for each start_time, select out slots starting at that time
and operate on them
* This both gets the slots in the right order *and* keeps multi-room
slots with the right colspan. Yay!
* It's possible that this wouldn't be needed on some DBs which might
do the sorting differently.
f3e9cc9a5db3 f3e9cc9a5db3 b7e8e7da8cb3 2c954c3a055b 2c954c3a055b 7601791e8cd0 f3e9cc9a5db3 14f43da962a8 36ab6d599ffc f3e9cc9a5db3 f3e9cc9a5db3 36ab6d599ffc f3e9cc9a5db3 2c954c3a055b 2c954c3a055b 2c954c3a055b 36ab6d599ffc f3e9cc9a5db3 2c954c3a055b 2c954c3a055b 36ab6d599ffc 36ab6d599ffc 2c954c3a055b 2c954c3a055b 36ab6d599ffc f3e9cc9a5db3 f3e9cc9a5db3 b7e8e7da8cb3 b7e8e7da8cb3 b833b7d8695a f3e9cc9a5db3 4838adf7758c f3e9cc9a5db3 f3e9cc9a5db3 b833b7d8695a b833b7d8695a b833b7d8695a b833b7d8695a b833b7d8695a f3e9cc9a5db3 f3e9cc9a5db3 36ab6d599ffc f3e9cc9a5db3 f3e9cc9a5db3 f3e9cc9a5db3 f3e9cc9a5db3 f3e9cc9a5db3 f3e9cc9a5db3 f3e9cc9a5db3 183dea0b6e51 183dea0b6e51 | import itertools
from django.db.models import Count, Min
from symposion.schedule.models import Room, Slot, SlotRoom
class TimeTable(object):
def __init__(self, day):
self.day = day
def slots_qs(self):
qs = Slot.objects.all()
qs = qs.filter(day=self.day)
return qs
def rooms(self):
qs = Room.objects.all()
qs = qs.filter(schedule=self.day.schedule)
qs = qs.filter(
pk__in=SlotRoom.objects.filter(slot__in=self.slots_qs().values("pk")).values("room"))
qs = qs.order_by("order")
return qs
def __iter__(self):
times = sorted(set(itertools.chain(*self.slots_qs().values_list("start", "end"))))
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")
row = []
total_room_count = self.rooms().count()
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)
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)
next(b)
return itertools.zip_longest(a, b)
|