from server import * @app.route('/schedule') @register_navbar('Drehplan', icon='calendar') @mod_required def schedule(): if 'kw' not in request.args: kw=0 else: kw=int(request.args['kw']) start = date.today() - timedelta(days=date.today().weekday() -7*kw) days = [{'date': start, 'lectures': [], 'atonce':0, 'index': 0 }] earlieststart=time(23,59) latestend=time(0,0) for i in range(1,7): days.append({'date': days[i-1]['date'] + timedelta(days=1), 'atonce':0, 'index': i, 'lectures':[] }) for i in days: # date and times are burning in sqlite s = datetime.combine(i['date'],time()) e = datetime.combine(i['date'],time(23,59)) i['lectures'] = query (''' SELECT lectures.*,courses.short FROM lectures JOIN courses ON (lectures.course_id = courses.id) WHERE (time < ?) AND (time > ?) ORDER BY time ASC''' ,e,s); # sweepline to find out how many lectures overlap maxcol=0; curcol=0; freecol=[]; for l in i['lectures']: # who the hell inserts lectures with zero length?!?!? l['time_end'] = l['time']+timedelta(minutes=max(l['duration'],1)) for l in sorted([(l['time'],True,l) for l in i['lectures']] + [(l['time_end'],False,l) for l in i['lectures']],key=lambda t:(t[0],t[1])): if l[1]: curcol += 1 if curcol > maxcol: maxcol = curcol if len(freecol) == 0: freecol.append(maxcol) l[2]['schedule_col'] = freecol.pop() if earlieststart > l[0].time(): earlieststart = l[0].time() else: curcol -= 1 freecol.append(l[2]['schedule_col']) if latestend < l[0].time(): latestend = l[0].time() i['maxcol'] = max(maxcol,1) times=[] s = min(earlieststart,time(8,0)) e = max(latestend,time(19,0)) for i in range(s.hour*4,min(int((60*e.hour/15)/4)*4+5,24*4)): t = i*15 times.append(time(int(t/60),t%60)) return render_template('schedule.html',days=days,times=times,kw=kw)