diff --git a/schedule.py b/schedule.py new file mode 100755 index 0000000000000000000000000000000000000000..93f511f082b075aee34bb25ea4c9296557b49a84 --- /dev/null +++ b/schedule.py @@ -0,0 +1,57 @@ +from server import * + +@app.route('/schedule') +@register_navbar('Drehplan', '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) diff --git a/server.py b/server.py index 2f64357151377d20883f9bfb4cd23813113e9c30..dd4b172476fd880e0c531bc9c72581b57ecef68b 100755 --- a/server.py +++ b/server.py @@ -111,6 +111,10 @@ def human_semester(s, long=False): def human_date(d): return d.strftime('%d.%m.%Y') +@app.template_filter(name='time') +def human_date(d): + return d.strftime('%H:%M') + @app.template_filter() def rfc3339(d): return d.strftime('%Y-%m-%dT%H:%M:%S+02:00') @@ -122,16 +126,25 @@ def get_announcements(minlevel=0): @app.route('/') @register_navbar('Home', icon='home') def index(): - return render_template('index.html', latestvideos=query(''' - SELECT lectures.*, max(videos.time_updated) AS lastvidtime, courses.short, courses.downloadable, courses.title AS coursetitle - FROM lectures - LEFT JOIN videos ON (videos.lecture_id = lectures.id) - LEFT JOIN courses on (courses.id = lectures.course_id) - WHERE (? OR (courses.visible AND courses.listed AND lectures.visible AND videos.visible)) - GROUP BY videos.lecture_id - ORDER BY lastvidtime DESC - LIMIT 6 - ''', ismod())) + upcomming = query (''' + SELECT lectures.*,courses.short, courses.title AS course_title + FROM lectures + JOIN courses ON (lectures.course_id = courses.id) + WHERE (time > ?) + ORDER BY time ASC LIMIT 7''',datetime.today()) + for i in upcomming: + i['date'] = i['time'].date() + i['time'] = i['time'].time() + latestvideos=query(''' + SELECT lectures.*, max(videos.time_updated) AS lastvidtime, courses.short, courses.downloadable, courses.title AS coursetitle + FROM lectures + LEFT JOIN videos ON (videos.lecture_id = lectures.id) + LEFT JOIN courses on (courses.id = lectures.course_id) + WHERE (? OR (courses.visible AND courses.listed AND lectures.visible AND videos.visible)) + GROUP BY videos.lecture_id + ORDER BY lastvidtime DESC + LIMIT 6 ''',ismod()) + return render_template('index.html', latestvideos=latestvideos, upcomming=upcomming) @app.route('/course') @register_navbar('Videos', icon='film') @@ -330,62 +343,6 @@ def auth(): # For use with nginx auth_request return Response("Login required", 401, {'WWW-Authenticate': 'Basic realm="Login Required"'}) return "Not allowed", 403 -@app.route('/schedule') -@register_navbar('Drehplan', '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) - @app.route('/stats') @register_navbar('Statistiken', 'stats') @mod_required @@ -429,3 +386,4 @@ def new_announcement(): import feeds import importer +import schedule diff --git a/templates/course.html b/templates/course.html index 6417296948170e7746cfc6c11a85b3f36188aac4..1bcfc6e4e1fe97b4bbecc0016d7be77480269f7b 100644 --- a/templates/course.html +++ b/templates/course.html @@ -1,32 +1,39 @@ {% from 'macros.html' import lecture_list_item %} {% from 'macros.html' import valueeditor %} +{% from 'macros.html' import valuedeletebtn %} {% from 'macros.html' import valuecheckbox %} {% from 'macros.html' import preview %} {% extends "base.html" %} {% block content %} <div class="panel panel-default"> <div class="panel-heading"> - <h1 class="panel-title">{{ valueeditor(['courses',course.id,'title'], course.title)}}</h1> + <h1 class="panel-title">{{ valueeditor(['courses',course.id,'title'], course.title)}}<span class="pull-right">{{ valuedeletebtn(['courses',course.id,'deleted']) }}</span></h1> </div> <div class="row panel-body"> - <div class="col-xs-12"> - <table class="table-condensed"> + <div class="col-xs-12" class="table-condensed"> + <table> <tbody> <tr><td>Semester:</td><td>{{ valueeditor(['courses',course.id,'semester'], course.semester) }}</td></tr> <tr><td>Veranstalter:</td><td>{{ valueeditor(['courses',course.id,'organizer'], course.organizer) }}</td></tr> <tr><td>Bemerkungen:</td><td>{{ valueeditor(['courses',course.id,'description'], course.description) }}</td></tr> - {% if ismod() %} + </tbody> + </table> + </div> + {% if ismod() %} + <div class="col-xs-12" style="margin-top: 20px"> + <table class="table-condensed"> + <tbody> <tr><td>Sichtbar:</td><td>{{ valuecheckbox(['courses',course.id,'visible'], course.visible) }}</td></tr> <tr><td>Gelistet:</td><td>{{ valuecheckbox(['courses',course.id,'listed'], course.listed) }}</td></tr> + <tr><td>Downloadable:</td><td>{{ valuecheckbox(['courses',course.id,'downloadable'], course.downloadable) }}</td></tr> <tr><td>Short:</td><td>{{ valueeditor(['courses',course.id,'short'], course.short) }}</td></tr> <tr><td>Handle:</td><td>{{ valueeditor(['courses',course.id,'handle'], course.handle) }}</td></tr> - <tr><td>Downloadable:</td><td>{{ valuecheckbox(['courses',course.id,'downloadable'], course.downloadable) }}</td></tr> <tr><td>Thema:</td><td>{{ valueeditor(['courses',course.id,'subject'], course.subject) }}</td></tr> <tr><td>Zuständig:</td><td>{{ valueeditor(['courses',course.id,'responsible'], course.responsible) }}</td></tr> - {% endif %} </tbody> </table> </div> + {% endif %} </div> </div> <div class="panel panel-default"> diff --git a/templates/courses.html b/templates/courses.html index 980bdfd1cab2bd20e419e1ae22cf337919a97bc6..a6243d7c422e5a87605f3a70f2a119105240dd6b 100644 --- a/templates/courses.html +++ b/templates/courses.html @@ -2,7 +2,7 @@ {% extends "base.html" %} {% block content %} <div clss="row"> - <div class="row-xs-12"> + <div class="col-xs-12" style="padding: 0px;"> <ul class="list-inline pull-right"> <li> <a class="fa fa-rss-square btn btn-default" aria-hidden="true" href="{{url_for('courses_feed')}}"></a> @@ -12,7 +12,7 @@ <a class="btn btn-default" href="{{ url_for('new_course', ref=request.url) }}">Neue Veranstaltung</a> </li> {% endif %} - <li class="dropdown"> + <li class="dropdown" style="padding-right: 0px"> <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Gruppierung <span class="caret"></span> </button> diff --git a/templates/index.html b/templates/index.html index 2a341700cf8e3d233df808d136f78d56a5c799a0..654bd9330e52ad3006c6b9c6c6a5305b8ddd9f23 100644 --- a/templates/index.html +++ b/templates/index.html @@ -30,6 +30,26 @@ </div> </div> <div class="col-md-6"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h1 class="panel-title">Nächste Aufnahmen</h1"> + </div> + <ul class="list-group"> + {% for g in upcomming|groupby('date') %} + <li class="list-group-item"> + <ul class="list-group" style="margin: 0px;"> + <strong>{{ g.grouper|date }}</strong> + {% for i in g.list %} + <li class="list-group-item list-group-item-condensed"> + {{i.time|time}} {{i.place}} <a href="{{url_for('course', id=i.course_id)}}">{{i.course_title}}</a>: <a href="{{url_for('course', id=i.course_id)}}#lecture-{{i.id}}">{{i.title}}</a> + + </li> + {% endfor %} + </ul> + </li> + {% endfor %} + </ul> + </div> <div class="panel panel-default"> <div class="panel-heading"> <h1 class="panel-title">Neueste Videos <a class="fa fa-rss-square pull-right" aria-hidden="true" href="{{url_for('feed')}}"></a></h1"> diff --git a/templates/search.html b/templates/search.html index fd35fd76959c249b158ba3cb9fea49cc1a232a6d..d426b2bbfc28f7d9d8b9187fabf32c583ad7fb2f 100644 --- a/templates/search.html +++ b/templates/search.html @@ -7,7 +7,7 @@ <h1 class="panel-title">Veranstaltungen</h1> </div> {% if courses == [] %} - <div class="panel-body">Nichts gefunden!</div> + <div class="panel-body">Nichts gefunden!</div> {% else %} <ul class="list-group courselist"> {% for course in courses %} @@ -20,16 +20,14 @@ <div class="panel-heading"> <h1 class="panel-title">Videos</h1> </div> - <div class="panel-body"> - {% if lectures == [] %} - Nichts gefunden! - {% else %} - <ul class="list-group videopreview"> - {% for lecture in lectures %} - {{ preview(lecture) }} - {% endfor %} - </ul> - {% endif %} - </div> + {% if lectures == [] %} + <div class="panel-body">Nichts gefunden!</div> + {% else %} + <ul class="list-group videopreview"> + {% for lecture in lectures %} + {{ preview(lecture) }} + {% endfor %} + </ul> + {% endif %} </div> {% endblock %}