diff --git a/planning/utils.py b/planning/utils.py index da3d071..4c8fe60 100644 --- a/planning/utils.py +++ b/planning/utils.py @@ -32,39 +32,51 @@ class Program: else: self.rooms = Room.objects.filter(talk__in=self.talks.all()).order_by('name').distinct() - self.timeslots = [] + self.days = {} for talk in self.talks.all(): duration = talk.estimated_duration() assert(duration) - d1 = talk.start_date - d2 = d1 + timedelta(minutes=duration) - if d1 not in self.timeslots: - self.timeslots.append(d1) - if d2 not in self.timeslots: - self.timeslots.append(d2) - self.timeslots = sorted(self.timeslots) + dt1 = talk.start_date + d1 = localtime(dt1).date() + if d1 not in self.days.keys(): + self.days[d1] = {'timeslots': []} + dt2 = dt1 + timedelta(minutes=duration) + d2 = localtime(dt2).date() + if d2 not in self.days.keys(): + self.days[d2] = {'timeslots': []} + if dt1 not in self.days[d1]['timeslots']: + self.days[d1]['timeslots'].append(dt1) + if dt2 not in self.days[d2]['timeslots']: + self.days[d2]['timeslots'].append(dt2) self.cols = OrderedDict([(room, 1) for room in self.rooms]) - self.rows = OrderedDict([(timeslot, OrderedDict([(room, []) for room in self.rooms])) for timeslot in self.timeslots[:-1]]) + for day in self.days.keys(): + self.days[day]['timeslots'] = sorted(self.days[day]['timeslots']) + self.days[day]['rows'] = OrderedDict([(timeslot, OrderedDict([(room, []) for room in self.rooms])) for timeslot in self.days[day]['timeslots'][:-1]]) for talk in self.talks.all(): self._add_talk(talk) def _add_talk(self, talk): room = talk.room - d1 = self.timeslots.index(talk.start_date) - d2 = self.timeslots.index(talk.start_date + timedelta(minutes=talk.estimated_duration())) + dt1 = talk.start_date + d1 = localtime(dt1).date() + dt2 = talk.start_date + timedelta(minutes=talk.estimated_duration()) + d2 = localtime(dt2).date() + assert(d1 == d2) # this is a current limitation + dt1 = self.days[d1]['timeslots'].index(dt1) + dt2 = self.days[d1]['timeslots'].index(dt2) col = None - for row, timeslot in enumerate(islice(self.timeslots, d1, d2)): + for row, timeslot in enumerate(islice(self.days[d1]['timeslots'], dt1, dt2)): if col is None: col = 0 - while col < len(self.rows[timeslot][room]) and self.rows[timeslot][room][col]: + while col < len(self.days[d1]['rows'][timeslot][room]) and self.days[d1]['rows'][timeslot][room][col]: col += 1 self.cols[room] = max(self.cols[room], col+1) - event = Event(talk=talk, row=row, rowcount=d2-d1) - while len(self.rows[timeslot][room]) <= col: - self.rows[timeslot][room].append(None) - self.rows[timeslot][room][col] = event + event = Event(talk=talk, row=row, rowcount=dt2-dt1) + while len(self.days[d1]['rows'][timeslot][room]) <= col: + self.days[d1]['rows'][timeslot][room].append(None) + self.days[d1]['rows'][timeslot][room][col] = event def _header(self): output = '