diff --git a/server.py b/server.py index a09e9d2e0f671d294c6ff1779358a8fa365ac09d..c484a929120e0eb96555c3ff957b70c3d655f509 100755 --- a/server.py +++ b/server.py @@ -1,5 +1,7 @@ #!/bin/python + from flask import * +from functools import wraps import sqlite3 import os import re @@ -44,16 +46,19 @@ def query(operation, *params): import mysql.connector if 'db' not in g or not g.db.is_connected(): g.db = mysql.connector.connect(user=config['MYSQL_USER'], password=config['MYSQL_PASSWD'], host=config['MYSQL_HOST'], database=config['MYSQL_DB']) - cur = g.db.cursor(dictionary=True) - cur.execute(operation.replace('?', '%s'), params) - return cur.fetchall() + if not hasattr(request, 'db'): + request.db = g.db.cursor(dictionary=True) + request.db.execute(operation.replace('?', '%s'), params) elif config['DB_ENGINE'] == 'sqlite': if 'db' not in g: g.db = sqlite3.connect(config['SQLITE_DB']) g.db.row_factory = dict_factory - cur = g.db.cursor() - cur.execute(operation, params) - return cur.fetchall() + if not hasattr(request, 'db'): + request.db = g.db.cursor() + request.db.execute(operation, params) + else: + return [] + return request.db.fetchall() def searchquery(text, columns, match, tables, suffix, *suffixparams): params = [] @@ -73,8 +78,12 @@ def searchquery(text, columns, match, tables, suffix, *suffixparams): return query(expr, *params, *suffixparams) LDAP_USERRE = re.compile(r'[^a-z0-9]') +notldap = { + 'videoag':('videoag', ['users','videoag'], {'uid': 'videoag', 'givenName': 'Video', 'sn': 'Geier'}), + 'gustav':('passwort', ['users'], {'uid': 'gustav', 'givenName': 'Gustav', 'sn': 'Geier'}) +} + def ldapauth(user, password): - notldap = {'videoag':('videoag', ['users','videoag']), 'gustav':('passwort', ['users'])} user = LDAP_USERRE.sub(r'', user.lower()) if 'LDAP_HOST' in config: import ldap3 @@ -91,8 +100,6 @@ def ldapauth(user, password): return None, [] def ldapget(user): - notldap = {'videoag': {'uid': 'videoag', 'givenName': 'Video', 'sn': 'Geier'}, - 'gustav': {'uid': 'gustav', 'givenName': 'Gustav', 'sn': 'Geier'}} user = LDAP_USERRE.sub(r'', user.lower()) if 'LDAP_HOST' in config: import ldap3 @@ -102,7 +109,17 @@ def ldapget(user): e = conn.entries[0] return {'uid': user, 'givenName': e.givenName.value, 'sn':e.sn.value} else: - return notldap[user] + return notldap[user][2] + +def login_required(func): + @wraps(func) + def decorator(*args, **kwargs): + if not 'user' in session: + flash('Diese Funktion ist nur für Moderatoren verfügbar!') + return redirect(url_for('login', ref=request.url)) + else: + return func(*args, **kwargs) + return decorator @app.route('/') def index(): @@ -167,8 +184,10 @@ def course(): else: return redirect(url_for('index')) -@app.route('/login', methods=['POST']) +@app.route('/login', methods=['GET', 'POST']) def login(): + if request.method == 'GET': + return render_template('login.html') user, groups = ldapauth(request.form.get('user'), request.form.get('password')) if user and 'users' in groups: session['user'] = ldapget(user) @@ -187,5 +206,28 @@ def logout(): else: return redirect(url_for('index')) +@app.route('/edit') +@login_required +def edit(): + tabs = { + 'courses': ('courses_data', 'id', ['visible', 'listed', 'title', 'short', + 'handle', 'organizer', 'subject', 'credits', 'semester', 'downloadable', + 'internal', 'responsible']), + 'lectures': ('lectures_data', 'id', ['visible', 'title', 'comment', + 'internal', 'speaker', 'place', 'time', 'duration', 'jumplist', + 'titlefile']), + 'site_texts': ('site_texts', 'key' ['value']), + 'videos': ('videos_data', 'id', ['visible', 'downloadable', 'title', + 'comment', 'internal']) + } + query('BEGIN TRANSACTION') + for key, val in request.get_json(): + table, column, id = key.split('.', 2) + assert table in tabs + assert column in tabs[table][2] + query('UPDATE %s SET %s = ? WHERE %s = ?'%(tabs[table][0], column, + tabs[table][1]), val, id) + query('COMMIT TRANSACTION') + if __name__ == '__main__': app.run() diff --git a/templates/base.html b/templates/base.html index 03d2ad1550927f7c787564d91781c016a8470dfb..db02b7e06cdd0cb9296f29e669df7f3f9585883a 100644 --- a/templates/base.html +++ b/templates/base.html @@ -5,6 +5,8 @@ ] -%} {% set active_page = active_page|default('none') -%} +{% set page_border = page_border|default(1) -%} + <!DOCTYPE html> <html> <head> @@ -94,13 +96,21 @@ </div> </nav> <div class="container-fluid"> - {% for msg in get_flashed_messages() %} - <div class="row"><div class="alert alert-danger col-xs-12" role="alert">{{ msg }}</div></div> - {% endfor %} - {% block content %} - <h1>This is a Heading</h1> - <p>This is a paragraph.</p> - {% endblock %} + <div class="row"> + {% if page_border == 0 %} + <div class="col-xs-12"> + {% else %} + <div class="col-xs-12 col-md-offset-{{ page_border }} col-md-{{ 12-(2*page_border) }}"> + {% endif %} + {% for msg in get_flashed_messages() %} + <div class="alert alert-danger" role="alert">{{ msg }}</div> + {% endfor %} + {% block content %} + <h1>This is a Heading</h1> + <p>This is a paragraph.</p> + {% endblock %} + </div> + </div> </div> </body> </html> diff --git a/templates/course.html b/templates/course.html index 247c8ada193ab5f26ce4774222496e945a9def9c..a26674f99917e27e8b7a8432796cd0bf1243ff06 100644 --- a/templates/course.html +++ b/templates/course.html @@ -2,23 +2,19 @@ {% from 'macros.html' import preview %} {% extends "base.html" %} {% block content %} -<div class="col-xs-offset-1 col-xs-10"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h1 class="panel-title">{{course.title}}</h1> - </div> +<div class="panel panel-default"> + <div class="panel-heading"> + <h1 class="panel-title">{{course.title}}</h1> </div> -<div class="col-xs-offset-1 col-xs-10"> </div> - <div class="panel panel-default"> - <div class="panel-heading"> - <h1 class="panel-title">Videos</h1> - </div> - <ul class="list-group lectureslist"> - {% for l in lectures %} - {{ lecture_list_item(l,videos|selectattr('lecture_id','equalto',l.id)|list) }} - {% endfor %} - </ul> +<div class="panel panel-default"> + <div class="panel-heading"> + <h1 class="panel-title">Videos</h1> </div> + <ul class="list-group lectureslist"> + {% for l in lectures %} + {{ lecture_list_item(l,videos|selectattr('lecture_id','equalto',l.id)|list) }} + {% endfor %} + </ul> </div> {% endblock %} diff --git a/templates/faq.html b/templates/faq.html index ee7582c38ae06b7f1cfa95fe00dd5e3e85ede1db..737585aead498893a878a5be8e17060290258425 100644 --- a/templates/faq.html +++ b/templates/faq.html @@ -2,54 +2,50 @@ {% extends "base.html" %} {% set active_page = "faq" %} {% block content %} -<div class="row"> - <div class="col-xs-10 col-xs-offset-1"> - <div class="alert alert-warning alert-dismissible" role="alert" id="kontakt"> - Unter <a href="mailto:video@fsmpi.rwth-aachen.de">video@fsmpi.rwth-aachen.de</a> stehen wir für alle Fragen bereit. - </div> +<div class="alert alert-warning alert-dismissible" role="alert" id="kontakt"> + Unter <a href="mailto:video@fsmpi.rwth-aachen.de">video@fsmpi.rwth-aachen.de</a> stehen wir für alle Fragen bereit. +</div> - <br/> +<br/> - <div class="panel-group" id="accordion"> - <div class="faqHeader">Allgemein</div> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#speed">Der Download ist zu langsam.</a> - </h4> - </div> - <div id="speed" class="panel-collapse collapse in"> - <div class="panel-body"> - <p>Wir beschränken die Downloadgeschwindigkeit nicht! Eventuell hast du im Uninetz eine bessere Anbindung.</p> - <p>Falls du unbedingt einen <strong>Download-Manager</strong> benutzen willst/musst, stelle diesen bitte so ein, dass er maximal <strong>5 gleichzeitige Verbindungen</strong> (oder auch weniger) zu unserem Videoserver benutzt.</p> - <p>Unser Server hat keine (nein, absolut keine!) Bandbreitenbegrenzung, also bekommst du schon für einen einzigen Download die volle Geschwindigkeit und wirst selbst mit solchen Programmen keine schnelleren Downloads erfahren. Zu viele Verbindungen sorgen nur für exzessive Systemlast und damit langsamere Downloads für alle, dich eingeschlossen.</p> - </div> - </div> +<div class="panel-group" id="accordion"> + <div class="faqHeader">Allgemein</div> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#speed">Der Download ist zu langsam.</a> + </h4> + </div> + <div id="speed" class="panel-collapse collapse in"> + <div class="panel-body"> + <p>Wir beschränken die Downloadgeschwindigkeit nicht! Eventuell hast du im Uninetz eine bessere Anbindung.</p> + <p>Falls du unbedingt einen <strong>Download-Manager</strong> benutzen willst/musst, stelle diesen bitte so ein, dass er maximal <strong>5 gleichzeitige Verbindungen</strong> (oder auch weniger) zu unserem Videoserver benutzt.</p> + <p>Unser Server hat keine (nein, absolut keine!) Bandbreitenbegrenzung, also bekommst du schon für einen einzigen Download die volle Geschwindigkeit und wirst selbst mit solchen Programmen keine schnelleren Downloads erfahren. Zu viele Verbindungen sorgen nur für exzessive Systemlast und damit langsamere Downloads für alle, dich eingeschlossen.</p> </div> - <div class="faqHeader">Abspielprobleme</div> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#playbackfile">Ich kann ein heruntergeladenes Video nicht abspielen.</a> - </h4> - </div> - <div id="playbackfile" class="panel-collapse collapse"> - <div class="panel-body"> - <p>Ein beliebter Videoplayer ist VLC, denn er kann so ziemlich alle üblichen Audio- und Videoformate abspielen. VLC gibt es unter <a href="https://www.videolan.org">https://www.videolan.org</a> zum Download.</p> - </div> - </div> + </div> + </div> + <div class="faqHeader">Abspielprobleme</div> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#playbackfile">Ich kann ein heruntergeladenes Video nicht abspielen.</a> + </h4> + </div> + <div id="playbackfile" class="panel-collapse collapse"> + <div class="panel-body"> + <p>Ein beliebter Videoplayer ist VLC, denn er kann so ziemlich alle üblichen Audio- und Videoformate abspielen. VLC gibt es unter <a href="https://www.videolan.org">https://www.videolan.org</a> zum Download.</p> </div> - <div class="faqHeader">Technisches</div> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#encoding">Wie encoded ihr eurere Videos?</a> - </h4> - </div> - <div id="encoding" class="panel-collapse collapse"> - <div class="panel-body"> - </div> - </div> + </div> + </div> + <div class="faqHeader">Technisches</div> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#encoding">Wie encoded ihr eurere Videos?</a> + </h4> + </div> + <div id="encoding" class="panel-collapse collapse"> + <div class="panel-body"> </div> </div> </div> diff --git a/templates/index.html b/templates/index.html index d15fe0327980cb475172f1de69314907f19c9c33..32134c5b18e6380c8dbd0ab5c05d3c9c04a382ce 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,6 +1,7 @@ {% from 'macros.html' import preview %} {% extends "base.html" %} {% set active_page = "index" %} +{% set page_border = 0 %} {% block content %} <div class="row"> <div class="col-md-6 panel-group"> diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000000000000000000000000000000000000..c885172fb9f80970749f8ca92ad4829b112aa6b6 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} +{% block content %} +<div class="panel panel-default"> + <div class="panel-heading"> + <h1 class="panel-title">Login für Moderatoren</h1> + </div> + <div class="panel-body"> + <form method="post" action="login"> + <input placeholder="User" name="user" type="text"><br> + <input placeholder="Password" name="password" type="password"><br> + {% if 'ref' in request.values %} + <input type="hidden" name="ref" value="{{ request.values.ref|e }}"> + {% endif %} + <input type="submit" value="Login"> + </form> + </div> +</div> +{% endblock %} diff --git a/templates/search.html b/templates/search.html index d2df7454118c6418d1f85824c82e25bf4a4f5bf6..fd35fd76959c249b158ba3cb9fea49cc1a232a6d 100644 --- a/templates/search.html +++ b/templates/search.html @@ -2,36 +2,34 @@ {% from 'macros.html' import preview %} {% extends "base.html" %} {% block content %} -<div class="col-xs-offset-1 col-xs-10"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h1 class="panel-title">Veranstaltungen</h1> - </div> - {% if courses == [] %} - <div class="panel-body">Nichts gefunden!</div> - {% else %} - <ul class="list-group courselist"> - {% for course in courses %} - {{ course_list_item(course,true) }} - {% endfor %} - </ul> - {% endif %} +<div class="panel panel-default"> + <div class="panel-heading"> + <h1 class="panel-title">Veranstaltungen</h1> </div> - <div class="panel panel-default"> - <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) }} + {% if courses == [] %} + <div class="panel-body">Nichts gefunden!</div> + {% else %} + <ul class="list-group courselist"> + {% for course in courses %} + {{ course_list_item(course,true) }} {% endfor %} - </ul> - {% endif %} - </div> + </ul> + {% endif %} +</div> +<div class="panel panel-default"> + <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> </div> {% endblock %} diff --git a/templates/videos.html b/templates/videos.html index cbb7e0905f9443d1c37e3383cc650ed5a1463f2d..931c1d62314809c6ae8617bac2d8c878dce2adcb 100644 --- a/templates/videos.html +++ b/templates/videos.html @@ -3,36 +3,34 @@ {% extends "base.html" %} {% block content %} -<div class="row"><div class="col-xs-offset-1 col-xs-10"> - <div class="row"> - <div class="col-xs-12 dropdown" style="margin-bottom: 10px;"> - <button class="btn btn-primary dropdown-toggle pull-right" type="button" data-toggle="dropdown">Grupierung - <span class="caret"></span></button> - <ul class="dropdown-menu"> - <li><a href="?groupedby=semester">Semester</a></li> - <li><a href="?groupedby=title">Veranstaltungen</a></li> - <li><a href="?groupedby=organizer">Dozenten</a></li> - </ul> - </div> +<div class="row"> + <div class="col-xs-12 dropdown" style="margin-bottom: 10px;"> + <button class="btn btn-primary dropdown-toggle pull-right" type="button" data-toggle="dropdown">Gruppierung + <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right"> + <li><a href="?groupedby=semester">Semester</a></li> + <li><a href="?groupedby=title">Veranstaltungen</a></li> + <li><a href="?groupedby=organizer">Dozenten</a></li> + </ul> + </div> +</div> +{% for g in courses|groupby(groupedby)|reverse %} +<div class="row panel-group"> + <div class="col-xs-12"><div class="panel panel-default"> + <div class="panel-heading"> + <h1 class="panel-title">{{g.grouper}}</h1> </div> - {% for g in courses|groupby(groupedby)|reverse %} - <div class="row panel-group"> - <div class="col-xs-12"><div class="panel panel-default"> - <div class="panel-heading"> - <h1 class="panel-title">{{g.grouper}}</h1> - </div> - <ul class="courses-list list-group"> - {% for i in g.list %} - {% if groupedby == 'semester' %} - {{ course_list_item(i) }} - {% else %} - {{ course_list_item(i,true) }} - {% endif %} - {% endfor %} - </ul> - </div></div> - </div> - {% endfor %} -</div></div> + <ul class="courses-list list-group"> + {% for i in g.list %} + {% if groupedby == 'semester' %} + {{ course_list_item(i) }} + {% else %} + {{ course_list_item(i,true) }} + {% endif %} + {% endfor %} + </ul> + </div></div> +</div> +{% endfor %} {% endblock %}