diff --git a/server.py b/server.py index 1d8ab62f6c72b9b32bb722682d170ea7e61fc1c6..8138ac56e92f9f45d055ce96e643d03cc991a591 100755 --- a/server.py +++ b/server.py @@ -6,6 +6,7 @@ import datetime import sqlite3 import os import re +from datetime import date, timedelta, datetime as dt, time app = Flask(__name__) config = app.config @@ -288,7 +289,40 @@ def auth(): # For use with nginx auth_request @app.route('/schedule') def schedule(): - return render_template('schedule.html') + start = date.today() - timedelta(days=date.today().weekday()+7*20) + days = [{'date': start, 'lectures': [], 'atonce':0 }] + for i in range(1,7): + days.append({'date': days[i-1]['date'] + timedelta(days=1), 'lectures':[], 'atonce':0 }) + for i in days: + # date and times are burning in sqlite + s = dt.combine(i['date'],time()) + e = dt.combine(i['date'],time(23,59)) + i['lectures'] = query ('SELECT lectures.*,courses.* 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']: + l['time_asdate'] = dt.strptime(l['time'],'%Y-%m-%d %H:%M:%S') + l['end_asdate'] = l['time_asdate']+timedelta(minutes=l['duration']) + for l in sorted([(l['time_asdate'],True,l) for l in i['lectures']] + [(l['end_asdate'],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() + else: + curcol -= 1 + freecol.append(l[2]['schedule_col']) + i['maxcol'] = max(maxcol,1) + times=[] + for i in range(0,int(60*24/15)): + t = i*15 + times.append(time(int(t/60),t%60)) + + return render_template('schedule.html',days=days,times=times) if __name__ == '__main__': app.run(threaded=True) diff --git a/templates/schedule.html b/templates/schedule.html index e82c9e580e1d3c74ae6d16b9c8d2ced7b7683e39..e00fcdc8eeaa27c819d9cc7d8779597d3cf851d7 100644 --- a/templates/schedule.html +++ b/templates/schedule.html @@ -1,4 +1,3 @@ -{% from 'macros.html' import preview %} {% extends "base.html" %} {% set active_page = "schedule" %} {% block content %} @@ -7,7 +6,28 @@ <div class="panel-heading"> <h1 class="panel-title">Drehplan</h1> </div> - <div> + <div class="panel-body row"> + <table class="table-bordered col-xs-12"> + <tr><th></th>{% for d in days %}<th colspan="{{d.maxcol}}">{{ d.date.strftime("%A (%d.%m.%Y)") }}</th>{% endfor %}</tr> + {% for t in times %} + {% set time_loop = loop %} + <tr height="10px"> + {% if ((loop.index - 1) is divisibleby 4) %} <td rowspan=4>{{ t }}</td> {% endif %} + {% for d in days %} + {% for i in range(1,d.maxcol+1) %} + {% for l in d.lectures|selectattr('schedule_col','equalto',i) if (((l.time_asdate.time() > t) and (l.time_asdate.time() < times[time_loop.index+1])) != (l.time_asdate.time() == t ) ) %} + <td rowspan="{{l.duration / 15}}" style="background: red;">{{l.handle}}</td> + {% else %} + {% for l in d.lectures|selectattr('schedule_col','equalto',i) if (l.time_asdate.time() < t) and (l.end_asdate.time() > t) %} + {% else %} + <td></td> + {% endfor %} + {% endfor %} + {% endfor %} + {% endfor %} + </tr> + {% endfor %} + </table> </div> </div> </div>