From 7abb816f2dc79bc9dca35f8de8a40efdc27641ba Mon Sep 17 00:00:00 2001 From: Andreas <andreasv@fsmpi.rwth-aachen.de> Date: Sat, 20 May 2017 17:29:56 +0200 Subject: [PATCH] added ical export (no gui integration), closes #42 --- config.py.example | 1 + icalexport.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++ server.py | 1 + 3 files changed, 62 insertions(+) create mode 100644 icalexport.py diff --git a/config.py.example b/config.py.example index 8e2c4b7..8c6ba8d 100644 --- a/config.py.example +++ b/config.py.example @@ -28,3 +28,4 @@ LDAP_PORT = 636 #ICAL_URL = 'https://user:password@mail.fsmpi.rwth-aachen.de/SOGo/....ics' ERROR_PAGE = 'static/500.html' RWTH_IP_RANGES = ['134.130.0.0/16', '137.226.0.0/16', '134.61.0.0/16', '192.35.229.0/24', '2a00:8a60::/32'] +FSMPI_IP_RANGES = [] diff --git a/icalexport.py b/icalexport.py new file mode 100644 index 0000000..f669d0f --- /dev/null +++ b/icalexport.py @@ -0,0 +1,60 @@ +from server import * +import icalendar +from werkzeug.datastructures import Headers +from datetime import timedelta + +def export_lectures(lectures, name): + cal = icalendar.Calendar() + cal.add('prodid', '-//Video AG//rwth.video//') + cal.add('version', '1.0') + + courses = {}; + for l in lectures: + event = icalendar.Event() + if not l['course_id'] in courses: + courses[l['course_id']] = query('SELECT * from courses WHERE id = ?',l['course_id'])[0] + c = courses[l['course_id']] + + event.add('summary', c['short']+' : '+l['title']) + event.add('description', l['internal']) + event.add('comment', l['comment']) + event.add('categories', c['short']) + event.add('dtstart', l['time']) + event.add('location', l['place']) + event.add('dtend', l['time'] + timedelta(minutes=l['duration'])) + cal.add_component(event) + + H = Headers() + H.add_header("Content-Disposition", "inline", filename=name) + return Response(cal.to_ical(), mimetype="text/calendar", headers=H) + +def calperm(func): + @wraps(func) + def decorator(*args, **kwargs): + permission = ismod() + if 'X-Real-IP' in request.headers: + ip = ip_address(request.headers['X-Real-IP']) + for net in config['FSMPI_IP_RANGES']: + if ip in ip_network(net): + permission = True + if permission: + return func(*args, **kwargs) + else: + flash('Diese Funktion ist nur aus dem FSMPI-Netz(für SOGO-Import) oder eingeloggt verfügbar!') + return redirect(url_for('index')) + return decorator + +@app.route('/internal/ical/semester/<semester>') +@calperm +def ical_semester(semester): + return export_lectures(query('SELECT lectures.* FROM lectures JOIN courses ON courses.id = lectures.course_id WHERE courses.semester = ? AND lectures.visible = 1', semester),'videoag_semester_'+semester+'.ics') + +@app.route('/internal/ical/all') +@calperm +def ical_all(): + return export_lectures(query('SELECT lectures.* FROM lectures lectures.visible = 1', semester),'videoag_all.ics') + +@app.route('/internal/ical/handle/<course>') +@calperm +def ical_course(course): + return export_lectures(query('SELECT lectures.* FROM lectures JOIN handles ON courses.id = lectures.course_id WHERE courses.handle = ? AND lectures.visible = 1', course),'videoag_course_'+course+'.ics') diff --git a/server.py b/server.py index bf47cdd..7f78f61 100644 --- a/server.py +++ b/server.py @@ -681,3 +681,4 @@ if 'JOBS_API_KEY' in config: import jobs import timetable import chapters +import icalexport -- GitLab